blob: 5d28d384486615f6545801697ba1d447ef10a164 [file] [edit]
//===-- 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');
}