1bc2b1614SCaslyn Tonelli //===-- Unittests for strchrnul -------------------------------------------===//
2bc2b1614SCaslyn Tonelli //
3bc2b1614SCaslyn Tonelli // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4bc2b1614SCaslyn Tonelli // See https://llvm.org/LICENSE.txt for license information.
5bc2b1614SCaslyn Tonelli // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bc2b1614SCaslyn Tonelli //
7bc2b1614SCaslyn Tonelli //===----------------------------------------------------------------------===//
8bc2b1614SCaslyn Tonelli
9bc2b1614SCaslyn Tonelli #include "src/string/strchrnul.h"
10bc2b1614SCaslyn Tonelli #include "test/UnitTest/Test.h"
11bc2b1614SCaslyn Tonelli
TEST(LlvmLibcStrChrNulTest,FindsFirstCharacter)12bc2b1614SCaslyn Tonelli TEST(LlvmLibcStrChrNulTest, FindsFirstCharacter) {
13bc2b1614SCaslyn Tonelli const char *src = "abcde";
14bc2b1614SCaslyn Tonelli
15bc2b1614SCaslyn Tonelli // Should return original string since 'a' is the first character.
16*b6bc9d72SGuillaume Chatelet ASSERT_STREQ(LIBC_NAMESPACE::strchrnul(src, 'a'), "abcde");
17bc2b1614SCaslyn Tonelli // Source string should not change.
18bc2b1614SCaslyn Tonelli ASSERT_STREQ(src, "abcde");
19bc2b1614SCaslyn Tonelli }
20bc2b1614SCaslyn Tonelli
TEST(LlvmLibcStrChrNulTest,FindsMiddleCharacter)21bc2b1614SCaslyn Tonelli TEST(LlvmLibcStrChrNulTest, FindsMiddleCharacter) {
22bc2b1614SCaslyn Tonelli const char *src = "abcde";
23bc2b1614SCaslyn Tonelli
24bc2b1614SCaslyn Tonelli // Should return characters after (and including) 'c'.
25*b6bc9d72SGuillaume Chatelet ASSERT_STREQ(LIBC_NAMESPACE::strchrnul(src, 'c'), "cde");
26bc2b1614SCaslyn Tonelli // Source string should not change.
27bc2b1614SCaslyn Tonelli ASSERT_STREQ(src, "abcde");
28bc2b1614SCaslyn Tonelli }
29bc2b1614SCaslyn Tonelli
TEST(LlvmLibcStrChrNulTest,FindsLastCharacterThatIsNotNullTerminator)30bc2b1614SCaslyn Tonelli TEST(LlvmLibcStrChrNulTest, FindsLastCharacterThatIsNotNullTerminator) {
31bc2b1614SCaslyn Tonelli const char *src = "abcde";
32bc2b1614SCaslyn Tonelli
33bc2b1614SCaslyn Tonelli // Should return 'e' and null-terminator.
34*b6bc9d72SGuillaume Chatelet ASSERT_STREQ(LIBC_NAMESPACE::strchrnul(src, 'e'), "e");
35bc2b1614SCaslyn Tonelli // Source string should not change.
36bc2b1614SCaslyn Tonelli ASSERT_STREQ(src, "abcde");
37bc2b1614SCaslyn Tonelli }
38bc2b1614SCaslyn Tonelli
TEST(LlvmLibcStrChrNulTest,FindsNullTerminator)39bc2b1614SCaslyn Tonelli TEST(LlvmLibcStrChrNulTest, FindsNullTerminator) {
40bc2b1614SCaslyn Tonelli const char *src = "abcde";
41bc2b1614SCaslyn Tonelli
42bc2b1614SCaslyn Tonelli // Should return null terminator.
43*b6bc9d72SGuillaume Chatelet ASSERT_STREQ(LIBC_NAMESPACE::strchrnul(src, '\0'), "");
44bc2b1614SCaslyn Tonelli // Source string should not change.
45bc2b1614SCaslyn Tonelli ASSERT_STREQ(src, "abcde");
46bc2b1614SCaslyn Tonelli }
47bc2b1614SCaslyn Tonelli
TEST(LlvmLibcStrChrNulTest,CharacterNotWithinStringShouldReturnNullTerminator)48bc2b1614SCaslyn Tonelli TEST(LlvmLibcStrChrNulTest,
49bc2b1614SCaslyn Tonelli CharacterNotWithinStringShouldReturnNullTerminator) {
50bc2b1614SCaslyn Tonelli const char *src = "123?";
51bc2b1614SCaslyn Tonelli
52bc2b1614SCaslyn Tonelli // Since 'z' is not within the string, should return a pointer to the source
53bc2b1614SCaslyn Tonelli // string's null terminator.
54*b6bc9d72SGuillaume Chatelet char *result = LIBC_NAMESPACE::strchrnul(src, 'z');
55bc2b1614SCaslyn Tonelli ASSERT_EQ(*result, '\0');
56bc2b1614SCaslyn Tonelli
57bc2b1614SCaslyn Tonelli char *term = const_cast<char *>(src) + 4;
58bc2b1614SCaslyn Tonelli ASSERT_EQ(result, term);
59bc2b1614SCaslyn Tonelli }
60bc2b1614SCaslyn Tonelli
TEST(LlvmLibcStrChrNulTest,TheSourceShouldNotChange)61bc2b1614SCaslyn Tonelli TEST(LlvmLibcStrChrNulTest, TheSourceShouldNotChange) {
62bc2b1614SCaslyn Tonelli const char *src = "abcde";
63bc2b1614SCaslyn Tonelli // When the character is found, the source string should not change.
64*b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::strchrnul(src, 'd');
65bc2b1614SCaslyn Tonelli ASSERT_STREQ(src, "abcde");
66bc2b1614SCaslyn Tonelli // Same case for when the character is not found.
67*b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::strchrnul(src, 'z');
68bc2b1614SCaslyn Tonelli ASSERT_STREQ(src, "abcde");
69bc2b1614SCaslyn Tonelli // Same case for when looking for null terminator.
70*b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::strchrnul(src, '\0');
71bc2b1614SCaslyn Tonelli ASSERT_STREQ(src, "abcde");
72bc2b1614SCaslyn Tonelli }
73bc2b1614SCaslyn Tonelli
TEST(LlvmLibcStrChrNulTest,ShouldFindFirstOfDuplicates)74bc2b1614SCaslyn Tonelli TEST(LlvmLibcStrChrNulTest, ShouldFindFirstOfDuplicates) {
75bc2b1614SCaslyn Tonelli // '1' is duplicated in the string, but it should find the first copy.
76*b6bc9d72SGuillaume Chatelet ASSERT_STREQ(LIBC_NAMESPACE::strchrnul("abc1def1ghi", '1'), "1def1ghi");
77bc2b1614SCaslyn Tonelli
78bc2b1614SCaslyn Tonelli const char *dups = "XXXXX";
79bc2b1614SCaslyn Tonelli // Should return original string since 'X' is the first character.
80*b6bc9d72SGuillaume Chatelet ASSERT_STREQ(LIBC_NAMESPACE::strchrnul(dups, 'X'), dups);
81bc2b1614SCaslyn Tonelli }
82bc2b1614SCaslyn Tonelli
TEST(LlvmLibcStrChrNulTest,EmptyStringShouldOnlyMatchNullTerminator)83bc2b1614SCaslyn Tonelli TEST(LlvmLibcStrChrNulTest, EmptyStringShouldOnlyMatchNullTerminator) {
84bc2b1614SCaslyn Tonelli // Null terminator should match.
85*b6bc9d72SGuillaume Chatelet ASSERT_STREQ(LIBC_NAMESPACE::strchrnul("", '\0'), "");
86bc2b1614SCaslyn Tonelli
87bc2b1614SCaslyn Tonelli // All other characters should not match.
88*b6bc9d72SGuillaume Chatelet char *result = LIBC_NAMESPACE::strchrnul("", 'Z');
89bc2b1614SCaslyn Tonelli ASSERT_EQ(*result, '\0');
90bc2b1614SCaslyn Tonelli
91*b6bc9d72SGuillaume Chatelet result = LIBC_NAMESPACE::strchrnul("", '3');
92bc2b1614SCaslyn Tonelli ASSERT_EQ(*result, '\0');
93bc2b1614SCaslyn Tonelli
94*b6bc9d72SGuillaume Chatelet result = LIBC_NAMESPACE::strchrnul("", '*');
95bc2b1614SCaslyn Tonelli ASSERT_EQ(*result, '\0');
96bc2b1614SCaslyn Tonelli }
97