]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/lib/test.qh
take3: format 903 files
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / test.qh
1 #pragma once
2
3 // public:
4
5 /** Use UpperCamelCase for suite and test only */
6 #define TEST(suite, test) \
7         void _TEST_##suite##_##test(); \
8         [[accumulate]] int TEST_RunAll_accumulated(int f) \
9         { \
10                 if (!TEST_Run( #suite "_" #test)) { ++f; } \
11                 return = f; \
12         } \
13         void _TEST_##suite##_##test()
14
15 /** Must be present at the end of a test */
16 #define SUCCEED() (TEST_ok = true)
17
18 /** Add a failure, but continue */
19 #define ADD_FAILURE(msg) MACRO_BEGIN { ++TEST_failed; LOG_WARN(msg); } MACRO_END
20
21 /** Add a failure and return */
22 #define FAIL(msg) _TEST_ASSERT(ADD_FAILURE(msg))
23
24 #define HasFatalFailure() (TEST_fatal > 0)
25
26 bool RUN_ALL_TESTS();
27
28 // difference between expect/assert: assert returns early
29
30 #define EXPECT_EQ(expected_, actual_) \
31         MACRO_BEGIN \
32                 int expected = expected_; \
33                 int actual = actual_; \
34                 if ((expected) != (actual)) { \
35                         ADD_FAILURE(sprintf( \
36                                 "Value of: " #actual_ "\n" \
37                                 "  Actual: %d\n" \
38                                 "Expected: %d\n", \
39                                 actual, expected \
40                                 )); \
41                 } \
42         MACRO_END
43 #define ASSERT_EQ(expected, actual) _TEST_ASSERT(EXPECT_EQ(expected, actual))
44
45 #define EXPECT_TRUE(condition) EXPECT_EQ(true, condition)
46 #define ASSERT_TRUE(condition) ASSERT_EQ(true, condition)
47
48 #define EXPECT_FALSE(condition) EXPECT_EQ(false, condition)
49 #define ASSERT_FALSE(condition) ASSERT_EQ(false, condition)
50
51 #define EXPECT_NE(val1, val2) EXPECT_TRUE((val1) != (val2))
52 #define ASSERT_NE(val1, val2) _TEST_ASSERT(EXPECT_NE(val1, val2))
53
54 #define EXPECT_LT(val1, val2) EXPECT_TRUE((val1) < (val2))
55 #define ASSERT_LT(val1, val2) _TEST_ASSERT(EXPECT_LT(val1, val2))
56
57 #define EXPECT_LE(val1, val2) EXPECT_TRUE((val1) <= (val2))
58 #define ASSERT_LE(val1, val2) _TEST_ASSERT(EXPECT_LE(val1, val2))
59
60 #define EXPECT_GT(val1, val2) EXPECT_TRUE((val1) > (val2))
61 #define ASSERT_GT(val1, val2) _TEST_ASSERT(EXPECT_GT(val1, val2))
62
63 #define EXPECT_GE(val1, val2) EXPECT_TRUE((val1) >= (val2))
64 #define ASSERT_GE(val1, val2) _TEST_ASSERT(EXPECT_GE(val1, val2))
65
66 #define EXPECT_NO_FATAL_FAILURE(statement) EXPECT_NO_FATAL_FAILURE_(statement, {})
67 #define ASSERT_NO_FATAL_FAILURE(statement) EXPECT_NO_FATAL_FAILURE_(statement, { ++TEST_fatal; return; })
68
69 // private:
70
71 bool TEST_Run(string test);
72 int TEST_fatal;
73 bool TEST_ok;
74 int TEST_failed;
75
76 #define _TEST_ASSERT(statement) \
77         MACRO_BEGIN \
78                 LAMBDA(statement); \
79                 ++TEST_fatal; return; \
80         MACRO_END
81
82 #define EXPECT_NO_FATAL_FAILURE__(statement, then) \
83         MACRO_BEGIN \
84                 int TEST_prevfatal = TEST_fatal; \
85                 LAMBDA(statement); \
86                 if (TEST_fatal != TEST_prevfatal) { \
87                         LAMBDA(then); \
88                 } \
89         MACRO_END
90
91 #define EXPECT_NO_FATAL_FAILURE_(statement, then) \
92         EXPECT_NO_FATAL_FAILURE__(statement, { \
93                 LOG_WARNF( \
94                 "  Actual: %d fatal failures\n" \
95                 "Expected: no fatal failures\n", \
96                 TEST_fatal - TEST_prevfatal \
97                 ); \
98                 LAMBDA(then); \
99         })