aboutsummaryrefslogtreecommitdiff
path: root/test/source/TestString.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/source/TestString.cpp')
-rw-r--r--test/source/TestString.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/test/source/TestString.cpp b/test/source/TestString.cpp
new file mode 100644
index 0000000..1bd06e7
--- /dev/null
+++ b/test/source/TestString.cpp
@@ -0,0 +1,142 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) Electronic Arts Inc. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+
+#include "EASTLTest.h"
+#include <EABase/eabase.h>
+#include <EAStdC/EAMemory.h>
+#include <EAStdC/EAString.h>
+#include <EASTL/string.h>
+#include <EASTL/algorithm.h>
+#include <EASTL/allocator_malloc.h>
+
+using namespace eastl;
+
+// Verify char8_t support is present if the test build requested it.
+#if defined(EASTL_EXPECT_CHAR8T_SUPPORT) && !EA_CHAR8_UNIQUE
+static_assert(false, "Building with char8_t tests enabled, but EA_CHAR8_UNIQUE evaluates to false.");
+#endif
+
+
+// inject string literal string conversion macros into the unit tests
+#define TEST_STRING_NAME TestBasicString
+#define LITERAL(x) x
+#include "TestString.inl"
+
+#define TEST_STRING_NAME TestBasicStringW
+#define LITERAL(x) EA_WCHAR(x)
+#include "TestString.inl"
+
+#define TEST_STRING_NAME TestBasicString8
+#define LITERAL(x) EA_CHAR8(x)
+#include "TestString.inl"
+
+#define TEST_STRING_NAME TestBasicString16
+#define LITERAL(x) EA_CHAR16(x)
+#include "TestString.inl"
+
+#define TEST_STRING_NAME TestBasicString32
+#define LITERAL(x) EA_CHAR32(x)
+#include "TestString.inl"
+
+int TestString()
+{
+ int nErrorCount = 0;
+
+ nErrorCount += TestBasicString<eastl::basic_string<char, StompDetectAllocator>>();
+ nErrorCount += TestBasicString<eastl::string>();
+
+ nErrorCount += TestBasicStringW<eastl::basic_string<wchar_t, StompDetectAllocator>>();
+ nErrorCount += TestBasicStringW<eastl::wstring>();
+
+#if defined(EA_CHAR8_UNIQUE) && EA_CHAR8_UNIQUE
+ nErrorCount += TestBasicString8<eastl::basic_string<char8_t, StompDetectAllocator>>();
+ nErrorCount += TestBasicString8<eastl::u8string>();
+#endif
+
+ nErrorCount += TestBasicString16<eastl::basic_string<char16_t, StompDetectAllocator>>();
+ nErrorCount += TestBasicString16<eastl::u16string>();
+
+#if defined(EA_CHAR32_NATIVE) && EA_CHAR32_NATIVE
+ nErrorCount += TestBasicString32<eastl::basic_string<char32_t, StompDetectAllocator>>();
+ nErrorCount += TestBasicString32<eastl::u32string>();
+#endif
+
+ // Check for memory leaks by using the 'CountingAllocator' to ensure no active allocation after tests have completed.
+ CountingAllocator::resetCount();
+ nErrorCount += TestBasicString<eastl::basic_string<char, CountingAllocator>>();
+ VERIFY(CountingAllocator::getActiveAllocationCount() == 0);
+
+ nErrorCount += TestBasicStringW<eastl::basic_string<wchar_t, CountingAllocator>>();
+ VERIFY(CountingAllocator::getActiveAllocationCount() == 0);
+
+#if defined(EA_CHAR8_UNIQUE) && EA_CHAR8_UNIQUE
+ nErrorCount += TestBasicString8<eastl::basic_string<char8_t, CountingAllocator>>();
+ VERIFY(CountingAllocator::getActiveAllocationCount() == 0);
+#endif
+
+ nErrorCount += TestBasicString16<eastl::basic_string<char16_t, CountingAllocator>>();
+ VERIFY(CountingAllocator::getActiveAllocationCount() == 0);
+
+#if defined(EA_CHAR32_NATIVE) && EA_CHAR32_NATIVE
+ nErrorCount += TestBasicString32<eastl::basic_string<char32_t, CountingAllocator>>();
+ VERIFY(CountingAllocator::getActiveAllocationCount() == 0);
+#endif
+
+ // to_string
+ {
+ VERIFY(eastl::to_string(42) == "42");
+ VERIFY(eastl::to_string(42l) == "42");
+ VERIFY(eastl::to_string(42ll) == "42");
+ VERIFY(eastl::to_string(42u) == "42");
+ VERIFY(eastl::to_string(42ul) == "42");
+ VERIFY(eastl::to_string(42ull) == "42");
+ VERIFY(eastl::to_string(42.f) == "42.000000");
+ VERIFY(eastl::to_string(42.0) == "42.000000");
+ #if !defined(EA_COMPILER_GNUC) && !defined(EA_PLATFORM_MINGW)
+ // todo: long double sprintf functionality is unrealiable on unix-gcc, requires further debugging.
+ VERIFY(eastl::to_string(42.0l) == "42.000000");
+ #endif
+ }
+
+ // to_wstring
+ {
+ VERIFY(eastl::to_wstring(42) == L"42");
+ VERIFY(eastl::to_wstring(42l) == L"42");
+ VERIFY(eastl::to_wstring(42ll) == L"42");
+ VERIFY(eastl::to_wstring(42u) == L"42");
+ VERIFY(eastl::to_wstring(42ul) == L"42");
+ VERIFY(eastl::to_wstring(42ull) == L"42");
+ VERIFY(eastl::to_wstring(42.f) == L"42.000000");
+ VERIFY(eastl::to_wstring(42.0) == L"42.000000");
+ #if !defined(EA_COMPILER_GNUC) && !defined(EA_PLATFORM_MINGW)
+ // todo: long double sprintf functionality is unrealiable on unix-gcc, requires further debugging.
+ VERIFY(eastl::to_wstring(42.0l) == L"42.000000");
+ #endif
+ }
+
+ #if EASTL_USER_LITERALS_ENABLED
+ {
+ VERIFY("cplusplus"s == "cplusplus");
+ VERIFY(L"cplusplus"s == L"cplusplus");
+ VERIFY(u"cplusplus"s == u"cplusplus");
+ VERIFY(U"cplusplus"s == U"cplusplus");
+ VERIFY(u8"cplusplus"s == u8"cplusplus");
+ }
+ #endif
+
+
+ {
+ // CustomAllocator has no data members which reduces the size of an eastl::basic_string via the empty base class optimization.
+ using EboString = eastl::basic_string<char, CustomAllocator>;
+
+ // this must match the eastl::basic_string heap memory layout struct which is a pointer and 2 eastl_size_t.
+ const int expectedSize = sizeof(EboString::pointer) + (2 * sizeof(EboString::size_type));
+
+ static_assert(sizeof(EboString) == expectedSize, "unexpected layout size of basic_string");
+ }
+
+ return nErrorCount;
+}
+
+