131 lines · cpp
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-exception6//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 15namespace LIBC_NAMESPACE_DECL {16 17TEST(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 24TEST(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 31TEST(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 38TEST(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 45TEST(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 52TEST(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 67TEST(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 74TEST(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 101TEST(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 116TEST(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_DECL131