// Copyright Epic Games, Inc. All Rights Reserved. #include "NetworkAutomationTest.h" #include "NetworkAutomationTestMacros.h" #include "Iris/Serialization/StringNetSerializerUtils.h" #include "Containers/StringConv.h" namespace UE::Net::Private { class FTestStringNetSerializerUtils : public FNetworkAutomationTestSuiteFixture { public: FTestStringNetSerializerUtils() = default; void TestEnc32Dec32(); void TestEnc16Dec16(); void TestEnc16Dec32(); void TestEnc32Dec16(); protected: static const char32_t TestStringUTF32[]; static const SIZE_T TestStringUTF32Len; static const char16_t TestStringUTF16[]; static const SIZE_T TestStringUTF16Len; // The UTF-8 string is only used to be able to print error messages static const char TestStringUTF8[]; }; const char32_t FTestStringNetSerializerUtils::TestStringUTF32[] = U"\x0001F606\x0001F01C\x20AC\xA9"; const SIZE_T FTestStringNetSerializerUtils::TestStringUTF32Len = sizeof(TestStringUTF32)/sizeof(TestStringUTF32[0]); const char16_t FTestStringNetSerializerUtils::TestStringUTF16[] = u"\xD83D\xDE06\xD83C\xDC1C\x20AC\x00A9"; const SIZE_T FTestStringNetSerializerUtils::TestStringUTF16Len = sizeof(TestStringUTF16)/sizeof(TestStringUTF16[0]); const char FTestStringNetSerializerUtils::TestStringUTF8[] = "\xf0\x9f\x98\x86\xf0\x9f\x80\x9c\xe2\x82\xac\xc2\xa9"; UE_NET_TEST_FIXTURE(FTestStringNetSerializerUtils, TestEnc32Dec32) { // Encode uint32 EncodedBufferLen = FStringNetSerializerUtils::TStringCodec::GetSafeEncodedBufferLength(TestStringUTF32Len); uint8* EncodingBuffer = static_cast(FMemory_Alloca(EncodedBufferLen)); uint32 OutEncodedLen = 0; FStringNetSerializerUtils::TStringCodec::Encode(EncodingBuffer, EncodedBufferLen, TestStringUTF32, TestStringUTF32Len, OutEncodedLen); UE_NET_ASSERT_GT_MSG(OutEncodedLen, 0U, FString::Printf(TEXT("Test encoding of UTF-32 '%s'."), FUTF8ToTCHAR(TestStringUTF8).Get())); // Decode uint32 DecodedBufferLen = FStringNetSerializerUtils::TStringCodec::GetSafeDecodedBufferLength(OutEncodedLen); char32_t* DecodingBuffer = static_cast(FMemory_Alloca(DecodedBufferLen * sizeof(char32_t))); uint32 OutDecodedLen = 0; FStringNetSerializerUtils::TStringCodec::Decode(DecodingBuffer, DecodedBufferLen, EncodingBuffer, OutEncodedLen, OutDecodedLen); UE_NET_ASSERT_EQ_MSG(OutDecodedLen, static_cast(TestStringUTF32Len), FString::Printf(TEXT("Test UTF-32 decoding of '%s'."), FUTF8ToTCHAR(TestStringUTF8).Get())); UE_NET_ASSERT_EQ_MSG(FMemory::Memcmp(DecodingBuffer, TestStringUTF32, TestStringUTF32Len), 0, FString::Printf(TEXT("Test UTF-32 decoding of '%s'."), FUTF8ToTCHAR(TestStringUTF8).Get())); } UE_NET_TEST_FIXTURE(FTestStringNetSerializerUtils, TestEnc16Dec16) { // Encode uint32 EncodedBufferLen = FStringNetSerializerUtils::TStringCodec::GetSafeEncodedBufferLength(TestStringUTF16Len); uint8* EncodingBuffer = static_cast(FMemory_Alloca(EncodedBufferLen)); uint32 OutEncodedLen = 0; FStringNetSerializerUtils::TStringCodec::Encode(EncodingBuffer, EncodedBufferLen, TestStringUTF16, TestStringUTF16Len, OutEncodedLen); UE_NET_ASSERT_GT_MSG(OutEncodedLen, 0U, FString::Printf(TEXT("Test encoding of UTF-16 '%s'."), FUTF8ToTCHAR(TestStringUTF8).Get())); // Decode uint32 DecodedBufferLen = FStringNetSerializerUtils::TStringCodec::GetSafeDecodedBufferLength(OutEncodedLen * sizeof(char16_t)); char16_t* DecodingBuffer = static_cast(FMemory_Alloca(DecodedBufferLen)); uint32 OutDecodedLen = 0; FStringNetSerializerUtils::TStringCodec::Decode(DecodingBuffer, DecodedBufferLen, EncodingBuffer, OutEncodedLen, OutDecodedLen); UE_NET_ASSERT_EQ_MSG(OutDecodedLen, static_cast(TestStringUTF16Len), FString::Printf(TEXT("Test UTF-16 decoding of '%s'."), FUTF8ToTCHAR(TestStringUTF8).Get())); UE_NET_ASSERT_EQ_MSG(FMemory::Memcmp(DecodingBuffer, TestStringUTF16, TestStringUTF16Len), 0, FString::Printf(TEXT("Test UTF-16 decoding of '%s'."), FUTF8ToTCHAR(TestStringUTF8).Get())); } UE_NET_TEST_FIXTURE(FTestStringNetSerializerUtils, TestEnc16Dec32) { // Encode uint32 EncodedBufferLen = FStringNetSerializerUtils::TStringCodec::GetSafeEncodedBufferLength(TestStringUTF16Len); uint8* EncodingBuffer = static_cast(FMemory_Alloca(EncodedBufferLen)); uint32 OutEncodedLen = 0; FStringNetSerializerUtils::TStringCodec::Encode(EncodingBuffer, EncodedBufferLen, TestStringUTF16, TestStringUTF16Len, OutEncodedLen); // Decode uint32 DecodedBufferLen = FStringNetSerializerUtils::TStringCodec::GetSafeDecodedBufferLength(OutEncodedLen); char32_t* DecodingBuffer = static_cast(FMemory_Alloca(DecodedBufferLen * sizeof(char32_t))); uint32 OutDecodedLen = 0; FStringNetSerializerUtils::TStringCodec::Decode(DecodingBuffer, DecodedBufferLen, EncodingBuffer, OutEncodedLen, OutDecodedLen); UE_NET_ASSERT_EQ_MSG(OutDecodedLen, static_cast(TestStringUTF32Len), FString::Printf(TEXT("Test UTF-32 decoding of UTF-16 '%s'."), FUTF8ToTCHAR(TestStringUTF8).Get())); UE_NET_ASSERT_EQ_MSG(FMemory::Memcmp(DecodingBuffer, TestStringUTF32, TestStringUTF32Len), 0, FString::Printf(TEXT("Test UTF-32 decoding of UTF-16 '%s'."), FUTF8ToTCHAR(TestStringUTF8).Get())); } UE_NET_TEST_FIXTURE(FTestStringNetSerializerUtils, TestEnc32Dec16) { // Encode uint32 EncodedBufferLen = FStringNetSerializerUtils::TStringCodec::GetSafeEncodedBufferLength(TestStringUTF32Len); uint8* EncodingBuffer = static_cast(FMemory_Alloca(EncodedBufferLen)); uint32 OutEncodedLen = 0; FStringNetSerializerUtils::TStringCodec::Encode(EncodingBuffer, EncodedBufferLen, TestStringUTF32, TestStringUTF32Len, OutEncodedLen); // Decode uint32 DecodedBufferLen = FStringNetSerializerUtils::TStringCodec::GetSafeDecodedBufferLength(OutEncodedLen); char16_t* DecodingBuffer = static_cast(FMemory_Alloca(DecodedBufferLen * sizeof(char16_t))); uint32 OutDecodedLen = 0; FStringNetSerializerUtils::TStringCodec::Decode(DecodingBuffer, DecodedBufferLen, EncodingBuffer, OutEncodedLen, OutDecodedLen); UE_NET_ASSERT_EQ_MSG(OutDecodedLen, static_cast(TestStringUTF16Len), FString::Printf(TEXT("Test UTF-16 decoding of UTF-32 '%s'."), FUTF8ToTCHAR(TestStringUTF8).Get())); UE_NET_ASSERT_EQ_MSG(FMemory::Memcmp(DecodingBuffer, TestStringUTF16, TestStringUTF16Len), 0, FString::Printf(TEXT("Test UTF-16 decoding of UTF-32 '%s'."), FUTF8ToTCHAR(TestStringUTF8).Get())); } }