| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1 |
// Formatting library for C++ - custom Google Test assertions |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2 |
// |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
3 |
// Copyright (c) 2012 - present, Victor Zverovich |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
4 |
// All rights reserved. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
5 |
// |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
6 |
// For the license information refer to format.h. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
7 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
8 |
#ifndef FMT_GTEST_EXTRA_H_ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
9 |
#define FMT_GTEST_EXTRA_H_ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
10 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
11 |
#include <stdlib.h> // _invalid_parameter_handler |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
12 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
13 |
#include <string> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
14 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
15 |
#ifdef FMT_MODULE_TEST |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
16 |
import fmt; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
17 |
#else |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
18 |
# include "fmt/os.h" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
19 |
#endif // FMG_MODULE_TEST |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
20 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
21 |
#include "gmock/gmock.h" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
22 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
23 |
#define FMT_TEST_THROW_(statement, expected_exception, expected_message, fail) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
24 |
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
25 |
if (::testing::AssertionResult gtest_ar = ::testing::AssertionSuccess()) { \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
26 |
std::string gtest_expected_message = expected_message; \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
27 |
bool gtest_caught_expected = false; \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
28 |
try { \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
29 |
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
30 |
} catch (expected_exception const& e) { \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
31 |
if (gtest_expected_message != e.what()) { \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
32 |
gtest_ar << #statement \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
33 |
" throws an exception with a different message.\n" \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
34 |
<< "Expected: " << gtest_expected_message << "\n" \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
35 |
<< " Actual: " << e.what(); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
36 |
goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
37 |
} \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
38 |
gtest_caught_expected = true; \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
39 |
} catch (...) { \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
40 |
gtest_ar << "Expected: " #statement \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
41 |
" throws an exception of type " #expected_exception \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
42 |
".\n Actual: it throws a different type."; \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
43 |
goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
44 |
} \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
45 |
if (!gtest_caught_expected) { \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
46 |
gtest_ar << "Expected: " #statement \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
47 |
" throws an exception of type " #expected_exception \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
48 |
".\n Actual: it throws nothing."; \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
49 |
goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
50 |
} \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
51 |
} else \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
52 |
GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
53 |
: fail(gtest_ar.failure_message()) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
54 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
55 |
// Tests that the statement throws the expected exception and the exception's |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
56 |
// what() method returns expected message. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
57 |
#define EXPECT_THROW_MSG(statement, expected_exception, expected_message) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
58 |
FMT_TEST_THROW_(statement, expected_exception, expected_message, \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
59 |
GTEST_NONFATAL_FAILURE_) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
60 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
61 |
inline std::string system_error_message(int error_code, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
62 |
const std::string& message) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
63 |
auto ec = std::error_code(error_code, std::generic_category()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
64 |
return std::system_error(ec, message).what(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
65 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
66 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
67 |
#define EXPECT_SYSTEM_ERROR(statement, error_code, message) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
68 |
EXPECT_THROW_MSG(statement, std::system_error, \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
69 |
system_error_message(error_code, message)) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
70 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
71 |
#if FMT_USE_FCNTL |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
72 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
73 |
// Captures file output by redirecting it to a pipe. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
74 |
// The output it can handle is limited by the pipe capacity. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
75 |
class output_redirect { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
76 |
private: |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
77 |
FILE* file_; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
78 |
fmt::file original_; // Original file passed to redirector. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
79 |
fmt::file read_end_; // Read end of the pipe where the output is redirected. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
80 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
81 |
void flush(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
82 |
void restore(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
83 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
84 |
public: |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
85 |
explicit output_redirect(FILE* file); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
86 |
~output_redirect() FMT_NOEXCEPT; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
87 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
88 |
output_redirect(const output_redirect&) = delete; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
89 |
void operator=(const output_redirect&) = delete; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
90 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
91 |
// Restores the original file, reads output from the pipe into a string |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
92 |
// and returns it. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
93 |
std::string restore_and_read(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
94 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
95 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
96 |
# define FMT_TEST_WRITE_(statement, expected_output, file, fail) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
97 |
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
98 |
if (::testing::AssertionResult gtest_ar = ::testing::AssertionSuccess()) { \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
99 |
std::string gtest_expected_output = expected_output; \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
100 |
output_redirect gtest_redir(file); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
101 |
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
102 |
std::string gtest_output = gtest_redir.restore_and_read(); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
103 |
if (gtest_output != gtest_expected_output) { \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
104 |
gtest_ar << #statement " produces different output.\n" \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
105 |
<< "Expected: " << gtest_expected_output << "\n" \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
106 |
<< " Actual: " << gtest_output; \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
107 |
goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
108 |
} \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
109 |
} else \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
110 |
GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
111 |
: fail(gtest_ar.failure_message()) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
112 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
113 |
// Tests that the statement writes the expected output to file. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
114 |
# define EXPECT_WRITE(file, statement, expected_output) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
115 |
FMT_TEST_WRITE_(statement, expected_output, file, GTEST_NONFATAL_FAILURE_) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
116 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
117 |
# ifdef _MSC_VER |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
118 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
119 |
// Suppresses Windows assertions on invalid file descriptors, making |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
120 |
// POSIX functions return proper error codes instead of crashing on Windows. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
121 |
class suppress_assert { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
122 |
private: |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
123 |
_invalid_parameter_handler original_handler_; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
124 |
int original_report_mode_; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
125 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
126 |
static void handle_invalid_parameter(const wchar_t*, const wchar_t*, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
127 |
const wchar_t*, unsigned, uintptr_t) {} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
128 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
129 |
public: |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
130 |
suppress_assert() |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
131 |
: original_handler_( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
132 |
_set_invalid_parameter_handler(handle_invalid_parameter)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
133 |
original_report_mode_(_CrtSetReportMode(_CRT_ASSERT, 0)) {} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
134 |
~suppress_assert() { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
135 |
_set_invalid_parameter_handler(original_handler_); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
136 |
_CrtSetReportMode(_CRT_ASSERT, original_report_mode_); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
137 |
(void)original_report_mode_; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
138 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
139 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
140 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
141 |
# define SUPPRESS_ASSERT(statement) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
142 |
{ \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
143 |
suppress_assert sa; \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
144 |
statement; \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
145 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
146 |
# else |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
147 |
# define SUPPRESS_ASSERT(statement) statement |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
148 |
# endif // _MSC_VER |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
149 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
150 |
# define EXPECT_SYSTEM_ERROR_NOASSERT(statement, error_code, message) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
151 |
EXPECT_SYSTEM_ERROR(SUPPRESS_ASSERT(statement), error_code, message) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
152 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
153 |
// Attempts to read count characters from a file. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
154 |
std::string read(fmt::file& f, size_t count); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
155 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
156 |
# define EXPECT_READ(file, expected_content) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
157 |
EXPECT_EQ(expected_content, \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
158 |
read(file, fmt::string_view(expected_content).size())) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
159 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
160 |
#else |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
161 |
# define EXPECT_WRITE(file, statement, expected_output) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
162 |
do { \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
163 |
(void)(file); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
164 |
(void)(statement); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
165 |
(void)(expected_output); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
166 |
SUCCEED(); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
167 |
} while (false) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
168 |
#endif // FMT_USE_FCNTL |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
169 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
170 |
#endif // FMT_GTEST_EXTRA_H_ |
|
|
1970-01-01 00:00 |
171 |
|