valFuzz 1.2.0
Loading...
Searching...
No Matches
test.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// Author: Giovanni Santini
3// Mail: giovanni.santini@proton.me
4// Github: @San7o
5
6#pragma once
7
8#include <atomic>
9#include <deque>
10#include <fstream>
11#include <functional>
12#include <iostream>
13#include <mutex>
14#include <optional>
15#include <string>
16#include <thread>
17#include <tuple>
18#include <valfuzz/common.hpp>
19
20/* Assertions */
21
22#define ASSERT(cond) \
23 if (!(cond)) \
24 { \
25 valfuzz::set_has_failed_once(true); \
26 std::lock_guard<std::mutex> lock(valfuzz::get_stream_mutex()); \
27 std::cerr << "test: " << test_name << ", line: " << __LINE__ << ", "; \
28 std::cerr << "Assertion failed: " << #cond << std::endl; \
29 }
30
31#define ASSERT_EQ(a, b) \
32 if ((a) != (b)) \
33 { \
34 valfuzz::set_has_failed_once(true); \
35 std::lock_guard<std::mutex> lock(valfuzz::get_stream_mutex()); \
36 std::cerr << "test: " << test_name << ", line: " << __LINE__ << ", "; \
37 std::cerr << "Assertion failed: " << #a << " != " << #b << std::endl; \
38 }
39
40#define ASSERT_NE(a, b) \
41 if ((a) == (b)) \
42 { \
43 valfuzz::set_has_failed_once(true); \
44 std::lock_guard<std::mutex> lock(valfuzz::get_stream_mutex()); \
45 std::cerr << "test: " << test_name << ", line: " << __LINE__ << ", "; \
46 std::cerr << "Assertion failed: " << #a << " == " << #b << std::endl; \
47 }
48
49#define ASSERT_LT(a, b) \
50 if ((a) >= (b)) \
51 { \
52 valfuzz::set_has_failed_once(true); \
53 std::lock_guard<std::mutex> lock(valfuzz::get_stream_mutex()); \
54 std::cerr << "test: " << test_name << ", line: " << __LINE__ << ", "; \
55 std::cerr << "Assertion failed: " << #a << " < " << #b << std::endl; \
56 }
57
58#define ASSERT_LE(a, b) \
59 if ((a) > (b)) \
60 { \
61 valfuzz::set_has_failed_once(true); \
62 std::lock_guard<std::mutex> lock(valfuzz::get_stream_mutex()); \
63 std::cerr << "test: " << test_name << ", line: " << __LINE__ << ", "; \
64 std::cerr << "Assertion failed: " << #a << " <= " << #b << std::endl; \
65 }
66
67#define ASSERT_GT(a, b) \
68 if ((a) <= (b)) \
69 { \
70 valfuzz::set_has_failed_once(true); \
71 std::lock_guard<std::mutex> lock(valfuzz::get_stream_mutex()); \
72 std::cerr << "test: " << test_name << ", line: " << __LINE__ << ", "; \
73 std::cerr << "Assertion failed: " << #a << " > " << #b << std::endl; \
74 }
75
76#define ASSERT_GE(a, b) \
77 if ((a) < (b)) \
78 { \
79 valfuzz::set_has_failed_once(true); \
80 std::lock_guard<std::mutex> lock(valfuzz::get_stream_mutex()); \
81 std::cerr << "test: " << test_name << ", line: " << __LINE__ << ", "; \
82 std::cerr << "Assertion failed: " << #a << " >= " << #b << std::endl; \
83 }
84
85#define ASSERT_THROW(expr, exception) \
86 { \
87 bool exception_thrown = false; \
88 try \
89 { \
90 expr; \
91 } \
92 catch (const exception &e) \
93 { \
94 exception_thrown = true; \
95 } \
96 if (!exception_thrown) \
97 { \
98 valfuzz::set_has_failed_once(true); \
99 std::lock_guard<std::mutex> lock(valfuzz::get_stream_mutex()); \
100 std::cerr << "test: " << test_name << ", line: " << __LINE__ << ", "; \
101 std::cerr << "Exception not thrown: " << #exception << std::endl; \
102 } \
103 }
104
105#define ASSERT_NO_THROW(expr) \
106 { \
107 try \
108 { \
109 expr; \
110 } \
111 catch (...) \
112 { \
113 valfuzz::set_has_failed_once(true); \
114 std::lock_guard<std::mutex> lock(valfuzz::get_stream_mutex()); \
115 std::cerr << "test: " << test_name << ", line: " << __LINE__ << ", "; \
116 std::cerr << "Exception thrown" << std::endl; \
117 } \
118 }
119
120/* Tests */
121
122namespace valfuzz
123{
124
125std::deque<valfuzz::test_pair> &get_tests();
126std::mutex &get_test_mutex();
127long unsigned int get_num_tests();
128std::atomic<bool> &get_has_failed_once();
129
130std::function<void()> &get_function_execute_before();
131std::function<void()> &get_function_execute_after();
132
133void set_function_execute_before(std::function<void()> f);
134void set_function_execute_after(std::function<void()> f);
135void set_has_failed_once(bool has_failed_once);
136
137void add_test(const std::string &name, test_function test);
138
139std::optional<valfuzz::test_pair> pop_test_or_null();
140void run_one_test(const std::string &name);
141void _run_tests();
142void run_tests();
143
144#define TEST(name, pretty_name) \
145 void name([[maybe_unused]] const std::string &test_name); \
146 static struct name##_register \
147 { \
148 name##_register() \
149 { \
150 valfuzz::add_test(pretty_name, name); \
151 } \
152 } name##_register_instance; \
153 void name([[maybe_unused]] const std::string &test_name)
154
155#define BEFORE() \
156 void before(); \
157 static struct before##_register \
158 { \
159 before##_register() \
160 { \
161 valfuzz::set_function_execute_before(before); \
162 } \
163 } before##_register_instance; \
164 void before()
165
166#define AFTER() \
167 void after(); \
168 static struct after##_register \
169 { \
170 after##_register() \
171 { \
172 valfuzz::set_function_execute_after(after); \
173 } \
174 } after##_register_instance; \
175 void after()
176
177} // namespace valfuzz
std::deque< valfuzz::test_pair > & get_tests()
Definition test.cpp:11
std::function< void()> & get_function_execute_after()
Definition test.cpp:39
std::optional< valfuzz::test_pair > pop_test_or_null()
Definition test.cpp:70
void set_function_execute_before(std::function< void()> f)
Definition test.cpp:45
void _run_tests()
Definition test.cpp:110
long unsigned int get_num_tests()
Definition test.cpp:17
void run_tests()
Definition test.cpp:125
void run_one_test(const std::string &name)
Definition test.cpp:85
void set_function_execute_after(std::function< void()> f)
Definition test.cpp:51
std::mutex & get_test_mutex()
void set_has_failed_once(bool has_failed_once)
Definition test.cpp:57
std::function< void(std::string)> test_function
Definition common.hpp:18
std::atomic< bool > & get_has_failed_once()
Definition test.cpp:23
std::function< void()> & get_function_execute_before()
Definition test.cpp:33
void add_test(const std::string &name, test_function test)
Definition test.cpp:63