7
7
#include < catch2/catch_test_macros.hpp>
8
8
9
9
#include < iterator>
10
+ #include < optional>
10
11
#include < string>
11
12
#include < string_view>
12
13
13
14
namespace {
14
15
bool panicked{};
16
+ std::string_view expected_why{};
17
+ std::optional<int > expected_arg{};
15
18
16
19
struct injected_handler {
17
- template <stdx::ct_string Why, typename ... Ts>
18
- static auto panic (Ts &&...) noexcept -> void {
19
- static_assert (std::string_view{Why}.starts_with (" Hello" ));
20
+ template <stdx::ct_string Why, typename ... Args>
21
+ static auto panic (Args &&...args) noexcept -> void {
22
+ constexpr auto s = std::string_view{Why};
23
+ CAPTURE (s);
24
+ CHECK (s.ends_with (expected_why));
20
25
panicked = true ;
26
+ if (expected_arg) {
27
+ CHECK (sizeof ...(Args) == 1 );
28
+ if constexpr (sizeof ...(Args) == 1 ) {
29
+ CHECK (*expected_arg == (args, ...));
30
+ }
31
+ }
21
32
}
22
33
};
23
34
@@ -31,34 +42,57 @@ inline auto logging::config<> =
31
42
template <> inline auto stdx::panic_handler<> = injected_handler{};
32
43
33
44
TEST_CASE (" CIB_FATAL logs the string" , " [log]" ) {
45
+ expected_why = {};
46
+ expected_arg.reset ();
47
+ buffer.clear ();
48
+
34
49
CIB_FATAL (" Hello" );
35
50
CAPTURE (buffer);
36
- CHECK (buffer.substr (buffer. size () - std::size ( " Hello" )) == " Hello \n " );
51
+ CHECK (buffer.find ( " Hello" ) != std::string::npos );
37
52
}
38
53
39
54
TEST_CASE (" CIB_FATAL respects the log module" , " [log]" ) {
55
+ expected_why = {};
56
+ expected_arg.reset ();
57
+ buffer.clear ();
58
+
40
59
CIB_LOG_MODULE (" test" );
41
60
CIB_FATAL (" Hello" );
42
61
CAPTURE (buffer);
43
- CHECK (buffer.substr (buffer.size () - std::size (" FATAL [test]: Hello" )) ==
44
- " FATAL [test]: Hello\n " );
62
+ CHECK (buffer.find (" FATAL [test]: Hello" ) != std::string::npos);
45
63
}
46
64
47
65
TEST_CASE (" CIB_FATAL calls compile-time panic" , " [log]" ) {
66
+ expected_why = " Hello" ;
67
+ expected_arg.reset ();
68
+ buffer.clear ();
48
69
panicked = false ;
70
+
49
71
CIB_FATAL (" Hello" );
50
72
CHECK (panicked);
51
73
}
52
74
53
75
TEST_CASE (" CIB_FATAL pre-formats arguments passed to panic" , " [log]" ) {
76
+ expected_why = " Hello 42" ;
77
+ expected_arg.reset ();
78
+ buffer.clear ();
54
79
panicked = false ;
55
- CIB_FATAL (" {}" , " Hello" _sc);
80
+
81
+ CIB_FATAL (" {} {}" , " Hello" _sc, sc::int_<42 >);
82
+ CAPTURE (buffer);
83
+ CHECK (buffer.find (" Hello 42" ) != std::string::npos);
56
84
CHECK (panicked);
57
85
}
58
86
59
87
TEST_CASE (" CIB_FATAL can format stack arguments" , " [log]" ) {
88
+ expected_why = " Hello {}" ;
89
+ expected_arg = 42 ;
90
+ buffer.clear ();
60
91
panicked = false ;
92
+
61
93
auto x = 42 ;
62
94
CIB_FATAL (" Hello {}" , x);
95
+ CAPTURE (buffer);
96
+ CHECK (buffer.find (" Hello 42" ) != std::string::npos);
63
97
CHECK (panicked);
64
98
}
0 commit comments