forked from kimgr/getopt_port
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtestfx.h
122 lines (97 loc) · 4.22 KB
/
testfx.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#ifndef INCLUDED_TESTFX_H
#define INCLUDED_TESTFX_H
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <stdexcept>
#include <stdio.h>
#include <sstream>
// Test registration
typedef void (*testfunction)();
void register_test(const char* name, testfunction f);
int run_tests();
struct test_registrar {
test_registrar(const char* name, testfunction f) {
register_test(name, f);
}
};
#define PASTE(prefix, unique) prefix ## unique
#define MAKE_NAME(prefix, unique) PASTE(prefix, unique)
#define TEST(func) \
static void func(); \
test_registrar MAKE_NAME(MAKE_NAME(r, func), __LINE__) (#func, func); \
\
static void func()
#define TEST_F(fixture, func) \
static void func##bootstrap(); \
static void func(fixture& f); \
test_registrar MAKE_NAME(MAKE_NAME(r, func), __LINE__) (#func, func##bootstrap); \
\
static void func##bootstrap() { \
fixture f; \
func(f); \
} \
static void func(fixture& f) \
// Assertions
struct assertion_failure : std::runtime_error {
explicit assertion_failure(const char* message)
: std::runtime_error(message) {
}
};
#define assert_equal(expected, actual) \
check_equal(expected, actual, __FUNCTION__, #expected, #actual)
static std::string printable(const char* s) {
if (s == NULL)
return "NULL";
return "\"" + std::string(s) + "\"";
}
static std::string printable(char c) {
if (isprint(c)) {
return "\'" + std::string(1, c) + "\'";
} else {
char buf[64] = {0};
sprintf(buf, "%d", c);
return std::string(buf);
}
}
template< class T1, class T2 >
static std::string build_message(const char* function, const char* expected_expr, const char* actual_expr, const T1& expected, const T2& actual) {
std::ostringstream builder;
builder << function << ": assertion (" << expected_expr << " == " << actual_expr << ") failed -- expected " << expected << ", was " << actual;
return builder.str();
}
static std::string build_message(const char* function, const char* expected_expr, const char* actual_expr, const char* expected, const char* actual) {
return build_message(function, expected_expr, actual_expr, printable(expected), printable(actual));
}
static std::string build_message(const char* function, const char* expected_expr, const char* actual_expr, int expected, int actual) {
return build_message(function, expected_expr, actual_expr, printable(expected), printable(actual));
}
static std::string build_message(const char* function, const char* expected_expr, const char* actual_expr, char expected, int actual) {
return build_message(function, expected_expr, actual_expr, printable(expected), printable(actual));
}
static std::string build_message(const char* function, const char* expected_expr, const char* actual_expr, char expected, char actual) {
return build_message(function, expected_expr, actual_expr, printable(expected), printable(actual));
}
template< class T1, class T2 >
static void check_equal(const T1& expected, const T2& actual, const char* function, const char* expected_expr, const char* actual_expr) {
if (expected != actual) {
throw assertion_failure(build_message(function, expected_expr, actual_expr, expected, actual).c_str());
}
}
static void check_equal(const char* expected, const char* actual, const char* function, const char* expected_expr, const char* actual_expr) {
if (expected == actual)
return;
if (expected == NULL || actual == NULL) {
throw assertion_failure(build_message(function, expected_expr, actual_expr, expected, actual).c_str());
}
if (strcmp(expected, actual)) {
throw assertion_failure(build_message(function, expected_expr, actual_expr, expected, actual).c_str());
}
}
static void check_equal(const char* expected, char* actual, const char* function, const char* expected_expr, const char* actual_expr) {
check_equal(expected, (const char*)actual, function, expected_expr, actual_expr);
}
static void check_equal(char* expected, char* actual, const char* function, const char* expected_expr, const char* actual_expr) {
check_equal((const char*)expected, (const char*)actual, function, expected_expr, actual_expr);
}
#endif // INCLUDED_TESTFX_H