xref: /aosp_15_r20/external/llvm-libc/test/src/string/strstr_test.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Unittests for strstr ----------------------------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #include "src/string/strstr.h"
10*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
11*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,NeedleNotInHaystack)12*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, NeedleNotInHaystack) {
13*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "12345";
14*71db0c75SAndroid Build Coastguard Worker   const char *needle = "a";
15*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), nullptr);
16*71db0c75SAndroid Build Coastguard Worker }
17*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,NeedleIsEmptyString)18*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, NeedleIsEmptyString) {
19*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "12345";
20*71db0c75SAndroid Build Coastguard Worker   const char *needle = "";
21*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), haystack);
22*71db0c75SAndroid Build Coastguard Worker }
23*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,HaystackIsEmptyString)24*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, HaystackIsEmptyString) {
25*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "";
26*71db0c75SAndroid Build Coastguard Worker   const char *needle = "12345";
27*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), nullptr);
28*71db0c75SAndroid Build Coastguard Worker }
29*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,HaystackAndNeedleAreEmptyStrings)30*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, HaystackAndNeedleAreEmptyStrings) {
31*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "";
32*71db0c75SAndroid Build Coastguard Worker   const char *needle = "";
33*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), "");
34*71db0c75SAndroid Build Coastguard Worker }
35*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,HaystackAndNeedleAreSingleCharacters)36*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, HaystackAndNeedleAreSingleCharacters) {
37*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "a";
38*71db0c75SAndroid Build Coastguard Worker   // Same characer returns that character.
39*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, /*needle=*/"a"), "a");
40*71db0c75SAndroid Build Coastguard Worker   // Different character returns nullptr.
41*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, /*needle=*/"b"), nullptr);
42*71db0c75SAndroid Build Coastguard Worker }
43*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,NeedleEqualToHaystack)44*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, NeedleEqualToHaystack) {
45*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "12345";
46*71db0c75SAndroid Build Coastguard Worker   const char *needle = "12345";
47*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), "12345");
48*71db0c75SAndroid Build Coastguard Worker }
49*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,NeedleSmallerThanHaystack)50*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, NeedleSmallerThanHaystack) {
51*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "12345";
52*71db0c75SAndroid Build Coastguard Worker   const char *needle = "345";
53*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), "345");
54*71db0c75SAndroid Build Coastguard Worker }
55*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,NeedleLargerThanHaystack)56*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, NeedleLargerThanHaystack) {
57*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "123";
58*71db0c75SAndroid Build Coastguard Worker   const char *needle = "12345";
59*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), nullptr);
60*71db0c75SAndroid Build Coastguard Worker }
61*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,NeedleAtBeginning)62*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, NeedleAtBeginning) {
63*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "12345";
64*71db0c75SAndroid Build Coastguard Worker   const char *needle = "12";
65*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), "12345");
66*71db0c75SAndroid Build Coastguard Worker }
67*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,NeedleInMiddle)68*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, NeedleInMiddle) {
69*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "abcdefghi";
70*71db0c75SAndroid Build Coastguard Worker   const char *needle = "def";
71*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), "defghi");
72*71db0c75SAndroid Build Coastguard Worker }
73*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,NeedleDirectlyBeforeNullTerminator)74*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, NeedleDirectlyBeforeNullTerminator) {
75*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "abcdefghi";
76*71db0c75SAndroid Build Coastguard Worker   const char *needle = "ghi";
77*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), "ghi");
78*71db0c75SAndroid Build Coastguard Worker }
79*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,NeedlePastNullTerminator)80*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, NeedlePastNullTerminator) {
81*71db0c75SAndroid Build Coastguard Worker   const char haystack[5] = {'1', '2', '\0', '3', '4'};
82*71db0c75SAndroid Build Coastguard Worker   // Shouldn't find anything after the null terminator.
83*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, /*needle=*/"3"), nullptr);
84*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, /*needle=*/"4"), nullptr);
85*71db0c75SAndroid Build Coastguard Worker }
86*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,PartialNeedle)87*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, PartialNeedle) {
88*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "la_ap_lap";
89*71db0c75SAndroid Build Coastguard Worker   const char *needle = "lap";
90*71db0c75SAndroid Build Coastguard Worker   // Shouldn't find la or ap.
91*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), "lap");
92*71db0c75SAndroid Build Coastguard Worker }
93*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,MisspelledNeedle)94*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, MisspelledNeedle) {
95*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "atalloftwocities...wait, tale";
96*71db0c75SAndroid Build Coastguard Worker   const char *needle = "tale";
97*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), "tale");
98*71db0c75SAndroid Build Coastguard Worker }
99*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,AnagramNeedle)100*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, AnagramNeedle) {
101*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "dgo_ogd_god_odg_gdo_dog";
102*71db0c75SAndroid Build Coastguard Worker   const char *needle = "dog";
103*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, needle), "dog");
104*71db0c75SAndroid Build Coastguard Worker }
105*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcStrStrTest,MorphedNeedle)106*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcStrStrTest, MorphedNeedle) {
107*71db0c75SAndroid Build Coastguard Worker   // Changes a single letter in the needle to mismatch with the haystack.
108*71db0c75SAndroid Build Coastguard Worker   const char *haystack = "once upon a time";
109*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, "time"), "time");
110*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, "lime"), nullptr);
111*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, "tome"), nullptr);
112*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, "tire"), nullptr);
113*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(LIBC_NAMESPACE::strstr(haystack, "timo"), nullptr);
114*71db0c75SAndroid Build Coastguard Worker }
115