#ifndef LLVM_LIBC_TEST_UNITTEST_FPEXCEPTMATCHER_H
#define LLVM_LIBC_TEST_UNITTEST_FPEXCEPTMATCHER_H
#include "src/__support/macros/config.h"
#include "test/UnitTest/Test.h"
#include "test/UnitTest/TestLogger.h"
#if LIBC_TEST_HAS_MATCHERS()
namespace LIBC_NAMESPACE_DECL {
namespace testing {
class FPExceptMatcher : public Matcher<bool> {
bool exceptionRaised;
public:
class FunctionCaller {
public:
virtual ~FunctionCaller() {}
virtual void call() = 0;
};
template <typename Func> static FunctionCaller *getFunctionCaller(Func func) {
struct Callable : public FunctionCaller {
Func f;
explicit Callable(Func theFunc) : f(theFunc) {}
void call() override { f(); }
};
return new Callable(func);
}
explicit FPExceptMatcher(FunctionCaller *func);
bool match(bool unused) { return exceptionRaised; }
void explainError() override {
tlog << "A floating point exception should have been raised but it "
<< "wasn't\n";
}
};
}
}
#define ASSERT_RAISES_FP_EXCEPT(func) \
ASSERT_THAT( \
true, \
LIBC_NAMESPACE::testing::FPExceptMatcher( \
LIBC_NAMESPACE::testing::FPExceptMatcher::getFunctionCaller(func)))
#else
#define ASSERT_RAISES_FP_EXCEPT(func) ASSERT_DEATH(func, WITH_SIGNAL(SIGFPE))
#endif
#endif