1//===-- Unittests for wmemchr ---------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "hdr/types/wchar_t.h"
10#include "src/wchar/wmemchr.h"
11#include "test/UnitTest/Test.h"
12
13TEST(LlvmLibcWMemChrTest, FindsCharacterAfterNullTerminator) {
14 // wmemchr should continue searching after a null terminator.
15 const size_t size = 5;
16 const wchar_t src[size] = {L'a', L'\0', L'b', L'c', L'\0'};
17 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'b', size), (src + 2));
18}
19
20TEST(LlvmLibcWMemChrTest, FindsCharacterInNonNullTerminatedCollection) {
21 const size_t size = 3;
22 const wchar_t src[size] = {L'a', L'b', L'c'};
23 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'b', size), (src + 1));
24}
25
26TEST(LlvmLibcWMemChrTest, FindsFirstCharacter) {
27 const size_t size = 6;
28 const wchar_t *src = L"abcde";
29 // Should return original array since 'a' is the first character.
30 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'a', size), (src));
31}
32
33TEST(LlvmLibcWMemChrTest, FindsMiddleCharacter) {
34 const size_t size = 6;
35 const wchar_t *src = L"abcde";
36 // Should return characters after and including 'c'.
37 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'c', size), (src + 2));
38}
39
40TEST(LlvmLibcWMemChrTest, FindsLastCharacterThatIsNotNullTerminator) {
41 const size_t size = 6;
42 const wchar_t *src = L"abcde";
43 // Should return 'e' and null terminator.
44 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'e', size), (src + 4));
45}
46
47TEST(LlvmLibcWMemChrTest, FindsNullTerminator) {
48 const size_t size = 6;
49 const wchar_t *src = L"abcde";
50 // Should return null terminator.
51 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'\0', size), (src + 5));
52}
53
54TEST(LlvmLibcWMemChrTest, CharacterNotWithinStringShouldReturnNullptr) {
55 const size_t size = 6;
56 const wchar_t *src = L"abcde";
57 // Should return nullptr.
58 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'z', size), nullptr);
59}
60
61TEST(LlvmLibcWMemChrTest, CharacterNotWithinSizeShouldReturnNullptr) {
62 const size_t size = 3;
63 const wchar_t *src = L"abcde";
64 // Should return nullptr.
65 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'd', size), nullptr);
66}
67
68TEST(LlvmLibcWMemChrTest, TheSourceShouldNotChange) {
69 const size_t size = 3;
70 const wchar_t *src = L"ab";
71 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'a', size), src);
72 ASSERT_TRUE(src[0] == L'a');
73 ASSERT_TRUE(src[1] == L'b');
74 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'c', size), nullptr);
75 ASSERT_TRUE(src[0] == L'a');
76 ASSERT_TRUE(src[1] == L'b');
77}
78
79TEST(LlvmLibcWMemChrTest, EmptyStringShouldOnlyMatchNullTerminator) {
80 const size_t size = 1;
81 const wchar_t *src = L"";
82 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'\0', size), src);
83 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'c', size), nullptr);
84 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'1', size), nullptr);
85 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'?', size), nullptr);
86}
87
88TEST(LlvmLibcWMemChrTest, SingleRepeatedCharacterShouldReturnFirst) {
89 const size_t size = 6;
90 const wchar_t *src = L"XXXXX";
91 ASSERT_EQ(LIBC_NAMESPACE::wmemchr(src, L'X', size), src);
92}
93

source code of libc/test/src/wchar/wmemchr_test.cpp