]> git.ozlabs.org Git - ccan/blob - ccan/cppmagic/test/run.c
cppmagic: Tweak testcase to work on older clang versions
[ccan] / ccan / cppmagic / test / run.c
1 #include "config.h"
2
3 #include <string.h>
4
5 #include <ccan/cppmagic/cppmagic.h>
6 #include <ccan/tap/tap.h>
7
8 static inline void check1(const char *orig, const char *expand,
9                           const char *match)
10 {
11         ok(strcmp(expand, match) == 0,
12            "%s => %s : %s", orig, expand, match);
13 }
14
15 #define CHECK1(orig, match) \
16         check1(#orig, CPPMAGIC_STRINGIFY(orig), match)
17
18 #define TESTRECURSE()   R CPPMAGIC_DEFER1(_TESTRECURSE) ()()
19 #define _TESTRECURSE()  TESTRECURSE
20
21 #define TESTMAP1(x)     <<x>>
22
23 #define TESTMAP2(x)             [[ x
24 #define TESTMAP3(x)             x ]]
25
26 #define TEST2MAP(x, y)  x ** y
27
28 int main(void)
29 {
30         plan_tests(42);
31
32         CHECK1(CPPMAGIC_NOTHING(), "");
33         CHECK1(CPPMAGIC_GLUE2(a, b), "ab");
34
35         CHECK1(CPPMAGIC_1ST(a), "a");
36         CHECK1(CPPMAGIC_1ST(a, b), "a");
37         CHECK1(CPPMAGIC_1ST(a, b, c), "a");
38
39         CHECK1(CPPMAGIC_2ND(a, b), "b");
40         CHECK1(CPPMAGIC_2ND(a, b, c), "b");
41
42         CHECK1(CPPMAGIC_ISZERO(0), "1");
43         CHECK1(CPPMAGIC_ISZERO(1), "0");
44         CHECK1(CPPMAGIC_ISZERO(123), "0");
45         CHECK1(CPPMAGIC_ISZERO(abc), "0");
46
47         CHECK1(CPPMAGIC_NONZERO(0), "0");
48         CHECK1(CPPMAGIC_NONZERO(1), "1");
49         CHECK1(CPPMAGIC_NONZERO(123), "1");
50         CHECK1(CPPMAGIC_NONZERO(abc), "1");
51
52         CHECK1(CPPMAGIC_NONEMPTY(), "0");
53         CHECK1(CPPMAGIC_NONEMPTY(0), "1");
54         CHECK1(CPPMAGIC_NONEMPTY(a, b, c), "1");
55
56         CHECK1(CPPMAGIC_ISEMPTY(), "1");
57         CHECK1(CPPMAGIC_ISEMPTY(0), "0");
58         CHECK1(CPPMAGIC_ISEMPTY(a, b, c), "0");
59         
60         CHECK1(CPPMAGIC_IFELSE(0)(abc)(def), "def");
61         CHECK1(CPPMAGIC_IFELSE(1)(abc)(def), "abc");
62         CHECK1(CPPMAGIC_IFELSE(not zero)(abc)(def), "abc");
63
64         CHECK1(TESTRECURSE(), "R R _TESTRECURSE ()()");
65         CHECK1(CPPMAGIC_EVAL1(TESTRECURSE()), "R R R _TESTRECURSE ()()");
66         CHECK1(CPPMAGIC_EVAL2(TESTRECURSE()), "R R R R R _TESTRECURSE ()()");
67
68         CHECK1(CPPMAGIC_MAP(TESTMAP1), "");
69         CHECK1(CPPMAGIC_MAP(TESTMAP1, a), "<<a>>");
70         CHECK1(CPPMAGIC_MAP(TESTMAP1, a, b), "<<a>> , <<b>>");
71         CHECK1(CPPMAGIC_MAP(TESTMAP1, a, b, c), "<<a>> , <<b>> , <<c>>");
72
73         CHECK1(CPPMAGIC_2MAP(TEST2MAP), "");
74         CHECK1(CPPMAGIC_2MAP(TEST2MAP, a, 1), "a ** 1");
75         CHECK1(CPPMAGIC_2MAP(TEST2MAP, a, 1, b, 2), "a ** 1 , b ** 2");
76         
77         CHECK1(CPPMAGIC_JOIN(;), "");
78         CHECK1(CPPMAGIC_JOIN(;, a), "a");
79         CHECK1(CPPMAGIC_JOIN(;, a, b), "a ; b");
80         CHECK1(CPPMAGIC_JOIN(;, a, b, c), "a ; b ; c");
81
82         /* Check chaining of MAPs */
83         CHECK1(CPPMAGIC_MAP(TESTMAP2, CPPMAGIC_MAP(TESTMAP3)), "");
84         CHECK1(CPPMAGIC_MAP(TESTMAP2, CPPMAGIC_MAP(TESTMAP3, a)), "[[ a ]]");
85         CHECK1(CPPMAGIC_MAP(TESTMAP2, CPPMAGIC_MAP(TESTMAP3, a, b)),
86                "[[ a ]] , [[ b ]]");
87         CHECK1(CPPMAGIC_MAP(TESTMAP2, CPPMAGIC_MAP(TESTMAP3, a, b, c)),
88                "[[ a ]] , [[ b ]] , [[ c ]]");
89                                                    
90         /* This exits depending on whether all tests passed */
91         return exit_status();
92 }