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