1*431ea2d0SNick Desaulniers //===-- Unittests for bcmp ------------------------------------------------===// 2*431ea2d0SNick Desaulniers // 3*431ea2d0SNick Desaulniers // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*431ea2d0SNick Desaulniers // See https://llvm.org/LICENSE.txt for license information. 5*431ea2d0SNick Desaulniers // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*431ea2d0SNick Desaulniers // 7*431ea2d0SNick Desaulniers //===----------------------------------------------------------------------===// 8*431ea2d0SNick Desaulniers 9*431ea2d0SNick Desaulniers #include "src/__support/macros/config.h" 10*431ea2d0SNick Desaulniers #include "src/strings/bcmp.h" 11*431ea2d0SNick Desaulniers #include "test/UnitTest/Test.h" 12*431ea2d0SNick Desaulniers #include "test/UnitTest/TestLogger.h" 13*431ea2d0SNick Desaulniers #include "test/src/string/memory_utils/memory_check_utils.h" 14*431ea2d0SNick Desaulniers 15*431ea2d0SNick Desaulniers namespace LIBC_NAMESPACE_DECL { 16*431ea2d0SNick Desaulniers 17*431ea2d0SNick Desaulniers TEST(LlvmLibcBcmpTest, CmpZeroByte) { 18*431ea2d0SNick Desaulniers const char *lhs = "ab"; 19*431ea2d0SNick Desaulniers const char *rhs = "bc"; 20*431ea2d0SNick Desaulniers ASSERT_EQ(LIBC_NAMESPACE::bcmp(lhs, rhs, 0), 0); 21*431ea2d0SNick Desaulniers } 22*431ea2d0SNick Desaulniers 23*431ea2d0SNick Desaulniers TEST(LlvmLibcBcmpTest, LhsRhsAreTheSame) { 24*431ea2d0SNick Desaulniers const char *lhs = "ab"; 25*431ea2d0SNick Desaulniers const char *rhs = "ab"; 26*431ea2d0SNick Desaulniers ASSERT_EQ(LIBC_NAMESPACE::bcmp(lhs, rhs, 2), 0); 27*431ea2d0SNick Desaulniers } 28*431ea2d0SNick Desaulniers 29*431ea2d0SNick Desaulniers TEST(LlvmLibcBcmpTest, LhsBeforeRhsLexically) { 30*431ea2d0SNick Desaulniers const char *lhs = "ab"; 31*431ea2d0SNick Desaulniers const char *rhs = "ac"; 32*431ea2d0SNick Desaulniers ASSERT_NE(LIBC_NAMESPACE::bcmp(lhs, rhs, 2), 0); 33*431ea2d0SNick Desaulniers } 34*431ea2d0SNick Desaulniers 35*431ea2d0SNick Desaulniers TEST(LlvmLibcBcmpTest, LhsAfterRhsLexically) { 36*431ea2d0SNick Desaulniers const char *lhs = "ac"; 37*431ea2d0SNick Desaulniers const char *rhs = "ab"; 38*431ea2d0SNick Desaulniers ASSERT_NE(LIBC_NAMESPACE::bcmp(lhs, rhs, 2), 0); 39*431ea2d0SNick Desaulniers } 40*431ea2d0SNick Desaulniers 41*431ea2d0SNick Desaulniers // Adapt CheckBcmp signature to bcmp. 42*431ea2d0SNick Desaulniers static inline int Adaptor(cpp::span<char> p1, cpp::span<char> p2, size_t size) { 43*431ea2d0SNick Desaulniers return LIBC_NAMESPACE::bcmp(p1.begin(), p2.begin(), size); 44*431ea2d0SNick Desaulniers } 45*431ea2d0SNick Desaulniers 46*431ea2d0SNick Desaulniers TEST(LlvmLibcBcmpTest, SizeSweep) { 47*431ea2d0SNick Desaulniers static constexpr size_t kMaxSize = 400; 48*431ea2d0SNick Desaulniers Buffer Buffer1(kMaxSize); 49*431ea2d0SNick Desaulniers Buffer Buffer2(kMaxSize); 50*431ea2d0SNick Desaulniers Randomize(Buffer1.span()); 51*431ea2d0SNick Desaulniers for (size_t size = 0; size < kMaxSize; ++size) { 52*431ea2d0SNick Desaulniers auto span1 = Buffer1.span().subspan(0, size); 53*431ea2d0SNick Desaulniers auto span2 = Buffer2.span().subspan(0, size); 54*431ea2d0SNick Desaulniers const bool OK = CheckBcmp<Adaptor>(span1, span2, size); 55*431ea2d0SNick Desaulniers if (!OK) 56*431ea2d0SNick Desaulniers testing::tlog << "Failed at size=" << size << '\n'; 57*431ea2d0SNick Desaulniers ASSERT_TRUE(OK); 58*431ea2d0SNick Desaulniers } 59*431ea2d0SNick Desaulniers } 60*431ea2d0SNick Desaulniers 61*431ea2d0SNick Desaulniers } // namespace LIBC_NAMESPACE_DECL 62