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