528 lines
31 KiB
C++
528 lines
31 KiB
C++
|
|
// OpenAI, Copyright LifeEXE. All Rights Reserved.
|
||
|
|
|
||
|
|
#if WITH_AUTOMATION_TESTS
|
||
|
|
|
||
|
|
#include "CoreMinimal.h"
|
||
|
|
#include "Misc/AutomationTest.h"
|
||
|
|
#include "FuncLib/OpenAIFuncLib.h"
|
||
|
|
#include "FuncLib/FileSystemFuncLib.h"
|
||
|
|
#include "Provider/RequestTypes.h"
|
||
|
|
#include "TestUtils.h"
|
||
|
|
|
||
|
|
DEFINE_SPEC(FOpenAIFuncLib, "OpenAI",
|
||
|
|
EAutomationTestFlags::ApplicationContextMask | EAutomationTestFlags::ProductFilter | EAutomationTestFlags::HighPriority);
|
||
|
|
|
||
|
|
void FOpenAIFuncLib::Define()
|
||
|
|
{
|
||
|
|
Describe("OpenAIFuncLib",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
It("AllModelToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::Whisper_1).Equals("whisper-1"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_3_5_Turbo_0301).Equals("gpt-3.5-turbo-0301"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_3_5_Turbo).Equals("gpt-3.5-turbo"));
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_3_5_Turbo_16k_0613).Equals("gpt-3.5-turbo-16k-0613"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_3_5_Turbo_16k).Equals("gpt-3.5-turbo-16k"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_3_5_Turbo_0613).Equals("gpt-3.5-turbo-0613"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_3_5_Turbo_Instruct_0914)
|
||
|
|
.Equals("gpt-3.5-turbo-instruct-0914"));
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_3_5_Turbo_Instruct).Equals("gpt-3.5-turbo-instruct"));
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::Text_Embedding_Ada_002).Equals("text-embedding-ada-002"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4).Equals("gpt-4"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4_0314).Equals("gpt-4-0314"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4_0613).Equals("gpt-4-0613"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::DALL_E_2).Equals("dall-e-2"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::DALL_E_3).Equals("dall-e-3"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4_1106_Preview).Equals("gpt-4-1106-preview"));
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4_Vision_Preview).Equals("gpt-4-vision-preview"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_3_5_Turbo_1106).Equals("gpt-3.5-turbo-1106"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::TTS_1).Equals("tts-1"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::TTS_1_HD).Equals("tts-1-hd"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::TTS_1_1106).Equals("tts-1-1106"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::TTS_1_HD_1106).Equals("tts-1-hd-1106"));
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::Text_Embedding_3_Large).Equals("text-embedding-3-large"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4_32K_0314).Equals("gpt-4-32k-0314"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_3_5_Turbo_0125).Equals("gpt-3.5-turbo-0125"));
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::Text_Embedding_3_Small).Equals("text-embedding-3-small"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4_0125_Preview).Equals("gpt-4-0125-preview"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4_Turbo_Preview).Equals("gpt-4-turbo-preview"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4O_2024_05_13).Equals("gpt-4o-2024-05-13"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4O).Equals("gpt-4o"));
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4_Turbo_2024_04_09).Equals("gpt-4-turbo-2024-04-09"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4_Turbo).Equals("gpt-4-turbo"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAllModelToString(EAllModelEnum::GPT_4_1106_Vision_Preview)
|
||
|
|
.Equals("gpt-4-1106-vision-preview"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIMainModelToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIMainModelToString(EMainModelEnum::GPT_3_5_Turbo_0301).Equals("gpt-3.5-turbo-0301"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIMainModelToString(EMainModelEnum::GPT_3_5_Turbo).Equals("gpt-3.5-turbo"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIMainModelToString(EMainModelEnum::GPT_4O).Equals("gpt-4o"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIMainModelToString(EMainModelEnum::GPT_4).Equals("gpt-4"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIMainModelToString(EMainModelEnum::GPT_4_0314).Equals("gpt-4-0314"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIMainModelToString(EMainModelEnum::GPT_4_0613).Equals("gpt-4-0613"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIMainModelToString(EMainModelEnum::GPT_4_1106_Preview).Equals("gpt-4-1106-preview"));
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::OpenAIMainModelToString(EMainModelEnum::GPT_4_Vision_Preview).Equals("gpt-4-vision-preview"));
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::OpenAIMainModelToString(EMainModelEnum::GPT_3_5_Turbo_Instruct).Equals("gpt-3.5-turbo-instruct"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIModerationModelToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIModerationModelToString(EModerationsModelEnum::Text_Moderation_Latest)
|
||
|
|
.Equals("text-moderation-latest"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIModerationModelToString(EModerationsModelEnum::Text_Moderation_Stable)
|
||
|
|
.Equals("text-moderation-stable"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIAudioModelToStringShouldReturnCorrectValue",
|
||
|
|
[this]() { TestTrueExpr(UOpenAIFuncLib::OpenAIAudioModelToString(EAudioModel::Whisper_1).Equals("whisper-1")); });
|
||
|
|
|
||
|
|
It("OpenAITTSModelToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAITTSModelToString(ETTSModel::TTS_1).Equals("tts-1"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAITTSModelToString(ETTSModel::TTS_1_HD).Equals("tts-1-hd"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIVoiceToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIVoiceToString(EVoice::Alloy).Equals("alloy"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIVoiceToString(EVoice::Echo).Equals("echo"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIVoiceToString(EVoice::Fable).Equals("fable"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIVoiceToString(EVoice::Nova).Equals("nova"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIVoiceToString(EVoice::Onyx).Equals("onyx"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIVoiceToString(EVoice::Shimmer).Equals("shimmer"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAITTSAudioFormatToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAITTSAudioFormatToString(ETTSAudioFormat::AAC).Equals("aac"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAITTSAudioFormatToString(ETTSAudioFormat::FLAC).Equals("flac"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAITTSAudioFormatToString(ETTSAudioFormat::MP3).Equals("mp3"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAITTSAudioFormatToString(ETTSAudioFormat::OPUS).Equals("opus"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIImageModelToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageModelToString(EImageModelEnum::DALL_E_2).Equals("dall-e-2"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageModelToString(EImageModelEnum::DALL_E_3).Equals("dall-e-3"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("StringToOpenAIImageModelShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageModel("dall-e-2") == EImageModelEnum::DALL_E_2);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageModel("dall-e-3") == EImageModelEnum::DALL_E_3);
|
||
|
|
});
|
||
|
|
|
||
|
|
It("StringToOpenAIImageSizeDalle2ShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageSizeDalle2("256x256") == EImageSizeDalle2::Size_256x256);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageSizeDalle2("512x512") == EImageSizeDalle2::Size_512x512);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageSizeDalle2("1024x1024") == EImageSizeDalle2::Size_1024x1024);
|
||
|
|
});
|
||
|
|
|
||
|
|
It("StringToOpenAIImageSizeDalle3ShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageSizeDalle3("1024x1024") == EImageSizeDalle3::Size_1024x1024);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageSizeDalle3("1024x1792") == EImageSizeDalle3::Size_1024x1792);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageSizeDalle3("1792x1024") == EImageSizeDalle3::Size_1792x1024);
|
||
|
|
});
|
||
|
|
|
||
|
|
It("StringToOpenAIImageFormatShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageFormat("url") == EOpenAIImageFormat::URL);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageFormat("b64_json") == EOpenAIImageFormat::B64_JSON);
|
||
|
|
});
|
||
|
|
|
||
|
|
It("StringToOpenAIImageQualityShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageQuality("hd") == EOpenAIImageQuality::HD);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageQuality("standard") == EOpenAIImageQuality::Standard);
|
||
|
|
});
|
||
|
|
|
||
|
|
It("StringToOpenAIImageStyleShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageStyle("natural") == EOpenAIImageStyle::Natural);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIImageStyle("vivid") == EOpenAIImageStyle::Vivid);
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIImageSizeDalle2ToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageSizeDalle2ToString(EImageSizeDalle2::Size_256x256).Equals("256x256"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageSizeDalle2ToString(EImageSizeDalle2::Size_512x512).Equals("512x512"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageSizeDalle2ToString(EImageSizeDalle2::Size_1024x1024).Equals("1024x1024"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIImageSizeDalle3ToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageSizeDalle3ToString(EImageSizeDalle3::Size_1024x1024).Equals("1024x1024"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageSizeDalle3ToString(EImageSizeDalle3::Size_1024x1792).Equals("1024x1792"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageSizeDalle3ToString(EImageSizeDalle3::Size_1792x1024).Equals("1792x1024"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIImageFormatToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageFormatToString(EOpenAIImageFormat::URL).Equals("url"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageFormatToString(EOpenAIImageFormat::B64_JSON).Equals("b64_json"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIImageStyleToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageStyleToString(EOpenAIImageStyle::Natural).Equals("natural"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageStyleToString(EOpenAIImageStyle::Vivid).Equals("vivid"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIImageQualityToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageQualityToString(EOpenAIImageQuality::HD).Equals("hd"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIImageQualityToString(EOpenAIImageQuality::Standard).Equals("standard"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIRoleToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIRoleToString(ERole::System).Equals("system"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIRoleToString(ERole::User).Equals("user"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIRoleToString(ERole::Assistant).Equals("assistant"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIRoleToString(ERole::Function).Equals("function"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIRoleToString(ERole::Tool).Equals("tool"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("StringToOpenAIRoleShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIRole("system") == ERole::System);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIRole("user") == ERole::User);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIRole("assistant") == ERole::Assistant);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIRole("function") == ERole::Function);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIRole("tool") == ERole::Tool);
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIFinishReasonToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIFinishReasonToString(EOpenAIFinishReason::Stop).Equals("stop"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIFinishReasonToString(EOpenAIFinishReason::Length).Equals("length"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIFinishReasonToString(EOpenAIFinishReason::Tool_Calls).Equals("tool_calls"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIFinishReasonToString(EOpenAIFinishReason::Content_Filter).Equals("content_filter"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIFinishReasonToString(EOpenAIFinishReason::Null).Equals(""));
|
||
|
|
});
|
||
|
|
It("StringToOpenAIFinishReasonShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIFinishReason("stop") == EOpenAIFinishReason::Stop);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIFinishReason("length") == EOpenAIFinishReason::Length);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIFinishReason("tool_calls") == EOpenAIFinishReason::Tool_Calls);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIFinishReason("content_filter") == EOpenAIFinishReason::Content_Filter);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToOpenAIFinishReason("") == EOpenAIFinishReason::Null);
|
||
|
|
});
|
||
|
|
|
||
|
|
It("APITokensCanBeLoadedFromFile",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
const FString FilePath = OpenAI::Tests::TestUtils::FileFullPath("OpenAIAuth.ini");
|
||
|
|
const FOpenAIAuth Auth = UOpenAIFuncLib::LoadAPITokensFromFile(FilePath);
|
||
|
|
TestTrueExpr(Auth.APIKey.Equals("sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
|
||
|
|
TestTrueExpr(Auth.OrganizationID.Equals("org-xxxxxxxxxxxxxxxxxxxxxxxx"));
|
||
|
|
TestTrueExpr(Auth.ProjectID.Equals("proj_xxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIAudioTranscriptToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAudioTranscriptToString(ETranscriptFormat::JSON).Equals("json"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAudioTranscriptToString(ETranscriptFormat::Text).Equals("text"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAudioTranscriptToString(ETranscriptFormat::Str).Equals("str"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAudioTranscriptToString(ETranscriptFormat::Verbose_JSON).Equals("verbose_json"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIAudioTranscriptToString(ETranscriptFormat::Vtt).Equals("vtt"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIEmbeddingsEncodingFormatToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIEmbeddingsEncodingFormatToString(EEmbeddingsEncodingFormat::Float).Equals("float"));
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::OpenAIEmbeddingsEncodingFormatToString(EEmbeddingsEncodingFormat::Base64).Equals("base64"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIChatResponseFormatToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIChatResponseFormatToString(EChatResponseFormat::Text).Equals("text"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIChatResponseFormatToString(EChatResponseFormat::JSON_Object).Equals("json_object"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIModelToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
FOpenAIModel OpenAIModel;
|
||
|
|
OpenAIModel.ID = "openAIID";
|
||
|
|
OpenAIModel.Object = "obj";
|
||
|
|
OpenAIModel.Created = 9999;
|
||
|
|
OpenAIModel.Owned_By = "owned_by";
|
||
|
|
OpenAIModel.Root = "openAIID";
|
||
|
|
OpenAIModel.Parent = "openAIID";
|
||
|
|
const FString ModelsStr = UOpenAIFuncLib::OpenAIModelToString(OpenAIModel);
|
||
|
|
|
||
|
|
FString ExpectedStr = "id: openAIID\n";
|
||
|
|
ExpectedStr.Append("object: obj\n")
|
||
|
|
.Append("created: 9999\n")
|
||
|
|
.Append("owned_by: owned_by\n")
|
||
|
|
.Append("root: openAIID\n")
|
||
|
|
.Append("parent: openAIID\n");
|
||
|
|
TestTrueExpr(ModelsStr.Equals(ExpectedStr));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIMessageContentTypeToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIMessageContentTypeToString(EMessageContentType::Text).Equals("text"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::OpenAIMessageContentTypeToString(EMessageContentType::Image_URL).Equals("image_url"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("BoolToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::BoolToString(true).Equals("true"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::BoolToString(false).Equals("false"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIModerationsToStringReturnsCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
FModerationResults ModerationResults;
|
||
|
|
ModerationResults.Categories = FModerationCategories{true, false, true, false, true, false, true};
|
||
|
|
ModerationResults.Category_Scores = FModerationScores{0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7};
|
||
|
|
ModerationResults.Flagged = true;
|
||
|
|
|
||
|
|
FString ExpectedStr = "hate: true\n";
|
||
|
|
ExpectedStr.Append("hate/threatening: false\n");
|
||
|
|
ExpectedStr.Append("self-harm: true\n");
|
||
|
|
ExpectedStr.Append("sexual: false\n");
|
||
|
|
ExpectedStr.Append("sexual/minors: true\n");
|
||
|
|
ExpectedStr.Append("violence: false\n");
|
||
|
|
ExpectedStr.Append("violence/graphic: true\n\n");
|
||
|
|
|
||
|
|
ExpectedStr.Append("hate: 0.100000\n");
|
||
|
|
ExpectedStr.Append("hate/threatening: 0.200000\n");
|
||
|
|
ExpectedStr.Append("self-harm: 0.300000\n");
|
||
|
|
ExpectedStr.Append("sexual: 0.400000\n");
|
||
|
|
ExpectedStr.Append("sexual/minors: 0.500000\n");
|
||
|
|
ExpectedStr.Append("violence: 0.600000\n");
|
||
|
|
ExpectedStr.Append("violence/graphic: 0.700000\n\n");
|
||
|
|
|
||
|
|
ExpectedStr.Append("flagged: true");
|
||
|
|
|
||
|
|
const FString Out = UOpenAIFuncLib::OpenAIModerationsToString(ModerationResults);
|
||
|
|
TestTrueExpr(ExpectedStr.Equals(Out));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("ErrorCodesShouldBeReturnedCorectly",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::GetErrorCode("") == EOpenAIResponseError::Unknown);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::GetErrorCode("Unknown message") == EOpenAIResponseError::Unknown);
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::GetErrorCode("You have a ConnectionError") == EOpenAIResponseError::NetworkError);
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::GetErrorCode("{\"error\":{\"message\":\"\",\"type\":\"invalid_request_error\",\"param\":null,"
|
||
|
|
"\"code\":\"invalid_api_key\"}}") == EOpenAIResponseError::InvalidAPIKey);
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::GetErrorCode("{\"error\":{\"message\":\"\",\"type\":\"invalid_request_error\",\"param\":null,"
|
||
|
|
"\"code\":\"model_not_found\"}}") == EOpenAIResponseError::ModelNotFound);
|
||
|
|
TestTrueExpr(
|
||
|
|
UOpenAIFuncLib::GetErrorCode(
|
||
|
|
"{\"error\":{\"message\":\"\",\"type\":\"invalid_request_error\",\"param\":null,\"code\":\"invalid\"}}") ==
|
||
|
|
EOpenAIResponseError::Unknown);
|
||
|
|
});
|
||
|
|
|
||
|
|
It("ErrorMessagesShouldBeReturnedCorectly",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::GetErrorMessage("").IsEmpty());
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::GetErrorMessage("Not a valid JSON message").IsEmpty());
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::GetErrorMessage(
|
||
|
|
"{\"error\":{\"message\":\"invalid API key\",\"type\":\"invalid_request_error\",\"param\":null,"
|
||
|
|
"\"code\":\"invalid_api_key\"}}")
|
||
|
|
.Equals("invalid API key"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::GetErrorMessage("{\"error\":{\"type\":\"invalid_request_error\",\"param\":null,"
|
||
|
|
"\"code\":\"invalid_api_key\"}}")
|
||
|
|
.IsEmpty());
|
||
|
|
});
|
||
|
|
|
||
|
|
It("OpenAIResponseErrorToStringShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::ResponseErrorToString(EOpenAIResponseError::InvalidAPIKey).Equals("Invalid API key"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::ResponseErrorToString(EOpenAIResponseError::NetworkError).Equals("Network error"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::ResponseErrorToString(EOpenAIResponseError::ModelNotFound).Equals("Model not found"));
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::ResponseErrorToString(EOpenAIResponseError::Unknown).Equals("Unknown error"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("WhiteSpacesShouldBeRemovedCorrectly",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
const FString NormalString = "Hello, how are you?";
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::RemoveWhiteSpaces(NormalString).Equals(NormalString));
|
||
|
|
|
||
|
|
const FString StringWithWhiteSpaces = "Hello\t, \nhow are you\r?";
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::RemoveWhiteSpaces(StringWithWhiteSpaces).Equals(NormalString));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("StringWithValidJsonShouldMakeConversionCorrectly",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
const FString String = "{\"object\":\"list\"}";
|
||
|
|
TSharedPtr<FJsonObject> JsonObject;
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::StringToJson(String, JsonObject));
|
||
|
|
TestTrueExpr(JsonObject->GetStringField("object").Equals("list"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("JsonToStringShouldMakeConversionCorrectly",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());
|
||
|
|
JsonObject->SetStringField("String", "value");
|
||
|
|
JsonObject->SetStringField("STrinG_NEW", "VALUE");
|
||
|
|
|
||
|
|
TSharedPtr<FJsonObject> JsonSubObject = MakeShareable(new FJsonObject());
|
||
|
|
JsonSubObject->SetStringField("SUBObJect", "vaLue");
|
||
|
|
JsonObject->SetObjectField("ObjecT_NEW", JsonSubObject);
|
||
|
|
|
||
|
|
FString String;
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::JsonToString(JsonObject, String));
|
||
|
|
|
||
|
|
const FString ResultString = UOpenAIFuncLib::RemoveWhiteSpaces(String);
|
||
|
|
TestTrueExpr(
|
||
|
|
ResultString.Equals("{\"string\": \"value\",\"string_new\": \"VALUE\",\"object_new\":{\"subobject\": \"vaLue\"}}"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("URLWithQueryCanBECreatedCorrectly",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
OpenAI::QueryPairs QueryArgs;
|
||
|
|
QueryArgs.Add(MakeTuple("param1", "value1"));
|
||
|
|
QueryArgs.Add(MakeTuple("param2", "value2"));
|
||
|
|
|
||
|
|
const auto ResultURL = UOpenAIFuncLib::MakeURLWithQuery("https://myapi.com", QueryArgs);
|
||
|
|
TestTrueExpr(ResultURL.Equals("https://myapi.com?param1=value1¶m2=value2"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("APISecretCanBeLoadedByName",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
OpenAI::ServiceSecrets Secrets;
|
||
|
|
Secrets.Add(MakeTuple("ApiKey1", "adsgsfhgsgfhg"));
|
||
|
|
Secrets.Add(MakeTuple("ApiKey2", "kjhtlkjgkghl"));
|
||
|
|
Secrets.Add(MakeTuple("ApiKey3", "ghkjfyifkfhjkfhjgkj"));
|
||
|
|
|
||
|
|
FString FoundApiKey;
|
||
|
|
TestTrueExpr(UOpenAIFuncLib::LoadSecretByName(Secrets, "ApiKey2", FoundApiKey));
|
||
|
|
TestTrueExpr(FoundApiKey.Equals("kjhtlkjgkghl"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("ServiceSecretsCanBeLoadedFromFile",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
const FString FilePath = OpenAI::Tests::TestUtils::FileFullPath("OnlineServicesAuth.ini");
|
||
|
|
const OpenAI::ServiceSecrets Secrets = UOpenAIFuncLib::LoadServiceSecretsFromFile(FilePath);
|
||
|
|
|
||
|
|
TestTrueExpr(Secrets[0].Key.Equals("key1"));
|
||
|
|
TestTrueExpr(Secrets[0].Value.Equals("KeYvAlUe1"));
|
||
|
|
TestTrueExpr(Secrets[1].Key.Equals("key2"));
|
||
|
|
TestTrueExpr(Secrets[1].Value.Equals("KeYvAlUe2"));
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
Describe("FileSystemFuncLib",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
It("GetFileExtensionsShouldReturnCorrectValue",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
TestTrueExpr(
|
||
|
|
UFileSystemFuncLib::GetFileExtensions(EFileType::Image).Equals("ImageFiles (png, jpg, jpeg)|*.png;*.jpg;*.jpeg"));
|
||
|
|
TestTrueExpr(
|
||
|
|
UFileSystemFuncLib::GetFileExtensions(EFileType::Media)
|
||
|
|
.Equals("MediaFiles (mp3, mp4, mpeg, m4a, mpga, wav, webm)|*.mp3;*.mp4;*.mpeg;*.m4a;*.mpga;*.wav;*.webm"));
|
||
|
|
});
|
||
|
|
|
||
|
|
It("ChatHistoryMightBeSavedToTheFile",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
const FString FilePath = FPaths::ProjectPluginsDir().Append("OpenAI/Source/OpenAITestRunner/Data/History.txt");
|
||
|
|
const TArray<FMessage> History = {FMessage{"user", "hello!"}, FMessage{"assistant", "hello bro!"}};
|
||
|
|
const FString ModelName = "gpt-4";
|
||
|
|
TestTrueExpr(UFileSystemFuncLib::SaveChatHistoryToFile(History, ModelName, FilePath));
|
||
|
|
|
||
|
|
TArray<FString> FileLines;
|
||
|
|
if (!FFileHelper::LoadFileToStringArray(FileLines, *FilePath))
|
||
|
|
{
|
||
|
|
AddError("Failed loading file");
|
||
|
|
}
|
||
|
|
|
||
|
|
TestTrueExpr(FileLines.Num() == 4);
|
||
|
|
TestTrueExpr(FileLines[0].Equals(FString::Printf(TEXT("[model]: %s"), *ModelName)));
|
||
|
|
TestTrueExpr(FileLines[2].Equals("[user]: hello!"));
|
||
|
|
TestTrueExpr(FileLines[3].Equals("[assistant]: hello bro!"));
|
||
|
|
|
||
|
|
IFileManager::Get().Delete(*FilePath);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
Describe("FineTuningQueryParameters",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
It("ShouldBeEmptyIfNotSet",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
const FFineTuningQueryParameters Parameters;
|
||
|
|
TestTrueExpr(Parameters.ToQuery().IsEmpty());
|
||
|
|
});
|
||
|
|
It("ShouldBECorrectIfOneParamIsSet",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
FFineTuningQueryParameters Parameters;
|
||
|
|
Parameters.After = "event-id";
|
||
|
|
TestTrueExpr(Parameters.ToQuery().Equals("?after=event-id"));
|
||
|
|
});
|
||
|
|
It("ShouldBECorrectIfTwoParamsAreSet",
|
||
|
|
[this]()
|
||
|
|
{
|
||
|
|
FFineTuningQueryParameters Parameters;
|
||
|
|
Parameters.After = "event-id";
|
||
|
|
Parameters.Limit = 20;
|
||
|
|
TestTrueExpr(Parameters.ToQuery().Equals("?after=event-id&limit=20"));
|
||
|
|
});
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif
|