Annotation of embedaddon/expat/tests/minicheck.c, revision 1.1.1.1
1.1 misho 1: /* Miniature re-implementation of the "check" library.
2: *
3: * This is intended to support just enough of check to run the Expat
4: * tests. This interface is based entirely on the portion of the
5: * check library being used.
6: */
7:
8: #include <stdio.h>
9: #include <stdlib.h>
10: #include <setjmp.h>
11: #include <assert.h>
12:
13: #include "minicheck.h"
14:
15: Suite *
16: suite_create(char *name)
17: {
18: Suite *suite = (Suite *) calloc(1, sizeof(Suite));
19: if (suite != NULL) {
20: suite->name = name;
21: }
22: return suite;
23: }
24:
25: TCase *
26: tcase_create(char *name)
27: {
28: TCase *tc = (TCase *) calloc(1, sizeof(TCase));
29: if (tc != NULL) {
30: tc->name = name;
31: }
32: return tc;
33: }
34:
35: void
36: suite_add_tcase(Suite *suite, TCase *tc)
37: {
38: assert(suite != NULL);
39: assert(tc != NULL);
40: assert(tc->next_tcase == NULL);
41:
42: tc->next_tcase = suite->tests;
43: suite->tests = tc;
44: }
45:
46: void
47: tcase_add_checked_fixture(TCase *tc,
48: tcase_setup_function setup,
49: tcase_teardown_function teardown)
50: {
51: assert(tc != NULL);
52: tc->setup = setup;
53: tc->teardown = teardown;
54: }
55:
56: void
57: tcase_add_test(TCase *tc, tcase_test_function test)
58: {
59: assert(tc != NULL);
60: if (tc->allocated == tc->ntests) {
61: int nalloc = tc->allocated + 100;
62: size_t new_size = sizeof(tcase_test_function) * nalloc;
63: tcase_test_function *new_tests = realloc(tc->tests, new_size);
64: assert(new_tests != NULL);
65: if (new_tests != tc->tests) {
66: free(tc->tests);
67: tc->tests = new_tests;
68: }
69: tc->allocated = nalloc;
70: }
71: tc->tests[tc->ntests] = test;
72: tc->ntests++;
73: }
74:
75: SRunner *
76: srunner_create(Suite *suite)
77: {
78: SRunner *runner = calloc(1, sizeof(SRunner));
79: if (runner != NULL) {
80: runner->suite = suite;
81: }
82: return runner;
83: }
84:
85: static jmp_buf env;
86:
87: static char const *_check_current_function = NULL;
88: static int _check_current_lineno = -1;
89: static char const *_check_current_filename = NULL;
90:
91: void
92: _check_set_test_info(char const *function, char const *filename, int lineno)
93: {
94: _check_current_function = function;
95: _check_current_lineno = lineno;
96: _check_current_filename = filename;
97: }
98:
99:
100: static void
101: add_failure(SRunner *runner, int verbosity)
102: {
103: runner->nfailures++;
104: if (verbosity >= CK_VERBOSE) {
105: printf("%s:%d: %s\n", _check_current_filename,
106: _check_current_lineno, _check_current_function);
107: }
108: }
109:
110: void
111: srunner_run_all(SRunner *runner, int verbosity)
112: {
113: Suite *suite;
114: TCase *tc;
115: assert(runner != NULL);
116: suite = runner->suite;
117: tc = suite->tests;
118: while (tc != NULL) {
119: int i;
120: for (i = 0; i < tc->ntests; ++i) {
121: runner->nchecks++;
122:
123: if (tc->setup != NULL) {
124: /* setup */
125: if (setjmp(env)) {
126: add_failure(runner, verbosity);
127: continue;
128: }
129: tc->setup();
130: }
131: /* test */
132: if (setjmp(env)) {
133: add_failure(runner, verbosity);
134: continue;
135: }
136: (tc->tests[i])();
137:
138: /* teardown */
139: if (tc->teardown != NULL) {
140: if (setjmp(env)) {
141: add_failure(runner, verbosity);
142: continue;
143: }
144: tc->teardown();
145: }
146: }
147: tc = tc->next_tcase;
148: }
149: if (verbosity) {
150: int passed = runner->nchecks - runner->nfailures;
151: double percentage = ((double) passed) / runner->nchecks;
152: int display = (int) (percentage * 100);
153: printf("%d%%: Checks: %d, Failed: %d\n",
154: display, runner->nchecks, runner->nfailures);
155: }
156: }
157:
158: void
159: _fail_unless(int condition, const char *file, int line, char *msg)
160: {
161: /* Always print the error message so it isn't lost. In this case,
162: we have a failure, so there's no reason to be quiet about what
163: it is.
164: */
165: if (msg != NULL)
166: printf("%s", msg);
167: longjmp(env, 1);
168: }
169:
170: int
171: srunner_ntests_failed(SRunner *runner)
172: {
173: assert(runner != NULL);
174: return runner->nfailures;
175: }
176:
177: void
178: srunner_free(SRunner *runner)
179: {
180: free(runner->suite);
181: free(runner);
182: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>