1af1315c2SSiva Chandra Reddy //===-- MemoryMatcher.cpp ---------------------------------------*- C++ -*-===// 2af1315c2SSiva Chandra Reddy // 3af1315c2SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4af1315c2SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 5af1315c2SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6af1315c2SSiva Chandra Reddy // 7af1315c2SSiva Chandra Reddy //===----------------------------------------------------------------------===// 8af1315c2SSiva Chandra Reddy 9af1315c2SSiva Chandra Reddy #include "MemoryMatcher.h" 10af1315c2SSiva Chandra Reddy 11*a0c4f854SMichael Jones #include "src/__support/ctype_utils.h" 125ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 13dcf296b5SSiva Chandra Reddy #include "test/UnitTest/Test.h" 14dcf296b5SSiva Chandra Reddy 15d2be9826SRoland McGrath #if LIBC_TEST_HAS_MATCHERS() 16d2be9826SRoland McGrath 17b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::testing::tlog; 18dcf296b5SSiva Chandra Reddy 195ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 20af1315c2SSiva Chandra Reddy namespace testing { 21af1315c2SSiva Chandra Reddy 22af1315c2SSiva Chandra Reddy template <typename T> 23af1315c2SSiva Chandra Reddy bool equals(const cpp::span<T> &Span1, const cpp::span<T> &Span2, 24af1315c2SSiva Chandra Reddy bool &mismatch_size, size_t &mismatch_index) { 25af1315c2SSiva Chandra Reddy if (Span1.size() != Span2.size()) { 26af1315c2SSiva Chandra Reddy mismatch_size = true; 27af1315c2SSiva Chandra Reddy return false; 28af1315c2SSiva Chandra Reddy } 29af1315c2SSiva Chandra Reddy for (size_t Index = 0; Index < Span1.size(); ++Index) 30af1315c2SSiva Chandra Reddy if (Span1[Index] != Span2[Index]) { 31af1315c2SSiva Chandra Reddy mismatch_index = Index; 32af1315c2SSiva Chandra Reddy return false; 33af1315c2SSiva Chandra Reddy } 34af1315c2SSiva Chandra Reddy return true; 35af1315c2SSiva Chandra Reddy } 36af1315c2SSiva Chandra Reddy 37af1315c2SSiva Chandra Reddy bool MemoryMatcher::match(MemoryView actualValue) { 38af1315c2SSiva Chandra Reddy actual = actualValue; 39af1315c2SSiva Chandra Reddy return equals(expected, actual, mismatch_size, mismatch_index); 40af1315c2SSiva Chandra Reddy } 41af1315c2SSiva Chandra Reddy 42dcf296b5SSiva Chandra Reddy static void display(char C) { 43dcf296b5SSiva Chandra Reddy const auto print = [](unsigned char I) { 44*a0c4f854SMichael Jones tlog << static_cast<char>(LIBC_NAMESPACE::internal::toupper( 45*a0c4f854SMichael Jones LIBC_NAMESPACE::internal::int_to_b36_char(I))); 46af1315c2SSiva Chandra Reddy }; 47af1315c2SSiva Chandra Reddy print(static_cast<unsigned char>(C) / 16); 48af1315c2SSiva Chandra Reddy print(static_cast<unsigned char>(C) & 15); 49af1315c2SSiva Chandra Reddy } 50af1315c2SSiva Chandra Reddy 51dcf296b5SSiva Chandra Reddy static void display(MemoryView View) { 52af1315c2SSiva Chandra Reddy for (auto C : View) { 53dcf296b5SSiva Chandra Reddy tlog << ' '; 54dcf296b5SSiva Chandra Reddy display(C); 55af1315c2SSiva Chandra Reddy } 56af1315c2SSiva Chandra Reddy } 57af1315c2SSiva Chandra Reddy 58dcf296b5SSiva Chandra Reddy void MemoryMatcher::explainError() { 59af1315c2SSiva Chandra Reddy if (mismatch_size) { 60dcf296b5SSiva Chandra Reddy tlog << "Size mismatch :"; 61dcf296b5SSiva Chandra Reddy tlog << "expected : "; 62dcf296b5SSiva Chandra Reddy tlog << expected.size(); 63dcf296b5SSiva Chandra Reddy tlog << '\n'; 64dcf296b5SSiva Chandra Reddy tlog << "actual : "; 65dcf296b5SSiva Chandra Reddy tlog << actual.size(); 66dcf296b5SSiva Chandra Reddy tlog << '\n'; 67af1315c2SSiva Chandra Reddy } else { 68dcf296b5SSiva Chandra Reddy tlog << "Mismatch at position : "; 69dcf296b5SSiva Chandra Reddy tlog << mismatch_index; 70dcf296b5SSiva Chandra Reddy tlog << " / "; 71dcf296b5SSiva Chandra Reddy tlog << expected.size(); 72dcf296b5SSiva Chandra Reddy tlog << "\n"; 73dcf296b5SSiva Chandra Reddy tlog << "expected :"; 74dcf296b5SSiva Chandra Reddy display(expected); 75dcf296b5SSiva Chandra Reddy tlog << '\n'; 76dcf296b5SSiva Chandra Reddy tlog << "actual :"; 77dcf296b5SSiva Chandra Reddy display(actual); 78dcf296b5SSiva Chandra Reddy tlog << '\n'; 79af1315c2SSiva Chandra Reddy } 80af1315c2SSiva Chandra Reddy } 81af1315c2SSiva Chandra Reddy 82af1315c2SSiva Chandra Reddy } // namespace testing 835ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 84d2be9826SRoland McGrath 85d2be9826SRoland McGrath #endif // LIBC_TEST_HAS_MATCHERS() 86