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