]> begriffs open source - libtap/blob - tap.h
Add BAIL_OUT.
[libtap] / tap.h
1 #ifndef __TAP_H__
2 #define __TAP_H__
3
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7
8 #ifndef va_copy
9 #define va_copy(d,s) ((d) = (s))
10 #endif
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <stdarg.h>
15
16 int     vok_at_loc      (const char *file, int line, int test, const char *fmt,
17                          va_list args);
18 int     ok_at_loc       (const char *file, int line, int test, const char *fmt,
19                          ...);
20 int     is_at_loc       (const char *file, int line, const char *got,
21                          const char *expected, const char *fmt, ...);
22 int     isnt_at_loc     (const char *file, int line, const char *got,
23                          const char *expected, const char *fmt, ...);
24 int     cmp_ok_at_loc   (const char *file, int line, int a, const char *op,
25                          int b, const char *fmt, ...);
26 int     bail_out        (int ignore, const char *fmt, ...);
27 void    plan            (int tests);
28 int     diag            (const char *fmt, ...);
29 int     note            (const char *fmt, ...);
30 int     exit_status     (void);
31 void    skippy          (int n, const char *fmt, ...);
32 void    ctodo           (int ignore, const char *fmt, ...);
33 void    cendtodo        (void);
34
35 #define NO_PLAN          -1
36 #define ok(...)          ok_at_loc(__FILE__, __LINE__, __VA_ARGS__, NULL)
37 #define is(...)          is_at_loc(__FILE__, __LINE__, __VA_ARGS__, NULL)
38 #define isnt(...)        isnt_at_loc(__FILE__, __LINE__, __VA_ARGS__, NULL)
39 #define cmp_ok(...)      cmp_ok_at_loc(__FILE__, __LINE__, __VA_ARGS__, NULL)
40 #define done_testing     return exit_status()
41 #define BAIL_OUT(...)    bail_out(0, ## __VA_ARGS__, NULL)
42
43 #define skip(test, ...)  do {if (test) {skippy(__VA_ARGS__, NULL); break;}
44 #define endskip          } while (0)
45
46 #define todo(...)        ctodo(0, ## __VA_ARGS__, NULL)
47 #define endtodo          cendtodo()
48
49 #define dies_ok(code, ...)   dies_ok_common(code, 1, ## __VA_ARGS__)
50 #define lives_ok(code, ...)  dies_ok_common(code, 0, ## __VA_ARGS__)
51
52 #ifdef _WIN32
53 #define pass(...)        ok_at_loc(__FILE__, __LINE__, 1, __VA_ARGS__, NULL)
54 #define fail(...)        ok_at_loc(__FILE__, __LINE__, 0, __VA_ARGS__, NULL)
55 #define like(...)        skippy(1, "like is not implemented on MSWin32")
56 #define unlike(...)      like()
57 #define dies_ok_common(...) \
58     skippy(1, "Death detection is not supported on MSWin32")
59 #else
60 #define pass(...)        ok(1, ## __VA_ARGS__)
61 #define fail(...)        ok(0, ## __VA_ARGS__)
62 #define like(...)        like_at_loc(1, __FILE__, __LINE__, __VA_ARGS__, NULL)
63 #define unlike(...)      like_at_loc(0, __FILE__, __LINE__, __VA_ARGS__, NULL)
64 int     like_at_loc     (int for_match, const char *file, int line,
65                          const char *got, const char *expected,
66                          const char *fmt, ...);
67 #include <unistd.h>
68 #include <sys/types.h>
69 #include <sys/wait.h>
70 int tap_test_died (int status);
71 #define dies_ok_common(code, for_death, ...)                \
72     do {                                                    \
73         tap_test_died(1);                                   \
74         int cpid = fork();                                  \
75         switch (cpid) {                                     \
76         case -1:                                            \
77             perror("fork error");                           \
78             exit(EXIT_FAILURE);                             \
79         case 0: /* child  */                                \
80             close(1); close(2);                             \
81             code                                            \
82             tap_test_died(0);                               \
83             exit(EXIT_SUCCESS);                             \
84         }                                                   \
85         if (waitpid(cpid, NULL, 0) < 0) {                   \
86             perror("waitpid error");                        \
87             exit(EXIT_FAILURE);                             \
88         }                                                   \
89         int it_died = tap_test_died(0);                     \
90         if (!it_died) {code}                                \
91         ok(for_death ? it_died : !it_died, ## __VA_ARGS__); \
92     } while (0)
93 #endif
94
95 #ifdef __cplusplus
96 }
97 #endif
98
99 #endif
100