forked from mmitch/gbsplay
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test.h
76 lines (62 loc) · 1.68 KB
/
test.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
/*
* gbsplay is a Gameboy sound player
*
* 2011 (C) by Tobias Diedrich <ranma+gbsplay@tdiedrich.de>
* Licensed under GNU GPL.
*/
#ifndef _TEST_H_
#define _TEST_H_
#include <stdio.h>
#define ASSERT_EQUAL(fmt, a, b) do { \
typeof(a) aa; \
typeof(a) bb; \
aa = a; \
bb = b; \
if (aa != bb) { \
fprintf(stderr, "FAIL\nTest failed: "fmt"!="fmt" at %s:%d\n", aa, bb, __FILE__, __LINE__); \
exit(1); \
} \
} while(0)
#ifndef ENABLE_TEST
#define test static __attribute__((unused))
#define TEST(func) static __attribute__((unused)) int test_ ## func
#define TEST_EOF static __attribute__((unused)) int test_eof
#else
#include "config.h"
#include "common.h"
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#define test __attribute__((section(".test")))
#define test_entries __attribute__((section(".test_entries")))
typedef void (*test_fn)(void);
struct test_entry {
test_fn func;
const char* name;
};
#define TEST(func) test_entries struct test_entry test_ ## func = { func, #func }
#define TEST_EOF test_entries struct test_entry test__end = { 0 };
test_entries struct test_entry test__head = { 0 };
test_entries struct test_entry test__align = { 0 };
extern struct test_entry test__end;
int main(int argc, char** argv)
{
void *head = &test__head;
void *align = &test__align;
if ((align - head) != sizeof(test__head)) {
fprintf(stderr, "Expected alignment constraints don't hold!\n");
exit(1);
}
struct test_entry *tests = &test__head;
int num_tests = (&test__end - &test__head);
int i;
printf(" %d tests:\n", num_tests-2);
for (i=2; i<num_tests; i++) {
printf(" %s: ", tests[i].name);
tests[i].func();
printf("ok\n");
}
return 0;
}
#endif /* ENABLE_TEST */
#endif