30#include <gtest/gtest-spi.h>
31#include <gtest/gtest.h>
51 class GTestFailure :
public std::runtime_error,
public FailureOrigin {
56 : std::runtime_error(message), origin_(std::move(origin)) {}
67 namespace gtest_hooks {
70 inline std::string current_test_name() {
71 const testing::TestInfo* info =
72 testing::UnitTest::GetInstance()->current_test_info();
73 if (info ==
nullptr) {
76 return std::string(info->test_suite_name()) +
"." +
82 inline std::string position(
const testing::TestPartResult& part) {
83 if (part.file_name() ==
nullptr) {
86 return std::string(part.file_name()) +
":" +
87 std::to_string(part.line_number());
96 collect_failures(
const testing::TestPartResultArray& recorded) {
98 for (
int i = 0; i < recorded.size(); i++) {
99 const testing::TestPartResult& part =
100 recorded.GetTestPartResult(i);
101 if (!part.failed()) {
104 if (!out.message.empty()) {
108 out.message += position(part) +
": " + part.message();
109 out.origin += position(part);
116 inline void run_case(
const std::function<
void()>& body) {
117 if (testing::UnitTest::GetInstance()->current_test_info() ==
122 testing::TestPartResultArray recorded;
124 testing::ScopedFakeTestPartResultReporter reporter(
125 testing::ScopedFakeTestPartResultReporter::
126 INTERCEPT_ONLY_CURRENT_THREAD,
130 Failures failures = collect_failures(recorded);
131 if (!failures.message.empty()) {
132 throw GTestFailure(
"hegel::GTestFailure at " +
140 [[maybe_unused]]
static const bool hegel_gtest_hooks_installed =
141 install_framework_hooks(
142 {>est_hooks::current_test_name, >est_hooks::run_case});
GTestFailure(std::string origin, const std::string &message)
Definition gtest.h:55
std::string failure_origin() const override
Definition gtest.h:59
Main namespace.
Definition config.h:29