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 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 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 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 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 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 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 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 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 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 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