blob: b611d1205540cfd83ed281ae37764abd5583e21b [file] [edit]
//===-- 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