//===-- Unittests for wcsxfrm --------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "src/wchar/wcsxfrm.h" #include "test/UnitTest/Test.h" // TODO: Remove this once the test framework supports direct wchar_t // comparisons in EXPECT_EQ. #define EXPECT_WCHAR_EQ(ACTUAL, EXPECTED) \ EXPECT_EQ(static_cast(ACTUAL), static_cast(EXPECTED)) TEST(LlvmLibcWCSXfrmTest, EmptyString) { wchar_t dest[8]; size_t result = LIBC_NAMESPACE::wcsxfrm(dest, L"", 8); EXPECT_EQ(result, size_t(0)); EXPECT_WCHAR_EQ(dest[0], L'\0'); } TEST(LlvmLibcWCSXfrmTest, NullDestinationWhenCountIsZero) { size_t result = LIBC_NAMESPACE::wcsxfrm(nullptr, L"abc", 0); EXPECT_EQ(result, size_t(3)); } TEST(LlvmLibcWCSXfrmTest, CopiesWholeStringWhenBufferIsLargeEnough) { wchar_t dest[16]; size_t result = LIBC_NAMESPACE::wcsxfrm(dest, L"hello", 16); EXPECT_EQ(result, size_t(5)); EXPECT_WCHAR_EQ(dest[0], L'h'); EXPECT_WCHAR_EQ(dest[1], L'e'); EXPECT_WCHAR_EQ(dest[2], L'l'); EXPECT_WCHAR_EQ(dest[3], L'l'); EXPECT_WCHAR_EQ(dest[4], L'o'); EXPECT_WCHAR_EQ(dest[5], L'\0'); } TEST(LlvmLibcWCSXfrmTest, ExactFitIncludingNullTerminator) { wchar_t dest[6]; size_t result = LIBC_NAMESPACE::wcsxfrm(dest, L"hello", 6); EXPECT_EQ(result, size_t(5)); EXPECT_WCHAR_EQ(dest[0], L'h'); EXPECT_WCHAR_EQ(dest[1], L'e'); EXPECT_WCHAR_EQ(dest[2], L'l'); EXPECT_WCHAR_EQ(dest[3], L'l'); EXPECT_WCHAR_EQ(dest[4], L'o'); EXPECT_WCHAR_EQ(dest[5], L'\0'); } TEST(LlvmLibcWCSXfrmTest, TruncatesAndNullTerminates) { wchar_t dest[4]; size_t result = LIBC_NAMESPACE::wcsxfrm(dest, L"hello", 4); EXPECT_EQ(result, size_t(5)); EXPECT_WCHAR_EQ(dest[0], L'h'); EXPECT_WCHAR_EQ(dest[1], L'e'); EXPECT_WCHAR_EQ(dest[2], L'l'); EXPECT_WCHAR_EQ(dest[3], L'\0'); } TEST(LlvmLibcWCSXfrmTest, BufferSizeOneWritesOnlyNullTerminator) { wchar_t dest[1]; dest[0] = L'x'; size_t result = LIBC_NAMESPACE::wcsxfrm(dest, L"hello", 1); EXPECT_EQ(result, size_t(5)); EXPECT_WCHAR_EQ(dest[0], L'\0'); } TEST(LlvmLibcWCSXfrmTest, DoesNotWriteWhenCountIsZero) { wchar_t dest[4] = {L'x', L'y', L'z', L'\0'}; size_t result = LIBC_NAMESPACE::wcsxfrm(dest, L"hello", 0); EXPECT_EQ(result, size_t(5)); EXPECT_WCHAR_EQ(dest[0], L'x'); EXPECT_WCHAR_EQ(dest[1], L'y'); EXPECT_WCHAR_EQ(dest[2], L'z'); EXPECT_WCHAR_EQ(dest[3], L'\0'); } TEST(LlvmLibcWCSXfrmTest, WideCharactersAreHandledCorrectly) { wchar_t dest[8]; const wchar_t src[] = {L'A', L'\u03A9', L'\u2603', L'\0'}; size_t result = LIBC_NAMESPACE::wcsxfrm(dest, src, 8); EXPECT_EQ(result, size_t(3)); EXPECT_WCHAR_EQ(dest[0], L'A'); EXPECT_WCHAR_EQ(dest[1], L'\u03A9'); EXPECT_WCHAR_EQ(dest[2], L'\u2603'); EXPECT_WCHAR_EQ(dest[3], L'\0'); }