xref: /aosp_15_r20/external/llvm-libc/test/src/string/memmem_test.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1 //===-- Unittests for memmem ----------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "src/__support/macros/config.h"
10 #include "src/string/memmem.h"
11 #include "test/UnitTest/Test.h"
12 
13 #include "src/string/string_utils.h"
14 
15 namespace LIBC_NAMESPACE_DECL {
16 
TEST(LlvmLibcMemmemTest,EmptyHaystackEmptyNeedleReturnsHaystck)17 TEST(LlvmLibcMemmemTest, EmptyHaystackEmptyNeedleReturnsHaystck) {
18   char *h = nullptr;
19   char *n = nullptr;
20   void *result = LIBC_NAMESPACE::memmem(h, 0, n, 0);
21   ASSERT_EQ(static_cast<char *>(result), h);
22 }
23 
TEST(LlvmLibcMemmemTest,EmptyHaystackNonEmptyNeedleReturnsNull)24 TEST(LlvmLibcMemmemTest, EmptyHaystackNonEmptyNeedleReturnsNull) {
25   char *h = nullptr;
26   char n[] = {'a', 'b', 'c'};
27   void *result = LIBC_NAMESPACE::memmem(h, 0, n, sizeof(n));
28   ASSERT_EQ(result, static_cast<void *>(nullptr));
29 }
30 
TEST(LlvmLibcMemmemTest,EmptyNeedleReturnsHaystack)31 TEST(LlvmLibcMemmemTest, EmptyNeedleReturnsHaystack) {
32   char h[] = {'a', 'b', 'c'};
33   char *n = nullptr;
34   void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, 0);
35   ASSERT_EQ(static_cast<char *>(result), h + 0);
36 }
37 
TEST(LlvmLibcMemmemTest,ExactMatchReturnsHaystack)38 TEST(LlvmLibcMemmemTest, ExactMatchReturnsHaystack) {
39   char h[] = {'a', 'b', 'c'};
40   char n[] = {'a', 'b', 'c'};
41   void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
42   ASSERT_EQ(static_cast<char *>(result), h + 0);
43 }
44 
TEST(LlvmLibcMemmemTest,ReturnFirstMatchOfNeedle)45 TEST(LlvmLibcMemmemTest, ReturnFirstMatchOfNeedle) {
46   char h[] = {'a', 'a', 'b', 'c'};
47   char n[] = {'a'};
48   void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
49   ASSERT_EQ(static_cast<char *>(result), h + 0);
50 }
51 
TEST(LlvmLibcMemmemTest,ReturnFirstExactMatchOfNeedle)52 TEST(LlvmLibcMemmemTest, ReturnFirstExactMatchOfNeedle) {
53   {
54     char h[] = {'a', 'b', 'a', 'c', 'a', 'a'};
55     char n[] = {'a', 'a'};
56     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
57     ASSERT_EQ(static_cast<char *>(result), h + 4);
58   }
59   {
60     char h[] = {'a', 'a', 'b', 'a', 'b', 'a'};
61     char n[] = {'a', 'b', 'a'};
62     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
63     ASSERT_EQ(static_cast<char *>(result), h + 1);
64   }
65 }
66 
TEST(LlvmLibcMemmemTest,NullTerminatorDoesNotInterruptMatch)67 TEST(LlvmLibcMemmemTest, NullTerminatorDoesNotInterruptMatch) {
68   char h[] = {'\0', 'a', 'b'};
69   char n[] = {'a', 'b'};
70   void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
71   ASSERT_EQ(static_cast<char *>(result), h + 1);
72 }
73 
TEST(LlvmLibcMemmemTest,ReturnNullIfNoExactMatch)74 TEST(LlvmLibcMemmemTest, ReturnNullIfNoExactMatch) {
75   {
76     char h[] = {'a'};
77     char n[] = {'a', 'a'};
78     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
79     ASSERT_EQ(result, static_cast<void *>(nullptr));
80   }
81   {
82     char h[] = {'a', 'A'};
83     char n[] = {'a', 'a'};
84     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
85     ASSERT_EQ(result, static_cast<void *>(nullptr));
86   }
87   {
88     char h[] = {'a'};
89     char n[] = {'a', '\0'};
90     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
91     ASSERT_EQ(result, static_cast<void *>(nullptr));
92   }
93   {
94     char h[] = {'\0'};
95     char n[] = {'\0', '\0'};
96     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
97     ASSERT_EQ(result, static_cast<void *>(nullptr));
98   }
99 }
100 
TEST(LlvmLibcMemmemTest,ReturnMatchOfSpecifiedNeedleLength)101 TEST(LlvmLibcMemmemTest, ReturnMatchOfSpecifiedNeedleLength) {
102   {
103     char h[] = {'a', 'b', 'c'};
104     char n[] = {'x', 'y', 'z'};
105     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, 0);
106     ASSERT_EQ(static_cast<char *>(result), h + 0);
107   }
108   {
109     char h[] = {'a', 'b', 'c'};
110     char n[] = {'b', 'c', 'a'};
111     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, 2);
112     ASSERT_EQ(static_cast<char *>(result), h + 1);
113   }
114 }
115 
TEST(LlvmLibcMemmemTest,ReturnNullIfInadequateHaystackLength)116 TEST(LlvmLibcMemmemTest, ReturnNullIfInadequateHaystackLength) {
117   {
118     char h[] = {'a', 'b', 'c'};
119     char n[] = {'c'};
120     void *result = LIBC_NAMESPACE::memmem(h, 2, n, sizeof(n));
121     ASSERT_EQ(result, static_cast<void *>(nullptr));
122   }
123   {
124     char h[] = {'a', 'b', 'c'};
125     char n[] = {'a', 'b', 'c'};
126     void *result = LIBC_NAMESPACE::memmem(h, 2, n, sizeof(n));
127     ASSERT_EQ(result, static_cast<void *>(nullptr));
128   }
129 }
130 } // namespace LIBC_NAMESPACE_DECL
131