| //===-- Unittests for wcscoll ---------------------------------------------===// |
| // |
| // 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 "hdr/signal_macros.h" |
| #include "src/wchar/wcscoll.h" |
| #include "test/UnitTest/Test.h" |
| |
| // TODO: Add more comprehensive tests once locale support is added. |
| |
| TEST(LlvmLibcWcscollTest, EmptyStringsShouldReturnZero) { |
| const wchar_t *s1 = L""; |
| const wchar_t *s2 = L""; |
| |
| int result = LIBC_NAMESPACE::wcscoll(s1, s2); |
| ASSERT_EQ(result, 0); |
| } |
| |
| TEST(LlvmLibcWcscollTest, EmptyStringShouldNotEqualNonEmptyString) { |
| const wchar_t *empty = L""; |
| const wchar_t *s = L"abc"; |
| |
| // An empty string comes before a non empty one lexicographically, so lt 0 |
| int result = LIBC_NAMESPACE::wcscoll(empty, s); |
| ASSERT_LT(result, 0); |
| |
| // Check the reversed behaviour |
| result = LIBC_NAMESPACE::wcscoll(s, empty); |
| ASSERT_GT(result, 0); |
| } |
| |
| TEST(LlvmLibcWcscollTest, EqualStringsShouldReturnZero) { |
| const wchar_t *s1 = L"abc"; |
| const wchar_t *s2 = L"abc"; |
| |
| // Check if it returns 0 for two equal strings |
| int result = LIBC_NAMESPACE::wcscoll(s1, s2); |
| ASSERT_EQ(result, 0); |
| |
| // Verify for reversed operands |
| result = LIBC_NAMESPACE::wcscoll(s2, s1); |
| ASSERT_EQ(result, 0); |
| } |
| |
| TEST(LlvmLibcWcscollTest, LexicographicalTest) { |
| const wchar_t *s1 = L"abc"; |
| const wchar_t *s2 = L"def"; |
| |
| // Check if it returns lt 0 for (abc, def) |
| int result = LIBC_NAMESPACE::wcscoll(s1, s2); |
| ASSERT_LT(result, 0); |
| |
| // Check if it returns gt 0 for (def, abc) |
| result = LIBC_NAMESPACE::wcscoll(s2, s1); |
| ASSERT_GT(result, 0); |
| } |
| |
| TEST(LlvmLibcWcscollTest, NonAsciiTest) { |
| const wchar_t *s1 = L"AbCdEf__1230!! \u1111"; |
| const wchar_t *s2 = L"AbCdEf__1230!! \u1111\u2222"; |
| |
| int result = LIBC_NAMESPACE::wcscoll(s1, s2); |
| ASSERT_LT(result, 0); |
| |
| result = LIBC_NAMESPACE::wcscoll(s2, s1); |
| ASSERT_GT(result, 0); |
| |
| result = LIBC_NAMESPACE::wcscoll(s1, s1); |
| ASSERT_EQ(result, 0); |
| |
| // Empty string |
| const wchar_t *empty = L""; |
| result = LIBC_NAMESPACE::wcscoll(empty, s1); |
| ASSERT_LT(result, 0); |
| |
| result = LIBC_NAMESPACE::wcscoll(s1, empty); |
| ASSERT_GT(result, 0); |
| } |
| |
| TEST(LlvmLibcWcscollTest, EightDigitUCNTest) { |
| const wchar_t *s1 = L"abC\U0001F44D"; // thumbs up emoji |
| const wchar_t *s2 = L"abC\U0001F44E"; // thumbs down emoji |
| |
| int result = LIBC_NAMESPACE::wcscoll(s1, s2); |
| ASSERT_LT(result, 0); |
| |
| result = LIBC_NAMESPACE::wcscoll(s2, s1); |
| ASSERT_GT(result, 0); |
| |
| result = LIBC_NAMESPACE::wcscoll(s1, s1); |
| ASSERT_EQ(result, 0); |
| |
| // empty string |
| const wchar_t *empty = L""; |
| result = LIBC_NAMESPACE::wcscoll(empty, s1); |
| ASSERT_LT(result, 0); |
| |
| result = LIBC_NAMESPACE::wcscoll(s1, empty); |
| ASSERT_GT(result, 0); |
| } |
| |
| TEST(LlvmLibcWcscollTest, AsciiVsNonAsciiTest) { |
| const wchar_t *s1 = L"a"; |
| const wchar_t *s2 = L"\uFFFF"; |
| const wchar_t *s3 = L"\U0001000F"; |
| |
| // ascii and 4 digit unicode |
| int result = LIBC_NAMESPACE::wcscoll(s1, s2); |
| ASSERT_LT(result, 0); |
| |
| result = LIBC_NAMESPACE::wcscoll(s2, s1); |
| ASSERT_GT(result, 0); |
| |
| // ascii and 8 digit unicode |
| result = LIBC_NAMESPACE::wcscoll(s1, s3); |
| ASSERT_LT(result, 0); |
| |
| result = LIBC_NAMESPACE::wcscoll(s3, s1); |
| ASSERT_GT(result, 0); |
| |
| // 4 digit unicode and 8 digit unicode |
| result = LIBC_NAMESPACE::wcscoll(s2, s3); |
| ASSERT_LT(result, 0); |
| |
| result = LIBC_NAMESPACE::wcscoll(s3, s2); |
| ASSERT_GT(result, 0); |
| } |
| |
| #if defined(LIBC_ADD_NULL_CHECKS) |
| TEST(LlvmLibcWcscollTest, NULLCheck) { |
| // Passing in a nullptr should crash the program |
| EXPECT_DEATH([] { LIBC_NAMESPACE::wcscoll(L"", nullptr); }, WITH_SIGNAL(-1)); |
| EXPECT_DEATH([] { LIBC_NAMESPACE::wcscoll(nullptr, L""); }, WITH_SIGNAL(-1)); |
| } |
| #endif // LIBC_ADD_NULL_CHECKS |