xref: /llvm-project/libc/test/src/string/memmem_test.cpp (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
1718729e9SCaslyn Tonelli //===-- Unittests for memmem ----------------------------------------------===//
2718729e9SCaslyn Tonelli //
3718729e9SCaslyn Tonelli // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4718729e9SCaslyn Tonelli // See https://llvm.org/LICENSE.txt for license information.
5718729e9SCaslyn Tonelli // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6718729e9SCaslyn Tonelli //
7718729e9SCaslyn Tonelli //===----------------------------------------------------------------------===//
8718729e9SCaslyn Tonelli 
9*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h"
10718729e9SCaslyn Tonelli #include "src/string/memmem.h"
11718729e9SCaslyn Tonelli #include "test/UnitTest/Test.h"
12718729e9SCaslyn Tonelli 
13718729e9SCaslyn Tonelli #include "src/string/string_utils.h"
14718729e9SCaslyn Tonelli 
15*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL {
16718729e9SCaslyn Tonelli 
17718729e9SCaslyn Tonelli TEST(LlvmLibcMemmemTest, EmptyHaystackEmptyNeedleReturnsHaystck) {
18718729e9SCaslyn Tonelli   char *h = nullptr;
19718729e9SCaslyn Tonelli   char *n = nullptr;
20b6bc9d72SGuillaume Chatelet   void *result = LIBC_NAMESPACE::memmem(h, 0, n, 0);
21718729e9SCaslyn Tonelli   ASSERT_EQ(static_cast<char *>(result), h);
22718729e9SCaslyn Tonelli }
23718729e9SCaslyn Tonelli 
24718729e9SCaslyn Tonelli TEST(LlvmLibcMemmemTest, EmptyHaystackNonEmptyNeedleReturnsNull) {
25718729e9SCaslyn Tonelli   char *h = nullptr;
26718729e9SCaslyn Tonelli   char n[] = {'a', 'b', 'c'};
27b6bc9d72SGuillaume Chatelet   void *result = LIBC_NAMESPACE::memmem(h, 0, n, sizeof(n));
28718729e9SCaslyn Tonelli   ASSERT_EQ(result, static_cast<void *>(nullptr));
29718729e9SCaslyn Tonelli }
30718729e9SCaslyn Tonelli 
31718729e9SCaslyn Tonelli TEST(LlvmLibcMemmemTest, EmptyNeedleReturnsHaystack) {
32718729e9SCaslyn Tonelli   char h[] = {'a', 'b', 'c'};
33718729e9SCaslyn Tonelli   char *n = nullptr;
34b6bc9d72SGuillaume Chatelet   void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, 0);
359902fc8dSGuillaume Chatelet   ASSERT_EQ(static_cast<char *>(result), h + 0);
36718729e9SCaslyn Tonelli }
37718729e9SCaslyn Tonelli 
38718729e9SCaslyn Tonelli TEST(LlvmLibcMemmemTest, ExactMatchReturnsHaystack) {
39718729e9SCaslyn Tonelli   char h[] = {'a', 'b', 'c'};
40718729e9SCaslyn Tonelli   char n[] = {'a', 'b', 'c'};
41b6bc9d72SGuillaume Chatelet   void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
429902fc8dSGuillaume Chatelet   ASSERT_EQ(static_cast<char *>(result), h + 0);
43718729e9SCaslyn Tonelli }
44718729e9SCaslyn Tonelli 
45718729e9SCaslyn Tonelli TEST(LlvmLibcMemmemTest, ReturnFirstMatchOfNeedle) {
46718729e9SCaslyn Tonelli   char h[] = {'a', 'a', 'b', 'c'};
47718729e9SCaslyn Tonelli   char n[] = {'a'};
48b6bc9d72SGuillaume Chatelet   void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
499902fc8dSGuillaume Chatelet   ASSERT_EQ(static_cast<char *>(result), h + 0);
50718729e9SCaslyn Tonelli }
51718729e9SCaslyn Tonelli 
52718729e9SCaslyn Tonelli TEST(LlvmLibcMemmemTest, ReturnFirstExactMatchOfNeedle) {
53718729e9SCaslyn Tonelli   {
54718729e9SCaslyn Tonelli     char h[] = {'a', 'b', 'a', 'c', 'a', 'a'};
55718729e9SCaslyn Tonelli     char n[] = {'a', 'a'};
56b6bc9d72SGuillaume Chatelet     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
57718729e9SCaslyn Tonelli     ASSERT_EQ(static_cast<char *>(result), h + 4);
58718729e9SCaslyn Tonelli   }
59718729e9SCaslyn Tonelli   {
60718729e9SCaslyn Tonelli     char h[] = {'a', 'a', 'b', 'a', 'b', 'a'};
61718729e9SCaslyn Tonelli     char n[] = {'a', 'b', 'a'};
62b6bc9d72SGuillaume Chatelet     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
63718729e9SCaslyn Tonelli     ASSERT_EQ(static_cast<char *>(result), h + 1);
64718729e9SCaslyn Tonelli   }
65718729e9SCaslyn Tonelli }
66718729e9SCaslyn Tonelli 
67718729e9SCaslyn Tonelli TEST(LlvmLibcMemmemTest, NullTerminatorDoesNotInterruptMatch) {
68718729e9SCaslyn Tonelli   char h[] = {'\0', 'a', 'b'};
69718729e9SCaslyn Tonelli   char n[] = {'a', 'b'};
70b6bc9d72SGuillaume Chatelet   void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
71718729e9SCaslyn Tonelli   ASSERT_EQ(static_cast<char *>(result), h + 1);
72718729e9SCaslyn Tonelli }
73718729e9SCaslyn Tonelli 
74718729e9SCaslyn Tonelli TEST(LlvmLibcMemmemTest, ReturnNullIfNoExactMatch) {
75718729e9SCaslyn Tonelli   {
76718729e9SCaslyn Tonelli     char h[] = {'a'};
77718729e9SCaslyn Tonelli     char n[] = {'a', 'a'};
78b6bc9d72SGuillaume Chatelet     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
79718729e9SCaslyn Tonelli     ASSERT_EQ(result, static_cast<void *>(nullptr));
80718729e9SCaslyn Tonelli   }
81718729e9SCaslyn Tonelli   {
82718729e9SCaslyn Tonelli     char h[] = {'a', 'A'};
83718729e9SCaslyn Tonelli     char n[] = {'a', 'a'};
84b6bc9d72SGuillaume Chatelet     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
85718729e9SCaslyn Tonelli     ASSERT_EQ(result, static_cast<void *>(nullptr));
86718729e9SCaslyn Tonelli   }
87718729e9SCaslyn Tonelli   {
88718729e9SCaslyn Tonelli     char h[] = {'a'};
89718729e9SCaslyn Tonelli     char n[] = {'a', '\0'};
90b6bc9d72SGuillaume Chatelet     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
91718729e9SCaslyn Tonelli     ASSERT_EQ(result, static_cast<void *>(nullptr));
92718729e9SCaslyn Tonelli   }
93718729e9SCaslyn Tonelli   {
94718729e9SCaslyn Tonelli     char h[] = {'\0'};
95718729e9SCaslyn Tonelli     char n[] = {'\0', '\0'};
96b6bc9d72SGuillaume Chatelet     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
97718729e9SCaslyn Tonelli     ASSERT_EQ(result, static_cast<void *>(nullptr));
98718729e9SCaslyn Tonelli   }
99718729e9SCaslyn Tonelli }
100718729e9SCaslyn Tonelli 
101718729e9SCaslyn Tonelli TEST(LlvmLibcMemmemTest, ReturnMatchOfSpecifiedNeedleLength) {
102718729e9SCaslyn Tonelli   {
103718729e9SCaslyn Tonelli     char h[] = {'a', 'b', 'c'};
104718729e9SCaslyn Tonelli     char n[] = {'x', 'y', 'z'};
105b6bc9d72SGuillaume Chatelet     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, 0);
1069902fc8dSGuillaume Chatelet     ASSERT_EQ(static_cast<char *>(result), h + 0);
107718729e9SCaslyn Tonelli   }
108718729e9SCaslyn Tonelli   {
109718729e9SCaslyn Tonelli     char h[] = {'a', 'b', 'c'};
110718729e9SCaslyn Tonelli     char n[] = {'b', 'c', 'a'};
111b6bc9d72SGuillaume Chatelet     void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, 2);
112718729e9SCaslyn Tonelli     ASSERT_EQ(static_cast<char *>(result), h + 1);
113718729e9SCaslyn Tonelli   }
114718729e9SCaslyn Tonelli }
115718729e9SCaslyn Tonelli 
116718729e9SCaslyn Tonelli TEST(LlvmLibcMemmemTest, ReturnNullIfInadequateHaystackLength) {
117718729e9SCaslyn Tonelli   {
118718729e9SCaslyn Tonelli     char h[] = {'a', 'b', 'c'};
119718729e9SCaslyn Tonelli     char n[] = {'c'};
120b6bc9d72SGuillaume Chatelet     void *result = LIBC_NAMESPACE::memmem(h, 2, n, sizeof(n));
121718729e9SCaslyn Tonelli     ASSERT_EQ(result, static_cast<void *>(nullptr));
122718729e9SCaslyn Tonelli   }
123718729e9SCaslyn Tonelli   {
124718729e9SCaslyn Tonelli     char h[] = {'a', 'b', 'c'};
125718729e9SCaslyn Tonelli     char n[] = {'a', 'b', 'c'};
126b6bc9d72SGuillaume Chatelet     void *result = LIBC_NAMESPACE::memmem(h, 2, n, sizeof(n));
127718729e9SCaslyn Tonelli     ASSERT_EQ(result, static_cast<void *>(nullptr));
128718729e9SCaslyn Tonelli   }
129718729e9SCaslyn Tonelli }
130*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL
131