summaryrefslogtreecommitdiff
path: root/include/al/test.h
blob: bed3102b2f84df022f0179ee1d9acb305c12caa1 (plain)
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#ifndef _AL_TEST_H
#define _AL_TEST_H

#include "lib.h"
#include "macros.h"

#define AL_TEST_START_GROUP(name) \
    al_printf("Group \""name"\":\n")

#define AL_TEST_END_GROUP() \
    return true

#define AL_TEST_RUN(test) \
    if (!test()) return false;

#define AL_TEST_START(name) \
    do { \
        al_printf("  "name"..."); \
        al_fflush(stdout); \
    } while (0)

#define AL_TEST_END() \
    al_printf("OK\n"); \
    return true

#define AL_TEST_DEF(a, b, T, cmp, explain) \
    do { \
        AL_TEST_TYPE_##T ac = a; \
        AL_TEST_TYPE_##T bc = b; \
        if (cmp) { \
            al_printf("FAIL "#a"("AL_TEST_FMT_##T") "explain" "#b"("AL_TEST_FMT_##T")\n", \
                AL_TEST_PRINTF_##T(ac), AL_TEST_PRINTF_##T(bc)); \
            return false; \
        } \
    } while (0)

#define AL_TEST_EQ(a, b, T) \
    AL_TEST_DEF(a, b, T, (AL_TEST_CMP_##T(ac, bc) != 0), \
        "is not equal to")

#define AL_TEST_NEQ(a, b, T) \
    AL_TEST_DEF(a, b, T, (AL_TEST_CMP_##T(ac, bc) == 0), \
        "is equal to")

#define AL_TEST_GT(a, b, T) \
    AL_TEST_DEF(a, b, T, (AL_TEST_CMP_##T(ac, bc) != 1), \
        "is less than or equal to")

#define AL_TEST_GTE(a, b, T) \
    AL_TEST_DEF(a, b, T, (AL_TEST_CMP_##T(ac, bc) != 0 && AL_TEST_CMP_##T(ac, bc) != 1), \
        "is less than")

#define AL_TEST_LT(a, b, T) \
    AL_TEST_DEF(a, b, T, (AL_TEST_CMP_##T(ac, bc) != -1), \
        "is greater than or equal to")

#define AL_TEST_LTE(a, b, T) \
    AL_TEST_DEF(a, b, T, (AL_TEST_CMP_##T(ac, bc) != 0 && AL_TEST_CMP_##T(ac, bc) != -1), \
        "is greater than")

#define AL_TEST_TRUE(a) \
    AL_TEST_DEF(a, true, bool, (AL_TEST_CMP_bool(ac, bc) != 0), \
        "is not")

#define AL_TEST_FALSE(a) \
    AL_TEST_DEF(a, false, bool, (AL_TEST_CMP_bool(ac, bc) != 0), \
        "is not")

// bool
static inline s32 al_test_bool_cmp(bool a, bool b)
{
    return (a == b) ? 0 : 1;
}

#define AL_TEST_CMP_bool al_test_bool_cmp
#define AL_TEST_TYPE_bool bool

#define AL_TEST_FMT_bool "%s"
#define AL_TEST_PRINTF_bool(b) BOOLSTR(b)

// u8
static inline s32 al_test_u8_cmp(u8 a, u8 b)
{
    if (a == b) return 0;
    else if (a < b) return -1;
    else return 1;
}

#define AL_TEST_CMP_u8 al_test_u8_cmp
#define AL_TEST_TYPE_u8 u8

#define AL_TEST_FMT_u8 "%hhu"
#define AL_TEST_PRINTF_u8(i) i

// u16
static inline s32 al_test_u16_cmp(u16 a, u16 b)
{
    if (a == b) return 0;
    else if (a < b) return -1;
    else return 1;
}

#define AL_TEST_CMP_u16 al_test_u16_cmp
#define AL_TEST_TYPE_u16 u16

#define AL_TEST_FMT_u16 "%hu"
#define AL_TEST_PRINTF_u16(i) i

// u32
static inline s32 al_test_u32_cmp(u32 a, u32 b)
{
    if (a == b) return 0;
    else if (a < b) return -1;
    else return 1;
}

#define AL_TEST_CMP_u32 al_test_u32_cmp
#define AL_TEST_TYPE_u32 u32

#define AL_TEST_FMT_u32 "%u"
#define AL_TEST_PRINTF_u32(i) i

// s32
static inline s32 al_test_s32_cmp(s32 a, s32 b)
{
    if (a == b) return 0;
    else if (a < b) return -1;
    else return 1;
}

#define AL_TEST_CMP_s32 al_test_s32_cmp
#define AL_TEST_TYPE_s32 s32

#define AL_TEST_FMT_s32 "%d"
#define AL_TEST_PRINTF_s32(i) i

// s64
static inline s32 al_test_s64_cmp(s64 a, s64 b)
{
    if (a == b) return 0;
    else if (a < b) return -1;
    else return 1;
}

#define AL_TEST_CMP_s64 al_test_s64_cmp
#define AL_TEST_TYPE_s64 s64

#define AL_TEST_FMT_s64 "%ld"
#define AL_TEST_PRINTF_s64(i) i

// size_t
static inline s32 al_test_size_t_cmp(size_t a, size_t b)
{
    if (a == b) return 0;
    else if (a < b) return -1;
    else return 1;
}

#define AL_TEST_CMP_size_t al_test_size_t_cmp
#define AL_TEST_TYPE_size_t size_t

#define AL_TEST_FMT_size_t "%zu"
#define AL_TEST_PRINTF_size_t(i) i

// ptrdiff_t
static inline s32 al_test_ptrdiff_t_cmp(ptrdiff_t a, ptrdiff_t b)
{
    if (a == b) return 0;
    else if (a < b) return -1;
    else return 1;
}

#define AL_TEST_CMP_ptrdiff_t al_test_ptrdiff_t_cmp
#define AL_TEST_TYPE_ptrdiff_t ptrdiff_t

#define AL_TEST_FMT_ptrdiff_t "%zd"
#define AL_TEST_PRINTF_ptrdiff_t(i) i

// pointer
static inline s32 al_test_ptr_cmp(void *a, void *b)
{
    if (a == b) return 0;
    else if (a < b) return -1;
    else return 1;
}

#define AL_TEST_CMP_ptr al_test_ptr_cmp
#define AL_TEST_TYPE_ptr void *

#define AL_TEST_FMT_ptr "%p"
#define AL_TEST_PRINTF_ptr(i) i

#endif // _AL_TEST_H