1a4f0c58cScgyurgyik //===-- Unittests for strchr ----------------------------------------------===//
2a4f0c58cScgyurgyik //
3a4f0c58cScgyurgyik // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a4f0c58cScgyurgyik // See https://llvm.org/LICENSE.txt for license information.
5a4f0c58cScgyurgyik // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a4f0c58cScgyurgyik //
7a4f0c58cScgyurgyik //===----------------------------------------------------------------------===//
8a4f0c58cScgyurgyik 
9a4f0c58cScgyurgyik #include "src/string/strchr.h"
10a4f0c58cScgyurgyik #include "utils/UnitTest/Test.h"
11a4f0c58cScgyurgyik 
TEST(LlvmLibcStrChrTest,FindsFirstCharacter)12*1df0dbfcSMichael Jones TEST(LlvmLibcStrChrTest, FindsFirstCharacter) {
13a4f0c58cScgyurgyik   const char *src = "abcde";
14a4f0c58cScgyurgyik 
15a4f0c58cScgyurgyik   // Should return original string since 'a' is the first character.
16a4f0c58cScgyurgyik   ASSERT_STREQ(__llvm_libc::strchr(src, 'a'), "abcde");
17a4f0c58cScgyurgyik   // Source string should not change.
1859547559Scgyurgyik   ASSERT_STREQ(src, "abcde");
19a4f0c58cScgyurgyik }
20a4f0c58cScgyurgyik 
TEST(LlvmLibcStrChrTest,FindsMiddleCharacter)21*1df0dbfcSMichael Jones TEST(LlvmLibcStrChrTest, FindsMiddleCharacter) {
22a4f0c58cScgyurgyik   const char *src = "abcde";
23a4f0c58cScgyurgyik 
24a4f0c58cScgyurgyik   // Should return characters after (and including) 'c'.
25a4f0c58cScgyurgyik   ASSERT_STREQ(__llvm_libc::strchr(src, 'c'), "cde");
26a4f0c58cScgyurgyik   // Source string should not change.
2759547559Scgyurgyik   ASSERT_STREQ(src, "abcde");
28a4f0c58cScgyurgyik }
29a4f0c58cScgyurgyik 
TEST(LlvmLibcStrChrTest,FindsLastCharacterThatIsNotNullTerminator)30*1df0dbfcSMichael Jones TEST(LlvmLibcStrChrTest, FindsLastCharacterThatIsNotNullTerminator) {
31a4f0c58cScgyurgyik   const char *src = "abcde";
32a4f0c58cScgyurgyik 
33a4f0c58cScgyurgyik   // Should return 'e' and null-terminator.
34a4f0c58cScgyurgyik   ASSERT_STREQ(__llvm_libc::strchr(src, 'e'), "e");
35a4f0c58cScgyurgyik   // Source string should not change.
3659547559Scgyurgyik   ASSERT_STREQ(src, "abcde");
37a4f0c58cScgyurgyik }
38a4f0c58cScgyurgyik 
TEST(LlvmLibcStrChrTest,FindsNullTerminator)39*1df0dbfcSMichael Jones TEST(LlvmLibcStrChrTest, FindsNullTerminator) {
40a4f0c58cScgyurgyik   const char *src = "abcde";
41a4f0c58cScgyurgyik 
42a4f0c58cScgyurgyik   // Should return null terminator.
43a4f0c58cScgyurgyik   ASSERT_STREQ(__llvm_libc::strchr(src, '\0'), "");
44a4f0c58cScgyurgyik   // Source string should not change.
4559547559Scgyurgyik   ASSERT_STREQ(src, "abcde");
46a4f0c58cScgyurgyik }
47a4f0c58cScgyurgyik 
TEST(LlvmLibcStrChrTest,CharacterNotWithinStringShouldReturnNullptr)48*1df0dbfcSMichael Jones TEST(LlvmLibcStrChrTest, CharacterNotWithinStringShouldReturnNullptr) {
49a4f0c58cScgyurgyik   // Since 'z' is not within the string, should return nullptr.
50a4f0c58cScgyurgyik   ASSERT_STREQ(__llvm_libc::strchr("123?", 'z'), nullptr);
51a4f0c58cScgyurgyik }
52a4f0c58cScgyurgyik 
TEST(LlvmLibcStrChrTest,TheSourceShouldNotChange)53*1df0dbfcSMichael Jones TEST(LlvmLibcStrChrTest, TheSourceShouldNotChange) {
54a4f0c58cScgyurgyik   const char *src = "abcde";
55a4f0c58cScgyurgyik   // When the character is found, the source string should not change.
56a4f0c58cScgyurgyik   __llvm_libc::strchr(src, 'd');
5759547559Scgyurgyik   ASSERT_STREQ(src, "abcde");
58a4f0c58cScgyurgyik   // Same case for when the character is not found.
59a4f0c58cScgyurgyik   __llvm_libc::strchr(src, 'z');
6059547559Scgyurgyik   ASSERT_STREQ(src, "abcde");
61a4f0c58cScgyurgyik   // Same case for when looking for nullptr.
62a4f0c58cScgyurgyik   __llvm_libc::strchr(src, '\0');
6359547559Scgyurgyik   ASSERT_STREQ(src, "abcde");
64a4f0c58cScgyurgyik }
65a4f0c58cScgyurgyik 
TEST(LlvmLibcStrChrTest,ShouldFindFirstOfDuplicates)66*1df0dbfcSMichael Jones TEST(LlvmLibcStrChrTest, ShouldFindFirstOfDuplicates) {
67a4f0c58cScgyurgyik   // '1' is duplicated in the string, but it should find the first copy.
68a4f0c58cScgyurgyik   ASSERT_STREQ(__llvm_libc::strchr("abc1def1ghi", '1'), "1def1ghi");
69a4f0c58cScgyurgyik 
70a4f0c58cScgyurgyik   const char *dups = "XXXXX";
71a4f0c58cScgyurgyik   // Should return original string since 'X' is the first character.
72a4f0c58cScgyurgyik   ASSERT_STREQ(__llvm_libc::strchr(dups, 'X'), dups);
73a4f0c58cScgyurgyik }
74a4f0c58cScgyurgyik 
TEST(LlvmLibcStrChrTest,EmptyStringShouldOnlyMatchNullTerminator)75*1df0dbfcSMichael Jones TEST(LlvmLibcStrChrTest, EmptyStringShouldOnlyMatchNullTerminator) {
76a4f0c58cScgyurgyik   // Null terminator should match.
77a4f0c58cScgyurgyik   ASSERT_STREQ(__llvm_libc::strchr("", '\0'), "");
78a4f0c58cScgyurgyik   // All other characters should not match.
79a4f0c58cScgyurgyik   ASSERT_STREQ(__llvm_libc::strchr("", 'Z'), nullptr);
80a4f0c58cScgyurgyik   ASSERT_STREQ(__llvm_libc::strchr("", '3'), nullptr);
81a4f0c58cScgyurgyik   ASSERT_STREQ(__llvm_libc::strchr("", '*'), nullptr);
82a4f0c58cScgyurgyik }
83