| //===-- 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<int>(ACTUAL), static_cast<int>(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'); |
| } |