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