#include "src/string/strchrnul.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcStrChrNulTest, FindsFirstCharacter) {
const char *src = "abcde";
ASSERT_STREQ(LIBC_NAMESPACE::strchrnul(src, 'a'), "abcde");
ASSERT_STREQ(src, "abcde");
}
TEST(LlvmLibcStrChrNulTest, FindsMiddleCharacter) {
const char *src = "abcde";
ASSERT_STREQ(LIBC_NAMESPACE::strchrnul(src, 'c'), "cde");
ASSERT_STREQ(src, "abcde");
}
TEST(LlvmLibcStrChrNulTest, FindsLastCharacterThatIsNotNullTerminator) {
const char *src = "abcde";
ASSERT_STREQ(LIBC_NAMESPACE::strchrnul(src, 'e'), "e");
ASSERT_STREQ(src, "abcde");
}
TEST(LlvmLibcStrChrNulTest, FindsNullTerminator) {
const char *src = "abcde";
ASSERT_STREQ(LIBC_NAMESPACE::strchrnul(src, '\0'), "");
ASSERT_STREQ(src, "abcde");
}
TEST(LlvmLibcStrChrNulTest,
CharacterNotWithinStringShouldReturnNullTerminator) {
const char *src = "123?";
char *result = LIBC_NAMESPACE::strchrnul(src, 'z');
ASSERT_EQ(*result, '\0');
char *term = const_cast<char *>(src) + 4;
ASSERT_EQ(result, term);
}
TEST(LlvmLibcStrChrNulTest, TheSourceShouldNotChange) {
const char *src = "abcde";
LIBC_NAMESPACE::strchrnul(src, 'd');
ASSERT_STREQ(src, "abcde");
LIBC_NAMESPACE::strchrnul(src, 'z');
ASSERT_STREQ(src, "abcde");
LIBC_NAMESPACE::strchrnul(src, '\0');
ASSERT_STREQ(src, "abcde");
}
TEST(LlvmLibcStrChrNulTest, ShouldFindFirstOfDuplicates) {
ASSERT_STREQ(LIBC_NAMESPACE::strchrnul("abc1def1ghi", '1'), "1def1ghi");
const char *dups = "XXXXX";
ASSERT_STREQ(LIBC_NAMESPACE::strchrnul(dups, 'X'), dups);
}
TEST(LlvmLibcStrChrNulTest, EmptyStringShouldOnlyMatchNullTerminator) {
ASSERT_STREQ(LIBC_NAMESPACE::strchrnul("", '\0'), "");
char *result = LIBC_NAMESPACE::strchrnul("", 'Z');
ASSERT_EQ(*result, '\0');
result = LIBC_NAMESPACE::strchrnul("", '3');
ASSERT_EQ(*result, '\0');
result = LIBC_NAMESPACE::strchrnul("", '*');
ASSERT_EQ(*result, '\0');
}