1/*
2 * Copyright (c) 2013, Andreas Sandberg
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above
12 *    copyright notice, this list of conditions and the following
13 *    disclaimer in the documentation and/or other materials provided
14 *    with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 * OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#include "test_helper.h"
31
32#include <assert.h>
33#include <stdarg.h>
34#include <stdlib.h>
35
36unsigned test_current = 0;
37unsigned test_count = 0;
38unsigned test_fail_count = 0;
39
40void
41test_init(unsigned no_tests)
42{
43    assert(test_count == 0 && test_current == 0);
44
45    test_count = no_tests;
46    test_current = 1;
47    test_fail_count = 0;
48
49    printf("1..%u\n", no_tests);
50}
51
52void
53test_exit()
54{
55    if (test_fail_count)
56        exit(EXIT_FAILURE);
57    else
58        exit(EXIT_SUCCESS);
59}
60
61void
62test_bail(const char *fmt, ...)
63{
64    va_list ap;
65    va_start(ap, fmt);
66
67    printf("Bail out! ");
68    vprintf(fmt, ap);
69    printf("\n");
70
71    va_end(ap);
72
73    exit(EXIT_FAILURE);
74}
75
76void
77test_diag(const char *fmt, ...)
78{
79    va_list ap;
80    va_start(ap, fmt);
81
82    printf("# ");
83    vprintf(fmt, ap);
84    printf("\n");
85
86    va_end(ap);
87}
88
89static void
90test_vstatus(const char *status, const char *test,
91             const char *directive,
92             const char *fmt_why, va_list ap)
93{
94    printf("%s %i", status, test_current);
95
96    if (test && test[0] != '\0')
97        printf(" - %s", test);
98
99    if (directive && directive[0] != '\0') {
100        printf(" # %s ", directive);
101        if (fmt_why && fmt_why[0] != '\0')
102            vprintf(fmt_why, ap);
103    }
104    printf("\n");
105
106    ++test_current;
107}
108
109static void __attribute__((format (printf, 4, 5)))
110test_status(const char *status, const char *test,
111            const char *directive,
112            const char *fmt_why, ...)
113{
114    va_list ap;
115    va_start(ap, fmt_why);
116
117    test_vstatus(status, test, directive, fmt_why, ap);
118
119    va_end(ap);
120}
121
122void
123test_ok(const char *test)
124{
125    test_status("ok", test, NULL, NULL);
126}
127
128void
129test_fail(const char *test)
130{
131    test_status("not ok", test, NULL, NULL);
132    ++test_fail_count;
133}
134
135void
136test_skip(const char *test, const char *fmt_why, ...)
137{
138    va_list ap;
139    va_start(ap, fmt_why);
140
141    test_vstatus("ok", test, "SKIP", fmt_why, ap);
142
143    va_end(ap);
144}
145
146void
147test_todo(const char *test, const char *fmt_why, ...)
148{
149    va_list ap;
150    va_start(ap, fmt_why);
151
152    test_vstatus("not ok", test, "TODO", fmt_why, ap);
153
154    va_end(ap);
155
156    ++test_fail_count;
157}
158