//===-- ErrnoSetterMatcher.h ------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_LIBC_TEST_ERRNOSETTERMATCHER_H #define LLVM_LIBC_TEST_ERRNOSETTERMATCHER_H #include "src/errno/llvmlibc_errno.h" #include "utils/UnitTest/Test.h" namespace __llvm_libc { namespace testing { namespace internal { extern "C" const char *strerror(int); template class ErrnoSetterMatcher : public Matcher { T ExpectedReturn; T ActualReturn; int ExpectedErrno; int ActualErrno; public: ErrnoSetterMatcher(T ExpectedReturn, int ExpectedErrno) : ExpectedReturn(ExpectedReturn), ExpectedErrno(ExpectedErrno) {} void explainError(testutils::StreamWrapper &OS) override { if (ActualReturn != ExpectedReturn) OS << "Expected return to be " << ExpectedReturn << " but got " << ActualReturn << ".\nExpecte errno to be " << strerror(ExpectedErrno) << " but got " << strerror(ActualErrno) << ".\n"; else OS << "Correct value " << ExpectedReturn << " was returned\nBut errno was unexpectely set to " << strerror(ActualErrno) << ".\n"; } bool match(T Got) { ActualReturn = Got; ActualErrno = llvmlibc_errno; llvmlibc_errno = 0; return Got == ExpectedReturn && ActualErrno == ExpectedErrno; } }; } // namespace internal namespace ErrnoSetterMatcher { template static internal::ErrnoSetterMatcher Succeeds(RetT ExpectedReturn = 0, int ExpectedErrno = 0) { return {ExpectedReturn, ExpectedErrno}; } template static internal::ErrnoSetterMatcher Fails(int ExpectedErrno, RetT ExpectedReturn = -1) { return {ExpectedReturn, ExpectedErrno}; } } // namespace ErrnoSetterMatcher } // namespace testing } // namespace __llvm_libc #endif // LLVM_LIBC_TEST_ERRNOSETTERMATCHER_H