5 #include <ccan/cppmagic/cppmagic.h>
6 #include <ccan/tap/tap.h>
8 static inline void check1(const char *orig, const char *expand,
11 ok(strcmp(expand, match) == 0,
12 "%s => %s : %s", orig, expand, match);
15 #define CHECK1(orig, match) \
16 check1(#orig, CPPMAGIC_STRINGIFY(orig), match)
18 #define TESTRECURSE() R CPPMAGIC_DEFER1(_TESTRECURSE) ()()
19 #define _TESTRECURSE() TESTRECURSE
21 #define TESTMAP1(x) <<x>>
23 #define TESTMAP2(x) [[ x
24 #define TESTMAP3(x) x ]]
26 #define TEST2MAP(x, y) x ** y
32 CHECK1(CPPMAGIC_NOTHING(), "");
33 CHECK1(CPPMAGIC_GLUE2(a, b), "ab");
35 CHECK1(CPPMAGIC_1ST(a), "a");
36 CHECK1(CPPMAGIC_1ST(a, b), "a");
37 CHECK1(CPPMAGIC_1ST(a, b, c), "a");
39 CHECK1(CPPMAGIC_2ND(a, b), "b");
40 CHECK1(CPPMAGIC_2ND(a, b, c), "b");
42 CHECK1(CPPMAGIC_ISZERO(0), "1");
43 CHECK1(CPPMAGIC_ISZERO(1), "0");
44 CHECK1(CPPMAGIC_ISZERO(123), "0");
45 CHECK1(CPPMAGIC_ISZERO(abc), "0");
47 CHECK1(CPPMAGIC_NONZERO(0), "0");
48 CHECK1(CPPMAGIC_NONZERO(1), "1");
49 CHECK1(CPPMAGIC_NONZERO(123), "1");
50 CHECK1(CPPMAGIC_NONZERO(abc), "1");
52 CHECK1(CPPMAGIC_NONEMPTY(), "0");
53 CHECK1(CPPMAGIC_NONEMPTY(0), "1");
54 CHECK1(CPPMAGIC_NONEMPTY(a, b, c), "1");
56 CHECK1(CPPMAGIC_ISEMPTY(), "1");
57 CHECK1(CPPMAGIC_ISEMPTY(0), "0");
58 CHECK1(CPPMAGIC_ISEMPTY(a, b, c), "0");
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");
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 ()()");
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>>");
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");
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");
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)),
87 CHECK1(CPPMAGIC_MAP(TESTMAP2, CPPMAGIC_MAP(TESTMAP3, a, b, c)),
88 "[[ a ]] , [[ b ]] , [[ c ]]");
90 /* This exits depending on whether all tests passed */