xref: /aosp_15_r20/external/libconfig/tinytest/tinytest.c (revision 2e9d491483b805f09ea864149eadd5680efcc72a)
1*2e9d4914SAndroid Build Coastguard Worker /* ----------------------------------------------------------------------------
2*2e9d4914SAndroid Build Coastguard Worker    tinytest - A tiny C unit-testing library
3*2e9d4914SAndroid Build Coastguard Worker    Copyright (C) 2010-2018  Mark A Lindner
4*2e9d4914SAndroid Build Coastguard Worker 
5*2e9d4914SAndroid Build Coastguard Worker    This file is part of tinytest.
6*2e9d4914SAndroid Build Coastguard Worker 
7*2e9d4914SAndroid Build Coastguard Worker    This library is free software; you can redistribute it and/or
8*2e9d4914SAndroid Build Coastguard Worker    modify it under the terms of the GNU Lesser General Public License
9*2e9d4914SAndroid Build Coastguard Worker    as published by the Free Software Foundation; either version 2.1 of
10*2e9d4914SAndroid Build Coastguard Worker    the License, or (at your option) any later version.
11*2e9d4914SAndroid Build Coastguard Worker 
12*2e9d4914SAndroid Build Coastguard Worker    This library is distributed in the hope that it will be useful, but
13*2e9d4914SAndroid Build Coastguard Worker    WITHOUT ANY WARRANTY; without even the implied warranty of
14*2e9d4914SAndroid Build Coastguard Worker    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15*2e9d4914SAndroid Build Coastguard Worker    Lesser General Public License for more details.
16*2e9d4914SAndroid Build Coastguard Worker 
17*2e9d4914SAndroid Build Coastguard Worker    You should have received a copy of the GNU Library General Public
18*2e9d4914SAndroid Build Coastguard Worker    License along with this library; if not, see
19*2e9d4914SAndroid Build Coastguard Worker    <http://www.gnu.org/licenses/>.
20*2e9d4914SAndroid Build Coastguard Worker    ----------------------------------------------------------------------------
21*2e9d4914SAndroid Build Coastguard Worker */
22*2e9d4914SAndroid Build Coastguard Worker 
23*2e9d4914SAndroid Build Coastguard Worker #include "tinytest.h"
24*2e9d4914SAndroid Build Coastguard Worker 
25*2e9d4914SAndroid Build Coastguard Worker #include <stdarg.h>
26*2e9d4914SAndroid Build Coastguard Worker #include <stdio.h>
27*2e9d4914SAndroid Build Coastguard Worker 
28*2e9d4914SAndroid Build Coastguard Worker #ifdef WIN32
29*2e9d4914SAndroid Build Coastguard Worker #include <io.h>
30*2e9d4914SAndroid Build Coastguard Worker #define F_OK 4  // Windows doesn't have F_OK
31*2e9d4914SAndroid Build Coastguard Worker #else
32*2e9d4914SAndroid Build Coastguard Worker #include <unistd.h>
33*2e9d4914SAndroid Build Coastguard Worker #endif
34*2e9d4914SAndroid Build Coastguard Worker 
35*2e9d4914SAndroid Build Coastguard Worker /*
36*2e9d4914SAndroid Build Coastguard Worker  */
37*2e9d4914SAndroid Build Coastguard Worker 
38*2e9d4914SAndroid Build Coastguard Worker static tt_testsuite_t *__tt_current_suite = NULL;
39*2e9d4914SAndroid Build Coastguard Worker 
40*2e9d4914SAndroid Build Coastguard Worker static const char *__tt_op_strings[] = { "==", "!=", "<", "<=", ">", ">=",
41*2e9d4914SAndroid Build Coastguard Worker                                          "==", "!=", "<", "<=", ">", ">=",
42*2e9d4914SAndroid Build Coastguard Worker                                          "==", "!=", "<", "<=", ">", ">=",
43*2e9d4914SAndroid Build Coastguard Worker                                          "==", "!=", "<", "<=", ">", ">=",
44*2e9d4914SAndroid Build Coastguard Worker                                          "==", "!=", "<", "<=", ">", ">=",
45*2e9d4914SAndroid Build Coastguard Worker                                          "==", "!=", "<", "<=", ">", ">=",
46*2e9d4914SAndroid Build Coastguard Worker                                          "==", "!=", "", "!",
47*2e9d4914SAndroid Build Coastguard Worker                                          "==file", "!=file",
48*2e9d4914SAndroid Build Coastguard Worker                                          "==txtfile", "!=txtfile" };
49*2e9d4914SAndroid Build Coastguard Worker 
50*2e9d4914SAndroid Build Coastguard Worker /*
51*2e9d4914SAndroid Build Coastguard Worker  */
52*2e9d4914SAndroid Build Coastguard Worker 
__tt_chop(char * s)53*2e9d4914SAndroid Build Coastguard Worker static tt_bool_t __tt_chop(char *s)
54*2e9d4914SAndroid Build Coastguard Worker {
55*2e9d4914SAndroid Build Coastguard Worker   size_t len = strlen(s);
56*2e9d4914SAndroid Build Coastguard Worker   char *p;
57*2e9d4914SAndroid Build Coastguard Worker   tt_bool_t eol = TT_FALSE;
58*2e9d4914SAndroid Build Coastguard Worker 
59*2e9d4914SAndroid Build Coastguard Worker   for(p = s + len - 1; p > s; --p) {
60*2e9d4914SAndroid Build Coastguard Worker     if ((*p == '\r') || (*p == '\n')) {
61*2e9d4914SAndroid Build Coastguard Worker       eol = TT_TRUE;
62*2e9d4914SAndroid Build Coastguard Worker       *p = 0;
63*2e9d4914SAndroid Build Coastguard Worker     }
64*2e9d4914SAndroid Build Coastguard Worker   }
65*2e9d4914SAndroid Build Coastguard Worker 
66*2e9d4914SAndroid Build Coastguard Worker   return(eol);
67*2e9d4914SAndroid Build Coastguard Worker }
68*2e9d4914SAndroid Build Coastguard Worker 
__tt_compare_files_text(const char * file1,const char * file2,tt_bool_t verbose)69*2e9d4914SAndroid Build Coastguard Worker static tt_bool_t __tt_compare_files_text(const char *file1, const char *file2,
70*2e9d4914SAndroid Build Coastguard Worker                                          tt_bool_t verbose)
71*2e9d4914SAndroid Build Coastguard Worker {
72*2e9d4914SAndroid Build Coastguard Worker   FILE *fp1, *fp2;
73*2e9d4914SAndroid Build Coastguard Worker   char buf1[4096], buf2[4096];
74*2e9d4914SAndroid Build Coastguard Worker   int line = 1;
75*2e9d4914SAndroid Build Coastguard Worker   int character = 0;
76*2e9d4914SAndroid Build Coastguard Worker   tt_bool_t matched = TT_TRUE, eof1, eof2;
77*2e9d4914SAndroid Build Coastguard Worker 
78*2e9d4914SAndroid Build Coastguard Worker   if(!(fp1 = fopen(file1, "rt")))
79*2e9d4914SAndroid Build Coastguard Worker   {
80*2e9d4914SAndroid Build Coastguard Worker     printf("cannot open file: %s\n", file1);
81*2e9d4914SAndroid Build Coastguard Worker     return(TT_FALSE);
82*2e9d4914SAndroid Build Coastguard Worker   }
83*2e9d4914SAndroid Build Coastguard Worker 
84*2e9d4914SAndroid Build Coastguard Worker   if(!(fp2 = fopen(file2, "rt")))
85*2e9d4914SAndroid Build Coastguard Worker   {
86*2e9d4914SAndroid Build Coastguard Worker     fclose(fp1);
87*2e9d4914SAndroid Build Coastguard Worker     printf("cannot open file: %s\n", file2);
88*2e9d4914SAndroid Build Coastguard Worker     return(TT_FALSE);
89*2e9d4914SAndroid Build Coastguard Worker   }
90*2e9d4914SAndroid Build Coastguard Worker 
91*2e9d4914SAndroid Build Coastguard Worker   for(;;)
92*2e9d4914SAndroid Build Coastguard Worker   {
93*2e9d4914SAndroid Build Coastguard Worker     char *r1, *r2, *p, *q;
94*2e9d4914SAndroid Build Coastguard Worker 
95*2e9d4914SAndroid Build Coastguard Worker     r1 = fgets(buf1, sizeof(buf1), fp1);
96*2e9d4914SAndroid Build Coastguard Worker     r2 = fgets(buf2, sizeof(buf2), fp2);
97*2e9d4914SAndroid Build Coastguard Worker 
98*2e9d4914SAndroid Build Coastguard Worker     if((r1 == NULL) || (r2 == NULL))
99*2e9d4914SAndroid Build Coastguard Worker     {
100*2e9d4914SAndroid Build Coastguard Worker       matched = (r1 == r2) ? TT_TRUE : TT_FALSE;
101*2e9d4914SAndroid Build Coastguard Worker       break;
102*2e9d4914SAndroid Build Coastguard Worker     }
103*2e9d4914SAndroid Build Coastguard Worker 
104*2e9d4914SAndroid Build Coastguard Worker     eof1 = __tt_chop(r1);
105*2e9d4914SAndroid Build Coastguard Worker     eof2 = __tt_chop(r2);
106*2e9d4914SAndroid Build Coastguard Worker 
107*2e9d4914SAndroid Build Coastguard Worker     p = r1;
108*2e9d4914SAndroid Build Coastguard Worker     q = r2;
109*2e9d4914SAndroid Build Coastguard Worker 
110*2e9d4914SAndroid Build Coastguard Worker     while(*p && *q)
111*2e9d4914SAndroid Build Coastguard Worker     {
112*2e9d4914SAndroid Build Coastguard Worker       if(*p != *q)
113*2e9d4914SAndroid Build Coastguard Worker       {
114*2e9d4914SAndroid Build Coastguard Worker         matched = TT_FALSE;
115*2e9d4914SAndroid Build Coastguard Worker         break;
116*2e9d4914SAndroid Build Coastguard Worker       }
117*2e9d4914SAndroid Build Coastguard Worker 
118*2e9d4914SAndroid Build Coastguard Worker       ++character;
119*2e9d4914SAndroid Build Coastguard Worker       ++p;
120*2e9d4914SAndroid Build Coastguard Worker       ++q;
121*2e9d4914SAndroid Build Coastguard Worker     }
122*2e9d4914SAndroid Build Coastguard Worker 
123*2e9d4914SAndroid Build Coastguard Worker     if(eof1 != eof2)
124*2e9d4914SAndroid Build Coastguard Worker       matched = TT_FALSE;
125*2e9d4914SAndroid Build Coastguard Worker 
126*2e9d4914SAndroid Build Coastguard Worker     if(matched == TT_FALSE)
127*2e9d4914SAndroid Build Coastguard Worker       break;
128*2e9d4914SAndroid Build Coastguard Worker 
129*2e9d4914SAndroid Build Coastguard Worker     if(eof1 && eof2)
130*2e9d4914SAndroid Build Coastguard Worker     {
131*2e9d4914SAndroid Build Coastguard Worker       ++line;
132*2e9d4914SAndroid Build Coastguard Worker       character = 0;
133*2e9d4914SAndroid Build Coastguard Worker     }
134*2e9d4914SAndroid Build Coastguard Worker   }
135*2e9d4914SAndroid Build Coastguard Worker 
136*2e9d4914SAndroid Build Coastguard Worker   fclose(fp1);
137*2e9d4914SAndroid Build Coastguard Worker   fclose(fp2);
138*2e9d4914SAndroid Build Coastguard Worker 
139*2e9d4914SAndroid Build Coastguard Worker   if(!matched && verbose)
140*2e9d4914SAndroid Build Coastguard Worker     printf("files \"%s\" and \"%s\" differ starting at line %d, char %d\n",
141*2e9d4914SAndroid Build Coastguard Worker            file1, file2, line, character);
142*2e9d4914SAndroid Build Coastguard Worker 
143*2e9d4914SAndroid Build Coastguard Worker   return(matched);
144*2e9d4914SAndroid Build Coastguard Worker }
145*2e9d4914SAndroid Build Coastguard Worker 
__tt_compare_files(const char * file1,const char * file2,tt_bool_t verbose)146*2e9d4914SAndroid Build Coastguard Worker static tt_bool_t __tt_compare_files(const char *file1, const char *file2,
147*2e9d4914SAndroid Build Coastguard Worker                                     tt_bool_t verbose)
148*2e9d4914SAndroid Build Coastguard Worker {
149*2e9d4914SAndroid Build Coastguard Worker   FILE *fp1, *fp2;
150*2e9d4914SAndroid Build Coastguard Worker   char buf1[4096], buf2[4096];
151*2e9d4914SAndroid Build Coastguard Worker   int line = 1;
152*2e9d4914SAndroid Build Coastguard Worker   int character = 0;
153*2e9d4914SAndroid Build Coastguard Worker   size_t r1, r2;
154*2e9d4914SAndroid Build Coastguard Worker   tt_bool_t done = TT_FALSE, matched = TT_TRUE;
155*2e9d4914SAndroid Build Coastguard Worker 
156*2e9d4914SAndroid Build Coastguard Worker   if(!(fp1 = fopen(file1, "rb")))
157*2e9d4914SAndroid Build Coastguard Worker   {
158*2e9d4914SAndroid Build Coastguard Worker     printf("cannot open file: %s\n", file1);
159*2e9d4914SAndroid Build Coastguard Worker     return(TT_FALSE);
160*2e9d4914SAndroid Build Coastguard Worker   }
161*2e9d4914SAndroid Build Coastguard Worker 
162*2e9d4914SAndroid Build Coastguard Worker   if(!(fp2 = fopen(file2, "rb")))
163*2e9d4914SAndroid Build Coastguard Worker   {
164*2e9d4914SAndroid Build Coastguard Worker     fclose(fp1);
165*2e9d4914SAndroid Build Coastguard Worker     printf("cannot open file: %s\n", file2);
166*2e9d4914SAndroid Build Coastguard Worker     return(TT_FALSE);
167*2e9d4914SAndroid Build Coastguard Worker   }
168*2e9d4914SAndroid Build Coastguard Worker 
169*2e9d4914SAndroid Build Coastguard Worker   while(!done)
170*2e9d4914SAndroid Build Coastguard Worker   {
171*2e9d4914SAndroid Build Coastguard Worker     char *p, *q, *pe, *qe;
172*2e9d4914SAndroid Build Coastguard Worker 
173*2e9d4914SAndroid Build Coastguard Worker     r1 = fread(buf1, 1, sizeof(buf1), fp1);
174*2e9d4914SAndroid Build Coastguard Worker     r2 = fread(buf2, 1, sizeof(buf2), fp2);
175*2e9d4914SAndroid Build Coastguard Worker 
176*2e9d4914SAndroid Build Coastguard Worker     p = buf1;
177*2e9d4914SAndroid Build Coastguard Worker     q = buf2;
178*2e9d4914SAndroid Build Coastguard Worker     pe = buf1 + r1;
179*2e9d4914SAndroid Build Coastguard Worker     qe = buf2 + r2;
180*2e9d4914SAndroid Build Coastguard Worker 
181*2e9d4914SAndroid Build Coastguard Worker     while(p < pe && q < qe)
182*2e9d4914SAndroid Build Coastguard Worker     {
183*2e9d4914SAndroid Build Coastguard Worker       if(*p != *q)
184*2e9d4914SAndroid Build Coastguard Worker       {
185*2e9d4914SAndroid Build Coastguard Worker         matched = TT_FALSE;
186*2e9d4914SAndroid Build Coastguard Worker         done = TT_TRUE;
187*2e9d4914SAndroid Build Coastguard Worker         break;
188*2e9d4914SAndroid Build Coastguard Worker       }
189*2e9d4914SAndroid Build Coastguard Worker 
190*2e9d4914SAndroid Build Coastguard Worker       if(*p == '\n')
191*2e9d4914SAndroid Build Coastguard Worker       {
192*2e9d4914SAndroid Build Coastguard Worker         ++line;
193*2e9d4914SAndroid Build Coastguard Worker         character = 0;
194*2e9d4914SAndroid Build Coastguard Worker       }
195*2e9d4914SAndroid Build Coastguard Worker       else
196*2e9d4914SAndroid Build Coastguard Worker         ++character;
197*2e9d4914SAndroid Build Coastguard Worker 
198*2e9d4914SAndroid Build Coastguard Worker       ++p;
199*2e9d4914SAndroid Build Coastguard Worker       ++q;
200*2e9d4914SAndroid Build Coastguard Worker     }
201*2e9d4914SAndroid Build Coastguard Worker 
202*2e9d4914SAndroid Build Coastguard Worker     if(p < pe || q < qe)
203*2e9d4914SAndroid Build Coastguard Worker     {
204*2e9d4914SAndroid Build Coastguard Worker       matched = TT_FALSE;
205*2e9d4914SAndroid Build Coastguard Worker       break;
206*2e9d4914SAndroid Build Coastguard Worker     }
207*2e9d4914SAndroid Build Coastguard Worker 
208*2e9d4914SAndroid Build Coastguard Worker     if(feof(fp1) || feof(fp2))
209*2e9d4914SAndroid Build Coastguard Worker       break;
210*2e9d4914SAndroid Build Coastguard Worker   }
211*2e9d4914SAndroid Build Coastguard Worker 
212*2e9d4914SAndroid Build Coastguard Worker   fclose(fp1);
213*2e9d4914SAndroid Build Coastguard Worker   fclose(fp2);
214*2e9d4914SAndroid Build Coastguard Worker 
215*2e9d4914SAndroid Build Coastguard Worker   if(!matched && verbose)
216*2e9d4914SAndroid Build Coastguard Worker     printf("files \"%s\" and \"%s\" differ starting at line %d, char %d\n",
217*2e9d4914SAndroid Build Coastguard Worker            file1, file2, line, character);
218*2e9d4914SAndroid Build Coastguard Worker 
219*2e9d4914SAndroid Build Coastguard Worker   return(matched);
220*2e9d4914SAndroid Build Coastguard Worker }
221*2e9d4914SAndroid Build Coastguard Worker 
222*2e9d4914SAndroid Build Coastguard Worker /*
223*2e9d4914SAndroid Build Coastguard Worker  */
224*2e9d4914SAndroid Build Coastguard Worker 
tt_suite_create(const char * name)225*2e9d4914SAndroid Build Coastguard Worker tt_testsuite_t *tt_suite_create(const char *name)
226*2e9d4914SAndroid Build Coastguard Worker {
227*2e9d4914SAndroid Build Coastguard Worker   tt_testsuite_t *suite = calloc(1, sizeof(tt_testsuite_t));
228*2e9d4914SAndroid Build Coastguard Worker   suite->name = strdup(name);
229*2e9d4914SAndroid Build Coastguard Worker   return(suite);
230*2e9d4914SAndroid Build Coastguard Worker }
231*2e9d4914SAndroid Build Coastguard Worker 
232*2e9d4914SAndroid Build Coastguard Worker /*
233*2e9d4914SAndroid Build Coastguard Worker  */
234*2e9d4914SAndroid Build Coastguard Worker 
tt_suite_destroy(tt_testsuite_t * suite)235*2e9d4914SAndroid Build Coastguard Worker void tt_suite_destroy(tt_testsuite_t *suite)
236*2e9d4914SAndroid Build Coastguard Worker {
237*2e9d4914SAndroid Build Coastguard Worker   tt_test_t *test = suite->first_test;
238*2e9d4914SAndroid Build Coastguard Worker 
239*2e9d4914SAndroid Build Coastguard Worker   while(test)
240*2e9d4914SAndroid Build Coastguard Worker   {
241*2e9d4914SAndroid Build Coastguard Worker     tt_test_t *tmp = test->next;
242*2e9d4914SAndroid Build Coastguard Worker     free((void *)test->name);
243*2e9d4914SAndroid Build Coastguard Worker     free(test);
244*2e9d4914SAndroid Build Coastguard Worker     test = tmp;
245*2e9d4914SAndroid Build Coastguard Worker   }
246*2e9d4914SAndroid Build Coastguard Worker 
247*2e9d4914SAndroid Build Coastguard Worker   free((void *)suite->name);
248*2e9d4914SAndroid Build Coastguard Worker   free(suite);
249*2e9d4914SAndroid Build Coastguard Worker }
250*2e9d4914SAndroid Build Coastguard Worker 
251*2e9d4914SAndroid Build Coastguard Worker /*
252*2e9d4914SAndroid Build Coastguard Worker  */
253*2e9d4914SAndroid Build Coastguard Worker 
tt_suite_add_test(tt_testsuite_t * suite,const char * name,void (* function)(void))254*2e9d4914SAndroid Build Coastguard Worker void tt_suite_add_test(tt_testsuite_t *suite, const char *name,
255*2e9d4914SAndroid Build Coastguard Worker                        void (*function)(void))
256*2e9d4914SAndroid Build Coastguard Worker {
257*2e9d4914SAndroid Build Coastguard Worker   tt_test_t *test = calloc(1, sizeof(tt_test_t));
258*2e9d4914SAndroid Build Coastguard Worker   test->name = strdup(name);
259*2e9d4914SAndroid Build Coastguard Worker   test->function = function;
260*2e9d4914SAndroid Build Coastguard Worker 
261*2e9d4914SAndroid Build Coastguard Worker   if(suite->last_test != NULL)
262*2e9d4914SAndroid Build Coastguard Worker     suite->last_test->next = test;
263*2e9d4914SAndroid Build Coastguard Worker 
264*2e9d4914SAndroid Build Coastguard Worker   suite->last_test = test;
265*2e9d4914SAndroid Build Coastguard Worker 
266*2e9d4914SAndroid Build Coastguard Worker   if(suite->first_test == NULL)
267*2e9d4914SAndroid Build Coastguard Worker     suite->first_test = test;
268*2e9d4914SAndroid Build Coastguard Worker 
269*2e9d4914SAndroid Build Coastguard Worker   ++suite->num_tests;
270*2e9d4914SAndroid Build Coastguard Worker }
271*2e9d4914SAndroid Build Coastguard Worker 
272*2e9d4914SAndroid Build Coastguard Worker /*
273*2e9d4914SAndroid Build Coastguard Worker  */
274*2e9d4914SAndroid Build Coastguard Worker 
tt_suite_run(tt_testsuite_t * suite)275*2e9d4914SAndroid Build Coastguard Worker void tt_suite_run(tt_testsuite_t *suite)
276*2e9d4914SAndroid Build Coastguard Worker {
277*2e9d4914SAndroid Build Coastguard Worker   __tt_current_suite = suite;
278*2e9d4914SAndroid Build Coastguard Worker 
279*2e9d4914SAndroid Build Coastguard Worker   suite->num_failures = 0;
280*2e9d4914SAndroid Build Coastguard Worker 
281*2e9d4914SAndroid Build Coastguard Worker   for(suite->current_test = suite->first_test;
282*2e9d4914SAndroid Build Coastguard Worker       suite->current_test;
283*2e9d4914SAndroid Build Coastguard Worker       suite->current_test = suite->current_test->next)
284*2e9d4914SAndroid Build Coastguard Worker   {
285*2e9d4914SAndroid Build Coastguard Worker     printf("[TEST] %s\n", suite->current_test->name);
286*2e9d4914SAndroid Build Coastguard Worker 
287*2e9d4914SAndroid Build Coastguard Worker     if(setjmp(suite->jump_buf) == 0)
288*2e9d4914SAndroid Build Coastguard Worker     {
289*2e9d4914SAndroid Build Coastguard Worker       suite->current_test->function();
290*2e9d4914SAndroid Build Coastguard Worker     }
291*2e9d4914SAndroid Build Coastguard Worker 
292*2e9d4914SAndroid Build Coastguard Worker     if(suite->current_test->failed)
293*2e9d4914SAndroid Build Coastguard Worker     {
294*2e9d4914SAndroid Build Coastguard Worker       printf("[FAIL] %s\n", suite->current_test->name);
295*2e9d4914SAndroid Build Coastguard Worker       ++suite->num_failures;
296*2e9d4914SAndroid Build Coastguard Worker     }
297*2e9d4914SAndroid Build Coastguard Worker     else
298*2e9d4914SAndroid Build Coastguard Worker     {
299*2e9d4914SAndroid Build Coastguard Worker       printf("[ OK ] %s\n", suite->current_test->name);
300*2e9d4914SAndroid Build Coastguard Worker     }
301*2e9d4914SAndroid Build Coastguard Worker   }
302*2e9d4914SAndroid Build Coastguard Worker 
303*2e9d4914SAndroid Build Coastguard Worker   if(suite->num_failures > 0)
304*2e9d4914SAndroid Build Coastguard Worker     puts("*** FAILURES! ***");
305*2e9d4914SAndroid Build Coastguard Worker 
306*2e9d4914SAndroid Build Coastguard Worker   printf("%d tests; %d passed, %d failed\n",
307*2e9d4914SAndroid Build Coastguard Worker          suite->num_tests, suite->num_tests - suite->num_failures,
308*2e9d4914SAndroid Build Coastguard Worker          suite->num_failures);
309*2e9d4914SAndroid Build Coastguard Worker 
310*2e9d4914SAndroid Build Coastguard Worker   suite->current_test = NULL;
311*2e9d4914SAndroid Build Coastguard Worker   __tt_current_suite = NULL;
312*2e9d4914SAndroid Build Coastguard Worker }
313*2e9d4914SAndroid Build Coastguard Worker 
314*2e9d4914SAndroid Build Coastguard Worker /*
315*2e9d4914SAndroid Build Coastguard Worker  */
316*2e9d4914SAndroid Build Coastguard Worker 
tt_output_val(FILE * stream,const tt_val_t * val)317*2e9d4914SAndroid Build Coastguard Worker void tt_output_val(FILE *stream, const tt_val_t *val)
318*2e9d4914SAndroid Build Coastguard Worker {
319*2e9d4914SAndroid Build Coastguard Worker   switch(val->type)
320*2e9d4914SAndroid Build Coastguard Worker   {
321*2e9d4914SAndroid Build Coastguard Worker     case TT_VAL_INT:
322*2e9d4914SAndroid Build Coastguard Worker       fprintf(stream, "%d", val->value.int_val);
323*2e9d4914SAndroid Build Coastguard Worker       break;
324*2e9d4914SAndroid Build Coastguard Worker 
325*2e9d4914SAndroid Build Coastguard Worker     case TT_VAL_UINT:
326*2e9d4914SAndroid Build Coastguard Worker       fprintf(stream, "%u", val->value.uint_val);
327*2e9d4914SAndroid Build Coastguard Worker       break;
328*2e9d4914SAndroid Build Coastguard Worker 
329*2e9d4914SAndroid Build Coastguard Worker     case TT_VAL_INT64:
330*2e9d4914SAndroid Build Coastguard Worker       fprintf(stream, "%lld", val->value.int64_val);
331*2e9d4914SAndroid Build Coastguard Worker       break;
332*2e9d4914SAndroid Build Coastguard Worker 
333*2e9d4914SAndroid Build Coastguard Worker     case TT_VAL_UINT64:
334*2e9d4914SAndroid Build Coastguard Worker       fprintf(stream, "%llu", val->value.uint64_val);
335*2e9d4914SAndroid Build Coastguard Worker       break;
336*2e9d4914SAndroid Build Coastguard Worker 
337*2e9d4914SAndroid Build Coastguard Worker     case TT_VAL_DOUBLE:
338*2e9d4914SAndroid Build Coastguard Worker       fprintf(stream, "%f", val->value.double_val);
339*2e9d4914SAndroid Build Coastguard Worker       break;
340*2e9d4914SAndroid Build Coastguard Worker 
341*2e9d4914SAndroid Build Coastguard Worker     case TT_VAL_STR:
342*2e9d4914SAndroid Build Coastguard Worker     {
343*2e9d4914SAndroid Build Coastguard Worker       const char *p;
344*2e9d4914SAndroid Build Coastguard Worker 
345*2e9d4914SAndroid Build Coastguard Worker       fputc('\"', stream);
346*2e9d4914SAndroid Build Coastguard Worker       for(p = val->value.str_val; *p; ++p)
347*2e9d4914SAndroid Build Coastguard Worker       {
348*2e9d4914SAndroid Build Coastguard Worker         if(*p == '\n')
349*2e9d4914SAndroid Build Coastguard Worker           fputs("\\n", stream);
350*2e9d4914SAndroid Build Coastguard Worker         else if(*p == '\r')
351*2e9d4914SAndroid Build Coastguard Worker           fputs("\\r", stream);
352*2e9d4914SAndroid Build Coastguard Worker         else if(*p == '\t')
353*2e9d4914SAndroid Build Coastguard Worker           fputs("\\t", stream);
354*2e9d4914SAndroid Build Coastguard Worker         else if(*p == '\f')
355*2e9d4914SAndroid Build Coastguard Worker           fputs("\\f", stream);
356*2e9d4914SAndroid Build Coastguard Worker         else if(*p < ' ')
357*2e9d4914SAndroid Build Coastguard Worker           fprintf(stream, "\\0x%02X", *p);
358*2e9d4914SAndroid Build Coastguard Worker         else
359*2e9d4914SAndroid Build Coastguard Worker           fputc(*p, stream);
360*2e9d4914SAndroid Build Coastguard Worker       }
361*2e9d4914SAndroid Build Coastguard Worker       fputc('\"', stream);
362*2e9d4914SAndroid Build Coastguard Worker       break;
363*2e9d4914SAndroid Build Coastguard Worker     }
364*2e9d4914SAndroid Build Coastguard Worker 
365*2e9d4914SAndroid Build Coastguard Worker     case TT_VAL_PTR:
366*2e9d4914SAndroid Build Coastguard Worker       fprintf(stream, "%p", val->value.ptr_val);
367*2e9d4914SAndroid Build Coastguard Worker       break;
368*2e9d4914SAndroid Build Coastguard Worker 
369*2e9d4914SAndroid Build Coastguard Worker     default:
370*2e9d4914SAndroid Build Coastguard Worker       fputs("???", stream);
371*2e9d4914SAndroid Build Coastguard Worker       break;
372*2e9d4914SAndroid Build Coastguard Worker   }
373*2e9d4914SAndroid Build Coastguard Worker }
374*2e9d4914SAndroid Build Coastguard Worker 
375*2e9d4914SAndroid Build Coastguard Worker /*
376*2e9d4914SAndroid Build Coastguard Worker  */
377*2e9d4914SAndroid Build Coastguard Worker 
tt_expect(const char * file,int line,const char * aexpr,tt_op_t op,const char * bexpr,const tt_val_t a,const tt_val_t b,tt_bool_t fatal)378*2e9d4914SAndroid Build Coastguard Worker void tt_expect(const char *file, int line, const char *aexpr,
379*2e9d4914SAndroid Build Coastguard Worker                tt_op_t op, const char *bexpr, const tt_val_t a,
380*2e9d4914SAndroid Build Coastguard Worker                const tt_val_t b, tt_bool_t fatal)
381*2e9d4914SAndroid Build Coastguard Worker {
382*2e9d4914SAndroid Build Coastguard Worker   tt_bool_t result = TT_FALSE;
383*2e9d4914SAndroid Build Coastguard Worker 
384*2e9d4914SAndroid Build Coastguard Worker   switch(op)
385*2e9d4914SAndroid Build Coastguard Worker   {
386*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_INT_EQ:
387*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.int_val == b.value.int_val);
388*2e9d4914SAndroid Build Coastguard Worker       break;
389*2e9d4914SAndroid Build Coastguard Worker 
390*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_INT_NE:
391*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.int_val != b.value.int_val);
392*2e9d4914SAndroid Build Coastguard Worker       break;
393*2e9d4914SAndroid Build Coastguard Worker 
394*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_INT_LT:
395*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.int_val < b.value.int_val);
396*2e9d4914SAndroid Build Coastguard Worker       break;
397*2e9d4914SAndroid Build Coastguard Worker 
398*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_INT_LE:
399*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.int_val <= b.value.int_val);
400*2e9d4914SAndroid Build Coastguard Worker       break;
401*2e9d4914SAndroid Build Coastguard Worker 
402*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_INT_GT:
403*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.int_val > b.value.int_val);
404*2e9d4914SAndroid Build Coastguard Worker       break;
405*2e9d4914SAndroid Build Coastguard Worker 
406*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_INT_GE:
407*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.int_val >= b.value.int_val);
408*2e9d4914SAndroid Build Coastguard Worker       break;
409*2e9d4914SAndroid Build Coastguard Worker 
410*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_UINT_EQ:
411*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.uint_val == b.value.uint_val);
412*2e9d4914SAndroid Build Coastguard Worker       break;
413*2e9d4914SAndroid Build Coastguard Worker 
414*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_UINT_NE:
415*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.uint_val != b.value.uint_val);
416*2e9d4914SAndroid Build Coastguard Worker       break;
417*2e9d4914SAndroid Build Coastguard Worker 
418*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_UINT_LT:
419*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.uint_val < b.value.uint_val);
420*2e9d4914SAndroid Build Coastguard Worker       break;
421*2e9d4914SAndroid Build Coastguard Worker 
422*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_UINT_LE:
423*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.uint_val <= b.value.uint_val);
424*2e9d4914SAndroid Build Coastguard Worker       break;
425*2e9d4914SAndroid Build Coastguard Worker 
426*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_UINT_GT:
427*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.uint_val > b.value.uint_val);
428*2e9d4914SAndroid Build Coastguard Worker       break;
429*2e9d4914SAndroid Build Coastguard Worker 
430*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_UINT_GE:
431*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.uint_val >= b.value.uint_val);
432*2e9d4914SAndroid Build Coastguard Worker       break;
433*2e9d4914SAndroid Build Coastguard Worker 
434*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_INT64_EQ:
435*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.int64_val == b.value.int64_val);
436*2e9d4914SAndroid Build Coastguard Worker       break;
437*2e9d4914SAndroid Build Coastguard Worker 
438*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_INT64_NE:
439*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.int64_val != b.value.int64_val);
440*2e9d4914SAndroid Build Coastguard Worker       break;
441*2e9d4914SAndroid Build Coastguard Worker 
442*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_INT64_LT:
443*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.int64_val < b.value.int64_val);
444*2e9d4914SAndroid Build Coastguard Worker       break;
445*2e9d4914SAndroid Build Coastguard Worker 
446*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_INT64_LE:
447*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.int64_val <= b.value.int64_val);
448*2e9d4914SAndroid Build Coastguard Worker       break;
449*2e9d4914SAndroid Build Coastguard Worker 
450*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_INT64_GT:
451*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.int64_val > b.value.int64_val);
452*2e9d4914SAndroid Build Coastguard Worker       break;
453*2e9d4914SAndroid Build Coastguard Worker 
454*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_INT64_GE:
455*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.int64_val >= b.value.int64_val);
456*2e9d4914SAndroid Build Coastguard Worker       break;
457*2e9d4914SAndroid Build Coastguard Worker 
458*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_UINT64_EQ:
459*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.uint64_val == b.value.uint64_val);
460*2e9d4914SAndroid Build Coastguard Worker       break;
461*2e9d4914SAndroid Build Coastguard Worker 
462*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_UINT64_NE:
463*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.uint64_val != b.value.uint64_val);
464*2e9d4914SAndroid Build Coastguard Worker       break;
465*2e9d4914SAndroid Build Coastguard Worker 
466*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_UINT64_LT:
467*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.uint64_val < b.value.uint64_val);
468*2e9d4914SAndroid Build Coastguard Worker       break;
469*2e9d4914SAndroid Build Coastguard Worker 
470*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_UINT64_LE:
471*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.uint64_val <= b.value.uint64_val);
472*2e9d4914SAndroid Build Coastguard Worker       break;
473*2e9d4914SAndroid Build Coastguard Worker 
474*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_UINT64_GT:
475*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.uint64_val > b.value.uint64_val);
476*2e9d4914SAndroid Build Coastguard Worker       break;
477*2e9d4914SAndroid Build Coastguard Worker 
478*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_UINT64_GE:
479*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.uint64_val >= b.value.uint64_val);
480*2e9d4914SAndroid Build Coastguard Worker       break;
481*2e9d4914SAndroid Build Coastguard Worker 
482*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_DOUBLE_EQ:
483*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.double_val == b.value.double_val);
484*2e9d4914SAndroid Build Coastguard Worker       break;
485*2e9d4914SAndroid Build Coastguard Worker 
486*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_DOUBLE_NE:
487*2e9d4914SAndroid Build Coastguard Worker     {
488*2e9d4914SAndroid Build Coastguard Worker       double diff = (a.value.double_val - b.value.double_val);
489*2e9d4914SAndroid Build Coastguard Worker       result = ((diff < -.0001) || (diff > .0001));
490*2e9d4914SAndroid Build Coastguard Worker       break;
491*2e9d4914SAndroid Build Coastguard Worker     }
492*2e9d4914SAndroid Build Coastguard Worker 
493*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_DOUBLE_LT:
494*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.double_val < b.value.double_val);
495*2e9d4914SAndroid Build Coastguard Worker       break;
496*2e9d4914SAndroid Build Coastguard Worker 
497*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_DOUBLE_LE:
498*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.double_val <= b.value.double_val);
499*2e9d4914SAndroid Build Coastguard Worker       break;
500*2e9d4914SAndroid Build Coastguard Worker 
501*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_DOUBLE_GT:
502*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.double_val > b.value.double_val);
503*2e9d4914SAndroid Build Coastguard Worker       break;
504*2e9d4914SAndroid Build Coastguard Worker 
505*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_DOUBLE_GE:
506*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.double_val >= b.value.double_val);
507*2e9d4914SAndroid Build Coastguard Worker       break;
508*2e9d4914SAndroid Build Coastguard Worker 
509*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_STR_EQ:
510*2e9d4914SAndroid Build Coastguard Worker       result = !strcmp(a.value.str_val, b.value.str_val);
511*2e9d4914SAndroid Build Coastguard Worker       break;
512*2e9d4914SAndroid Build Coastguard Worker 
513*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_STR_NE:
514*2e9d4914SAndroid Build Coastguard Worker       result = strcmp(a.value.str_val, b.value.str_val);
515*2e9d4914SAndroid Build Coastguard Worker       break;
516*2e9d4914SAndroid Build Coastguard Worker 
517*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_STR_LT:
518*2e9d4914SAndroid Build Coastguard Worker       result = (strcmp(a.value.str_val, b.value.str_val) < 0);
519*2e9d4914SAndroid Build Coastguard Worker       break;
520*2e9d4914SAndroid Build Coastguard Worker 
521*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_STR_LE:
522*2e9d4914SAndroid Build Coastguard Worker       result = (strcmp(a.value.str_val, b.value.str_val) <= 0);
523*2e9d4914SAndroid Build Coastguard Worker       break;
524*2e9d4914SAndroid Build Coastguard Worker 
525*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_STR_GT:
526*2e9d4914SAndroid Build Coastguard Worker       result = (strcmp(a.value.str_val, b.value.str_val) > 0);
527*2e9d4914SAndroid Build Coastguard Worker       break;
528*2e9d4914SAndroid Build Coastguard Worker 
529*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_STR_GE:
530*2e9d4914SAndroid Build Coastguard Worker       result = (strcmp(a.value.str_val, b.value.str_val) >= 0);
531*2e9d4914SAndroid Build Coastguard Worker       break;
532*2e9d4914SAndroid Build Coastguard Worker 
533*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_PTR_EQ:
534*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.ptr_val == b.value.ptr_val);
535*2e9d4914SAndroid Build Coastguard Worker       break;
536*2e9d4914SAndroid Build Coastguard Worker 
537*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_PTR_NE:
538*2e9d4914SAndroid Build Coastguard Worker       result = (a.value.ptr_val != b.value.ptr_val);
539*2e9d4914SAndroid Build Coastguard Worker       break;
540*2e9d4914SAndroid Build Coastguard Worker 
541*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_FILE_EQ:
542*2e9d4914SAndroid Build Coastguard Worker       result = __tt_compare_files(a.value.str_val, b.value.str_val, TT_TRUE);
543*2e9d4914SAndroid Build Coastguard Worker       break;
544*2e9d4914SAndroid Build Coastguard Worker 
545*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_FILE_NE:
546*2e9d4914SAndroid Build Coastguard Worker       result = !__tt_compare_files(a.value.str_val, b.value.str_val, TT_TRUE);
547*2e9d4914SAndroid Build Coastguard Worker       break;
548*2e9d4914SAndroid Build Coastguard Worker 
549*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_TXTFILE_EQ:
550*2e9d4914SAndroid Build Coastguard Worker       result = __tt_compare_files_text(a.value.str_val, b.value.str_val,
551*2e9d4914SAndroid Build Coastguard Worker                                        TT_TRUE);
552*2e9d4914SAndroid Build Coastguard Worker       break;
553*2e9d4914SAndroid Build Coastguard Worker 
554*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_TXTFILE_NE:
555*2e9d4914SAndroid Build Coastguard Worker       result = !__tt_compare_files_text(a.value.str_val, b.value.str_val,
556*2e9d4914SAndroid Build Coastguard Worker                                         TT_TRUE);
557*2e9d4914SAndroid Build Coastguard Worker       break;
558*2e9d4914SAndroid Build Coastguard Worker 
559*2e9d4914SAndroid Build Coastguard Worker     default:
560*2e9d4914SAndroid Build Coastguard Worker       break;
561*2e9d4914SAndroid Build Coastguard Worker   }
562*2e9d4914SAndroid Build Coastguard Worker 
563*2e9d4914SAndroid Build Coastguard Worker   if(!result)
564*2e9d4914SAndroid Build Coastguard Worker   {
565*2e9d4914SAndroid Build Coastguard Worker     __tt_current_suite->current_test->failed = TT_TRUE;
566*2e9d4914SAndroid Build Coastguard Worker 
567*2e9d4914SAndroid Build Coastguard Worker     printf("%s:%d: failed %s: %s [", file, line, (fatal ? "assert" : "expect"),
568*2e9d4914SAndroid Build Coastguard Worker            aexpr);
569*2e9d4914SAndroid Build Coastguard Worker     tt_output_val(stdout, &a);
570*2e9d4914SAndroid Build Coastguard Worker     printf("] %s %s [", __tt_op_strings[op], bexpr);
571*2e9d4914SAndroid Build Coastguard Worker     tt_output_val(stdout, &b);
572*2e9d4914SAndroid Build Coastguard Worker     puts("]");
573*2e9d4914SAndroid Build Coastguard Worker 
574*2e9d4914SAndroid Build Coastguard Worker     if(fatal)
575*2e9d4914SAndroid Build Coastguard Worker       longjmp(__tt_current_suite->jump_buf, 0);
576*2e9d4914SAndroid Build Coastguard Worker   }
577*2e9d4914SAndroid Build Coastguard Worker }
578*2e9d4914SAndroid Build Coastguard Worker 
579*2e9d4914SAndroid Build Coastguard Worker /*
580*2e9d4914SAndroid Build Coastguard Worker  */
581*2e9d4914SAndroid Build Coastguard Worker 
tt_expect_bool(const char * file,int line,const char * expr,tt_op_t op,int val,tt_bool_t fatal)582*2e9d4914SAndroid Build Coastguard Worker void tt_expect_bool(const char *file, int line, const char *expr, tt_op_t op,
583*2e9d4914SAndroid Build Coastguard Worker                     int val, tt_bool_t fatal)
584*2e9d4914SAndroid Build Coastguard Worker {
585*2e9d4914SAndroid Build Coastguard Worker   tt_bool_t result = TT_FALSE;
586*2e9d4914SAndroid Build Coastguard Worker 
587*2e9d4914SAndroid Build Coastguard Worker   switch(op)
588*2e9d4914SAndroid Build Coastguard Worker   {
589*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_TRUE:
590*2e9d4914SAndroid Build Coastguard Worker       result = (val != 0);
591*2e9d4914SAndroid Build Coastguard Worker       break;
592*2e9d4914SAndroid Build Coastguard Worker 
593*2e9d4914SAndroid Build Coastguard Worker     case TT_OP_FALSE:
594*2e9d4914SAndroid Build Coastguard Worker       result = (val == 0);
595*2e9d4914SAndroid Build Coastguard Worker       break;
596*2e9d4914SAndroid Build Coastguard Worker 
597*2e9d4914SAndroid Build Coastguard Worker     default:
598*2e9d4914SAndroid Build Coastguard Worker       break;
599*2e9d4914SAndroid Build Coastguard Worker   }
600*2e9d4914SAndroid Build Coastguard Worker 
601*2e9d4914SAndroid Build Coastguard Worker   if(!result)
602*2e9d4914SAndroid Build Coastguard Worker   {
603*2e9d4914SAndroid Build Coastguard Worker     __tt_current_suite->current_test->failed = TT_TRUE;
604*2e9d4914SAndroid Build Coastguard Worker 
605*2e9d4914SAndroid Build Coastguard Worker     printf("%s:%d: failed %s: %s(%s)\n", file, line,
606*2e9d4914SAndroid Build Coastguard Worker            (fatal ? "assert" : "expect"), __tt_op_strings[op], expr);
607*2e9d4914SAndroid Build Coastguard Worker 
608*2e9d4914SAndroid Build Coastguard Worker     if(fatal)
609*2e9d4914SAndroid Build Coastguard Worker       longjmp(__tt_current_suite->jump_buf, 0);
610*2e9d4914SAndroid Build Coastguard Worker   }
611*2e9d4914SAndroid Build Coastguard Worker }
612*2e9d4914SAndroid Build Coastguard Worker 
613*2e9d4914SAndroid Build Coastguard Worker /*
614*2e9d4914SAndroid Build Coastguard Worker  */
615*2e9d4914SAndroid Build Coastguard Worker 
tt_fail(const char * file,int line,const char * message,...)616*2e9d4914SAndroid Build Coastguard Worker void tt_fail(const char *file, int line, const char *message, ...)
617*2e9d4914SAndroid Build Coastguard Worker {
618*2e9d4914SAndroid Build Coastguard Worker   va_list vp;
619*2e9d4914SAndroid Build Coastguard Worker   va_start(vp, message);
620*2e9d4914SAndroid Build Coastguard Worker   printf("%s:%d: failed: ", file, line);
621*2e9d4914SAndroid Build Coastguard Worker   vprintf(message, vp);
622*2e9d4914SAndroid Build Coastguard Worker   va_end(vp);
623*2e9d4914SAndroid Build Coastguard Worker   putchar('\n');
624*2e9d4914SAndroid Build Coastguard Worker }
625*2e9d4914SAndroid Build Coastguard Worker 
626*2e9d4914SAndroid Build Coastguard Worker /*
627*2e9d4914SAndroid Build Coastguard Worker  */
628*2e9d4914SAndroid Build Coastguard Worker 
tt_file_exists(const char * file)629*2e9d4914SAndroid Build Coastguard Worker tt_bool_t tt_file_exists(const char *file)
630*2e9d4914SAndroid Build Coastguard Worker {
631*2e9d4914SAndroid Build Coastguard Worker   return(access(file, F_OK) == 0);
632*2e9d4914SAndroid Build Coastguard Worker }
633*2e9d4914SAndroid Build Coastguard Worker 
634*2e9d4914SAndroid Build Coastguard Worker #ifdef _MSC_VER
635*2e9d4914SAndroid Build Coastguard Worker 
636*2e9d4914SAndroid Build Coastguard Worker // All of this extra code is because MSVC doesn't support the C99 standard.
637*2e9d4914SAndroid Build Coastguard Worker // Sigh.
638*2e9d4914SAndroid Build Coastguard Worker 
639*2e9d4914SAndroid Build Coastguard Worker /*
640*2e9d4914SAndroid Build Coastguard Worker  */
641*2e9d4914SAndroid Build Coastguard Worker 
tt_test_int(const char * file,int line,const char * aexpr,tt_op_t op,const char * bexpr,int a,int b,tt_bool_t fatal)642*2e9d4914SAndroid Build Coastguard Worker void tt_test_int(const char *file, int line, const char *aexpr, tt_op_t op,
643*2e9d4914SAndroid Build Coastguard Worker                  const char *bexpr, int a, int b, tt_bool_t fatal)
644*2e9d4914SAndroid Build Coastguard Worker {
645*2e9d4914SAndroid Build Coastguard Worker   tt_val_t aval = { TT_VAL_INT }, bval = { TT_VAL_INT };
646*2e9d4914SAndroid Build Coastguard Worker   aval.value.int_val = a;
647*2e9d4914SAndroid Build Coastguard Worker   bval.value.int_val = b;
648*2e9d4914SAndroid Build Coastguard Worker   tt_expect(file, line, aexpr, op, bexpr, aval, bval, fatal);
649*2e9d4914SAndroid Build Coastguard Worker }
650*2e9d4914SAndroid Build Coastguard Worker 
651*2e9d4914SAndroid Build Coastguard Worker /*
652*2e9d4914SAndroid Build Coastguard Worker  */
653*2e9d4914SAndroid Build Coastguard Worker 
tt_test_uint(const char * file,int line,const char * aexpr,tt_op_t op,const char * bexpr,unsigned int a,unsigned int b,tt_bool_t fatal)654*2e9d4914SAndroid Build Coastguard Worker void tt_test_uint(const char *file, int line, const char *aexpr, tt_op_t op,
655*2e9d4914SAndroid Build Coastguard Worker                   const char *bexpr, unsigned int a, unsigned int b,
656*2e9d4914SAndroid Build Coastguard Worker                   tt_bool_t fatal)
657*2e9d4914SAndroid Build Coastguard Worker {
658*2e9d4914SAndroid Build Coastguard Worker   tt_val_t aval = { TT_VAL_UINT }, bval = { TT_VAL_UINT };
659*2e9d4914SAndroid Build Coastguard Worker   aval.value.uint_val = a;
660*2e9d4914SAndroid Build Coastguard Worker   bval.value.uint_val = b;
661*2e9d4914SAndroid Build Coastguard Worker   tt_expect(file, line, aexpr, op, bexpr, aval, bval, fatal);
662*2e9d4914SAndroid Build Coastguard Worker }
663*2e9d4914SAndroid Build Coastguard Worker 
664*2e9d4914SAndroid Build Coastguard Worker /*
665*2e9d4914SAndroid Build Coastguard Worker  */
666*2e9d4914SAndroid Build Coastguard Worker 
tt_test_int64(const char * file,int line,const char * aexpr,tt_op_t op,const char * bexpr,long long a,long long b,tt_bool_t fatal)667*2e9d4914SAndroid Build Coastguard Worker void tt_test_int64(const char *file, int line, const char *aexpr, tt_op_t op,
668*2e9d4914SAndroid Build Coastguard Worker                    const char *bexpr, long long a, long long b,
669*2e9d4914SAndroid Build Coastguard Worker                    tt_bool_t fatal)
670*2e9d4914SAndroid Build Coastguard Worker {
671*2e9d4914SAndroid Build Coastguard Worker   tt_val_t aval = { TT_VAL_INT64 }, bval = { TT_VAL_INT64 };
672*2e9d4914SAndroid Build Coastguard Worker   aval.value.int64_val = a;
673*2e9d4914SAndroid Build Coastguard Worker   bval.value.int64_val = b;
674*2e9d4914SAndroid Build Coastguard Worker   tt_expect(file, line, aexpr, op, bexpr, aval, bval, fatal);
675*2e9d4914SAndroid Build Coastguard Worker }
676*2e9d4914SAndroid Build Coastguard Worker 
677*2e9d4914SAndroid Build Coastguard Worker /*
678*2e9d4914SAndroid Build Coastguard Worker  */
679*2e9d4914SAndroid Build Coastguard Worker 
tt_test_uint64(const char * file,int line,const char * aexpr,tt_op_t op,const char * bexpr,unsigned long long a,unsigned long long b,tt_bool_t fatal)680*2e9d4914SAndroid Build Coastguard Worker void tt_test_uint64(const char *file, int line, const char *aexpr,
681*2e9d4914SAndroid Build Coastguard Worker                     tt_op_t op, const char *bexpr, unsigned long long a,
682*2e9d4914SAndroid Build Coastguard Worker                     unsigned long long b, tt_bool_t fatal)
683*2e9d4914SAndroid Build Coastguard Worker {
684*2e9d4914SAndroid Build Coastguard Worker   tt_val_t aval = { TT_VAL_UINT64 }, bval = { TT_VAL_UINT64 };
685*2e9d4914SAndroid Build Coastguard Worker   aval.value.uint64_val = a;
686*2e9d4914SAndroid Build Coastguard Worker   bval.value.uint64_val = b;
687*2e9d4914SAndroid Build Coastguard Worker   tt_expect(file, line, aexpr, op, bexpr, aval, bval, fatal);
688*2e9d4914SAndroid Build Coastguard Worker }
689*2e9d4914SAndroid Build Coastguard Worker 
690*2e9d4914SAndroid Build Coastguard Worker /*
691*2e9d4914SAndroid Build Coastguard Worker  */
692*2e9d4914SAndroid Build Coastguard Worker 
tt_test_double(const char * file,int line,const char * aexpr,tt_op_t op,const char * bexpr,double a,double b,tt_bool_t fatal)693*2e9d4914SAndroid Build Coastguard Worker void tt_test_double(const char *file, int line, const char *aexpr, tt_op_t op,
694*2e9d4914SAndroid Build Coastguard Worker                     const char *bexpr, double a, double b, tt_bool_t fatal)
695*2e9d4914SAndroid Build Coastguard Worker {
696*2e9d4914SAndroid Build Coastguard Worker   tt_val_t aval = { TT_VAL_DOUBLE }, bval = { TT_VAL_DOUBLE };
697*2e9d4914SAndroid Build Coastguard Worker   aval.value.double_val = a;
698*2e9d4914SAndroid Build Coastguard Worker   bval.value.double_val = b;
699*2e9d4914SAndroid Build Coastguard Worker   tt_expect(file, line, aexpr, op, bexpr, aval, bval, fatal);
700*2e9d4914SAndroid Build Coastguard Worker }
701*2e9d4914SAndroid Build Coastguard Worker 
702*2e9d4914SAndroid Build Coastguard Worker /*
703*2e9d4914SAndroid Build Coastguard Worker  */
704*2e9d4914SAndroid Build Coastguard Worker 
tt_test_str(const char * file,int line,const char * aexpr,tt_op_t op,const char * bexpr,const char * a,const char * b,tt_bool_t fatal)705*2e9d4914SAndroid Build Coastguard Worker void tt_test_str(const char *file, int line, const char *aexpr, tt_op_t op,
706*2e9d4914SAndroid Build Coastguard Worker                  const char *bexpr, const char *a, const char *b,
707*2e9d4914SAndroid Build Coastguard Worker                  tt_bool_t fatal)
708*2e9d4914SAndroid Build Coastguard Worker {
709*2e9d4914SAndroid Build Coastguard Worker   tt_val_t aval = { TT_VAL_STR }, bval = { TT_VAL_STR };
710*2e9d4914SAndroid Build Coastguard Worker   aval.value.str_val = a;
711*2e9d4914SAndroid Build Coastguard Worker   bval.value.str_val = b;
712*2e9d4914SAndroid Build Coastguard Worker   tt_expect(file, line, aexpr, op, bexpr, aval, bval, fatal);
713*2e9d4914SAndroid Build Coastguard Worker }
714*2e9d4914SAndroid Build Coastguard Worker 
715*2e9d4914SAndroid Build Coastguard Worker /*
716*2e9d4914SAndroid Build Coastguard Worker  */
717*2e9d4914SAndroid Build Coastguard Worker 
tt_test_ptr(const char * file,int line,const char * aexpr,tt_op_t op,const char * bexpr,const void * a,const void * b,tt_bool_t fatal)718*2e9d4914SAndroid Build Coastguard Worker void tt_test_ptr(const char *file, int line, const char *aexpr, tt_op_t op,
719*2e9d4914SAndroid Build Coastguard Worker                  const char *bexpr, const void *a, const void *b,
720*2e9d4914SAndroid Build Coastguard Worker                  tt_bool_t fatal)
721*2e9d4914SAndroid Build Coastguard Worker {
722*2e9d4914SAndroid Build Coastguard Worker   tt_val_t aval = { TT_VAL_PTR }, bval = { TT_VAL_PTR };
723*2e9d4914SAndroid Build Coastguard Worker   aval.value.ptr_val = a;
724*2e9d4914SAndroid Build Coastguard Worker   bval.value.ptr_val = b;
725*2e9d4914SAndroid Build Coastguard Worker   tt_expect(file, line, aexpr, op, bexpr, aval, bval, fatal);
726*2e9d4914SAndroid Build Coastguard Worker }
727*2e9d4914SAndroid Build Coastguard Worker 
728*2e9d4914SAndroid Build Coastguard Worker #endif // WIN32
729*2e9d4914SAndroid Build Coastguard Worker 
730*2e9d4914SAndroid Build Coastguard Worker /* end of source file */
731