xref: /aosp_15_r20/external/selinux/libsepol/cil/test/unit/CuTest.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker /*
2*2d543d20SAndroid Build Coastguard Worker  * Copyright (c) 2003 Asim Jalis
3*2d543d20SAndroid Build Coastguard Worker  *
4*2d543d20SAndroid Build Coastguard Worker  * This software is provided 'as-is', without any express or implied
5*2d543d20SAndroid Build Coastguard Worker  * warranty. In no event will the authors be held liable for any damages
6*2d543d20SAndroid Build Coastguard Worker  * arising from the use of this software.
7*2d543d20SAndroid Build Coastguard Worker  *
8*2d543d20SAndroid Build Coastguard Worker  * Permission is granted to anyone to use this software for any purpose,
9*2d543d20SAndroid Build Coastguard Worker  * including commercial applications, and to alter it and redistribute it
10*2d543d20SAndroid Build Coastguard Worker  * freely, subject to the following restrictions:
11*2d543d20SAndroid Build Coastguard Worker  *
12*2d543d20SAndroid Build Coastguard Worker  * 1. The origin of this software must not be misrepresented; you must not
13*2d543d20SAndroid Build Coastguard Worker  * claim that you wrote the original software. If you use this software in
14*2d543d20SAndroid Build Coastguard Worker  * a product, an acknowledgment in the product documentation would be
15*2d543d20SAndroid Build Coastguard Worker  * appreciated but is not required.
16*2d543d20SAndroid Build Coastguard Worker  *
17*2d543d20SAndroid Build Coastguard Worker  * 2. Altered source versions must be plainly marked as such, and must not
18*2d543d20SAndroid Build Coastguard Worker  * be misrepresented as being the original software.
19*2d543d20SAndroid Build Coastguard Worker  *
20*2d543d20SAndroid Build Coastguard Worker  * 3. This notice may not be removed or altered from any source
21*2d543d20SAndroid Build Coastguard Worker  * distribution.
22*2d543d20SAndroid Build Coastguard Worker  */
23*2d543d20SAndroid Build Coastguard Worker 
24*2d543d20SAndroid Build Coastguard Worker #include <assert.h>
25*2d543d20SAndroid Build Coastguard Worker #include <setjmp.h>
26*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
27*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
28*2d543d20SAndroid Build Coastguard Worker #include <string.h>
29*2d543d20SAndroid Build Coastguard Worker #include <math.h>
30*2d543d20SAndroid Build Coastguard Worker 
31*2d543d20SAndroid Build Coastguard Worker #include "CuTest.h"
32*2d543d20SAndroid Build Coastguard Worker 
33*2d543d20SAndroid Build Coastguard Worker /*-------------------------------------------------------------------------*
34*2d543d20SAndroid Build Coastguard Worker  * CuStr
35*2d543d20SAndroid Build Coastguard Worker  *-------------------------------------------------------------------------*/
36*2d543d20SAndroid Build Coastguard Worker 
CuStrAlloc(int size)37*2d543d20SAndroid Build Coastguard Worker char* CuStrAlloc(int size)
38*2d543d20SAndroid Build Coastguard Worker {
39*2d543d20SAndroid Build Coastguard Worker 	char* newStr = (char*) malloc( sizeof(char) * (size) );
40*2d543d20SAndroid Build Coastguard Worker 	return newStr;
41*2d543d20SAndroid Build Coastguard Worker }
42*2d543d20SAndroid Build Coastguard Worker 
CuStrCopy(const char * old)43*2d543d20SAndroid Build Coastguard Worker char* CuStrCopy(const char* old)
44*2d543d20SAndroid Build Coastguard Worker {
45*2d543d20SAndroid Build Coastguard Worker 	int len = strlen(old);
46*2d543d20SAndroid Build Coastguard Worker 	char* newStr = CuStrAlloc(len + 1);
47*2d543d20SAndroid Build Coastguard Worker 	strcpy(newStr, old);
48*2d543d20SAndroid Build Coastguard Worker 	return newStr;
49*2d543d20SAndroid Build Coastguard Worker }
50*2d543d20SAndroid Build Coastguard Worker 
51*2d543d20SAndroid Build Coastguard Worker /*-------------------------------------------------------------------------*
52*2d543d20SAndroid Build Coastguard Worker  * CuString
53*2d543d20SAndroid Build Coastguard Worker  *-------------------------------------------------------------------------*/
54*2d543d20SAndroid Build Coastguard Worker 
CuStringInit(CuString * str)55*2d543d20SAndroid Build Coastguard Worker void CuStringInit(CuString* str)
56*2d543d20SAndroid Build Coastguard Worker {
57*2d543d20SAndroid Build Coastguard Worker 	str->length = 0;
58*2d543d20SAndroid Build Coastguard Worker 	str->size = STRING_MAX;
59*2d543d20SAndroid Build Coastguard Worker 	str->buffer = (char*) malloc(sizeof(char) * str->size);
60*2d543d20SAndroid Build Coastguard Worker 	str->buffer[0] = '\0';
61*2d543d20SAndroid Build Coastguard Worker }
62*2d543d20SAndroid Build Coastguard Worker 
CuStringNew(void)63*2d543d20SAndroid Build Coastguard Worker CuString* CuStringNew(void)
64*2d543d20SAndroid Build Coastguard Worker {
65*2d543d20SAndroid Build Coastguard Worker 	CuString* str = (CuString*) malloc(sizeof(CuString));
66*2d543d20SAndroid Build Coastguard Worker 	str->length = 0;
67*2d543d20SAndroid Build Coastguard Worker 	str->size = STRING_MAX;
68*2d543d20SAndroid Build Coastguard Worker 	str->buffer = (char*) malloc(sizeof(char) * str->size);
69*2d543d20SAndroid Build Coastguard Worker 	str->buffer[0] = '\0';
70*2d543d20SAndroid Build Coastguard Worker 	return str;
71*2d543d20SAndroid Build Coastguard Worker }
72*2d543d20SAndroid Build Coastguard Worker 
CuStringDelete(CuString * str)73*2d543d20SAndroid Build Coastguard Worker void CuStringDelete(CuString *str)
74*2d543d20SAndroid Build Coastguard Worker {
75*2d543d20SAndroid Build Coastguard Worker         if (!str) return;
76*2d543d20SAndroid Build Coastguard Worker         free(str->buffer);
77*2d543d20SAndroid Build Coastguard Worker         free(str);
78*2d543d20SAndroid Build Coastguard Worker }
79*2d543d20SAndroid Build Coastguard Worker 
CuStringResize(CuString * str,int newSize)80*2d543d20SAndroid Build Coastguard Worker void CuStringResize(CuString* str, int newSize)
81*2d543d20SAndroid Build Coastguard Worker {
82*2d543d20SAndroid Build Coastguard Worker 	str->buffer = (char*) realloc(str->buffer, sizeof(char) * newSize);
83*2d543d20SAndroid Build Coastguard Worker 	str->size = newSize;
84*2d543d20SAndroid Build Coastguard Worker }
85*2d543d20SAndroid Build Coastguard Worker 
CuStringAppend(CuString * str,const char * text)86*2d543d20SAndroid Build Coastguard Worker void CuStringAppend(CuString* str, const char* text)
87*2d543d20SAndroid Build Coastguard Worker {
88*2d543d20SAndroid Build Coastguard Worker 	int length;
89*2d543d20SAndroid Build Coastguard Worker 
90*2d543d20SAndroid Build Coastguard Worker 	if (text == NULL) {
91*2d543d20SAndroid Build Coastguard Worker 		text = "NULL";
92*2d543d20SAndroid Build Coastguard Worker 	}
93*2d543d20SAndroid Build Coastguard Worker 
94*2d543d20SAndroid Build Coastguard Worker 	length = strlen(text);
95*2d543d20SAndroid Build Coastguard Worker 	if (str->length + length + 1 >= str->size)
96*2d543d20SAndroid Build Coastguard Worker 		CuStringResize(str, str->length + length + 1 + STRING_INC);
97*2d543d20SAndroid Build Coastguard Worker 	str->length += length;
98*2d543d20SAndroid Build Coastguard Worker 	strcat(str->buffer, text);
99*2d543d20SAndroid Build Coastguard Worker }
100*2d543d20SAndroid Build Coastguard Worker 
CuStringAppendChar(CuString * str,char ch)101*2d543d20SAndroid Build Coastguard Worker void CuStringAppendChar(CuString* str, char ch)
102*2d543d20SAndroid Build Coastguard Worker {
103*2d543d20SAndroid Build Coastguard Worker 	char text[2];
104*2d543d20SAndroid Build Coastguard Worker 	text[0] = ch;
105*2d543d20SAndroid Build Coastguard Worker 	text[1] = '\0';
106*2d543d20SAndroid Build Coastguard Worker 	CuStringAppend(str, text);
107*2d543d20SAndroid Build Coastguard Worker }
108*2d543d20SAndroid Build Coastguard Worker 
CuStringAppendFormat(CuString * str,const char * format,...)109*2d543d20SAndroid Build Coastguard Worker __attribute__ ((format (printf, 2, 3))) void CuStringAppendFormat(CuString* str, const char* format, ...)
110*2d543d20SAndroid Build Coastguard Worker {
111*2d543d20SAndroid Build Coastguard Worker 	va_list argp;
112*2d543d20SAndroid Build Coastguard Worker 	char buf[HUGE_STRING_LEN];
113*2d543d20SAndroid Build Coastguard Worker 	va_start(argp, format);
114*2d543d20SAndroid Build Coastguard Worker 	vsprintf(buf, format, argp);
115*2d543d20SAndroid Build Coastguard Worker 	va_end(argp);
116*2d543d20SAndroid Build Coastguard Worker 	CuStringAppend(str, buf);
117*2d543d20SAndroid Build Coastguard Worker }
118*2d543d20SAndroid Build Coastguard Worker 
CuStringInsert(CuString * str,const char * text,int pos)119*2d543d20SAndroid Build Coastguard Worker void CuStringInsert(CuString* str, const char* text, int pos)
120*2d543d20SAndroid Build Coastguard Worker {
121*2d543d20SAndroid Build Coastguard Worker 	int length = strlen(text);
122*2d543d20SAndroid Build Coastguard Worker 	if (pos > str->length)
123*2d543d20SAndroid Build Coastguard Worker 		pos = str->length;
124*2d543d20SAndroid Build Coastguard Worker 	if (str->length + length + 1 >= str->size)
125*2d543d20SAndroid Build Coastguard Worker 		CuStringResize(str, str->length + length + 1 + STRING_INC);
126*2d543d20SAndroid Build Coastguard Worker 	memmove(str->buffer + pos + length, str->buffer + pos, (str->length - pos) + 1);
127*2d543d20SAndroid Build Coastguard Worker 	str->length += length;
128*2d543d20SAndroid Build Coastguard Worker 	memcpy(str->buffer + pos, text, length);
129*2d543d20SAndroid Build Coastguard Worker }
130*2d543d20SAndroid Build Coastguard Worker 
131*2d543d20SAndroid Build Coastguard Worker /*-------------------------------------------------------------------------*
132*2d543d20SAndroid Build Coastguard Worker  * CuTest
133*2d543d20SAndroid Build Coastguard Worker  *-------------------------------------------------------------------------*/
134*2d543d20SAndroid Build Coastguard Worker 
CuTestInit(CuTest * t,const char * name,TestFunction function)135*2d543d20SAndroid Build Coastguard Worker void CuTestInit(CuTest* t, const char* name, TestFunction function)
136*2d543d20SAndroid Build Coastguard Worker {
137*2d543d20SAndroid Build Coastguard Worker 	t->name = CuStrCopy(name);
138*2d543d20SAndroid Build Coastguard Worker 	t->failed = 0;
139*2d543d20SAndroid Build Coastguard Worker 	t->ran = 0;
140*2d543d20SAndroid Build Coastguard Worker 	t->message = NULL;
141*2d543d20SAndroid Build Coastguard Worker 	t->function = function;
142*2d543d20SAndroid Build Coastguard Worker 	t->jumpBuf = NULL;
143*2d543d20SAndroid Build Coastguard Worker }
144*2d543d20SAndroid Build Coastguard Worker 
CuTestNew(const char * name,TestFunction function)145*2d543d20SAndroid Build Coastguard Worker CuTest* CuTestNew(const char* name, TestFunction function)
146*2d543d20SAndroid Build Coastguard Worker {
147*2d543d20SAndroid Build Coastguard Worker 	CuTest* tc = CU_ALLOC(CuTest);
148*2d543d20SAndroid Build Coastguard Worker 	CuTestInit(tc, name, function);
149*2d543d20SAndroid Build Coastguard Worker 	return tc;
150*2d543d20SAndroid Build Coastguard Worker }
151*2d543d20SAndroid Build Coastguard Worker 
CuTestDelete(CuTest * t)152*2d543d20SAndroid Build Coastguard Worker void CuTestDelete(CuTest *t)
153*2d543d20SAndroid Build Coastguard Worker {
154*2d543d20SAndroid Build Coastguard Worker         if (!t) return;
155*2d543d20SAndroid Build Coastguard Worker         free(t->name);
156*2d543d20SAndroid Build Coastguard Worker         free(t);
157*2d543d20SAndroid Build Coastguard Worker }
158*2d543d20SAndroid Build Coastguard Worker 
CuTestRun(CuTest * tc)159*2d543d20SAndroid Build Coastguard Worker void CuTestRun(CuTest* tc)
160*2d543d20SAndroid Build Coastguard Worker {
161*2d543d20SAndroid Build Coastguard Worker 	jmp_buf buf;
162*2d543d20SAndroid Build Coastguard Worker 	tc->jumpBuf = &buf;
163*2d543d20SAndroid Build Coastguard Worker 	if (setjmp(buf) == 0)
164*2d543d20SAndroid Build Coastguard Worker 	{
165*2d543d20SAndroid Build Coastguard Worker 		tc->ran = 1;
166*2d543d20SAndroid Build Coastguard Worker 		(tc->function)(tc);
167*2d543d20SAndroid Build Coastguard Worker 	}
168*2d543d20SAndroid Build Coastguard Worker 	tc->jumpBuf = 0;
169*2d543d20SAndroid Build Coastguard Worker }
170*2d543d20SAndroid Build Coastguard Worker 
CuFailInternal(CuTest * tc,const char * file,int line,CuString * string)171*2d543d20SAndroid Build Coastguard Worker static void CuFailInternal(CuTest* tc, const char* file, int line, CuString* string)
172*2d543d20SAndroid Build Coastguard Worker {
173*2d543d20SAndroid Build Coastguard Worker 	char buf[HUGE_STRING_LEN];
174*2d543d20SAndroid Build Coastguard Worker 
175*2d543d20SAndroid Build Coastguard Worker 	sprintf(buf, "%s:%d: ", file, line);
176*2d543d20SAndroid Build Coastguard Worker 	CuStringInsert(string, buf, 0);
177*2d543d20SAndroid Build Coastguard Worker 
178*2d543d20SAndroid Build Coastguard Worker 	tc->failed = 1;
179*2d543d20SAndroid Build Coastguard Worker 	tc->message = string->buffer;
180*2d543d20SAndroid Build Coastguard Worker 	if (tc->jumpBuf != 0) longjmp(*(tc->jumpBuf), 0);
181*2d543d20SAndroid Build Coastguard Worker }
182*2d543d20SAndroid Build Coastguard Worker 
CuFail_Line(CuTest * tc,const char * file,int line,const char * message2,const char * message)183*2d543d20SAndroid Build Coastguard Worker void CuFail_Line(CuTest* tc, const char* file, int line, const char* message2, const char* message)
184*2d543d20SAndroid Build Coastguard Worker {
185*2d543d20SAndroid Build Coastguard Worker 	CuString string;
186*2d543d20SAndroid Build Coastguard Worker 
187*2d543d20SAndroid Build Coastguard Worker 	CuStringInit(&string);
188*2d543d20SAndroid Build Coastguard Worker 	if (message2 != NULL)
189*2d543d20SAndroid Build Coastguard Worker 	{
190*2d543d20SAndroid Build Coastguard Worker 		CuStringAppend(&string, message2);
191*2d543d20SAndroid Build Coastguard Worker 		CuStringAppend(&string, ": ");
192*2d543d20SAndroid Build Coastguard Worker 	}
193*2d543d20SAndroid Build Coastguard Worker 	CuStringAppend(&string, message);
194*2d543d20SAndroid Build Coastguard Worker 	CuFailInternal(tc, file, line, &string);
195*2d543d20SAndroid Build Coastguard Worker }
196*2d543d20SAndroid Build Coastguard Worker 
CuAssert_Line(CuTest * tc,const char * file,int line,const char * message,int condition)197*2d543d20SAndroid Build Coastguard Worker void CuAssert_Line(CuTest* tc, const char* file, int line, const char* message, int condition)
198*2d543d20SAndroid Build Coastguard Worker {
199*2d543d20SAndroid Build Coastguard Worker 	if (condition) return;
200*2d543d20SAndroid Build Coastguard Worker 	CuFail_Line(tc, file, line, NULL, message);
201*2d543d20SAndroid Build Coastguard Worker }
202*2d543d20SAndroid Build Coastguard Worker 
CuAssertStrEquals_LineMsg(CuTest * tc,const char * file,int line,const char * message,const char * expected,const char * actual)203*2d543d20SAndroid Build Coastguard Worker void CuAssertStrEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message,
204*2d543d20SAndroid Build Coastguard Worker 	const char* expected, const char* actual)
205*2d543d20SAndroid Build Coastguard Worker {
206*2d543d20SAndroid Build Coastguard Worker 	CuString string;
207*2d543d20SAndroid Build Coastguard Worker 	if ((expected == NULL && actual == NULL) ||
208*2d543d20SAndroid Build Coastguard Worker 	    (expected != NULL && actual != NULL &&
209*2d543d20SAndroid Build Coastguard Worker 	     strcmp(expected, actual) == 0))
210*2d543d20SAndroid Build Coastguard Worker 	{
211*2d543d20SAndroid Build Coastguard Worker 		return;
212*2d543d20SAndroid Build Coastguard Worker 	}
213*2d543d20SAndroid Build Coastguard Worker 
214*2d543d20SAndroid Build Coastguard Worker 	CuStringInit(&string);
215*2d543d20SAndroid Build Coastguard Worker 	if (message != NULL)
216*2d543d20SAndroid Build Coastguard Worker 	{
217*2d543d20SAndroid Build Coastguard Worker 		CuStringAppend(&string, message);
218*2d543d20SAndroid Build Coastguard Worker 		CuStringAppend(&string, ": ");
219*2d543d20SAndroid Build Coastguard Worker 	}
220*2d543d20SAndroid Build Coastguard Worker 	CuStringAppend(&string, "expected <");
221*2d543d20SAndroid Build Coastguard Worker 	CuStringAppend(&string, expected);
222*2d543d20SAndroid Build Coastguard Worker 	CuStringAppend(&string, "> but was <");
223*2d543d20SAndroid Build Coastguard Worker 	CuStringAppend(&string, actual);
224*2d543d20SAndroid Build Coastguard Worker 	CuStringAppend(&string, ">");
225*2d543d20SAndroid Build Coastguard Worker 	CuFailInternal(tc, file, line, &string);
226*2d543d20SAndroid Build Coastguard Worker }
227*2d543d20SAndroid Build Coastguard Worker 
CuAssertIntEquals_LineMsg(CuTest * tc,const char * file,int line,const char * message,int expected,int actual)228*2d543d20SAndroid Build Coastguard Worker void CuAssertIntEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message,
229*2d543d20SAndroid Build Coastguard Worker 	int expected, int actual)
230*2d543d20SAndroid Build Coastguard Worker {
231*2d543d20SAndroid Build Coastguard Worker 	char buf[STRING_MAX];
232*2d543d20SAndroid Build Coastguard Worker 	if (expected == actual) return;
233*2d543d20SAndroid Build Coastguard Worker 	sprintf(buf, "expected <%d> but was <%d>", expected, actual);
234*2d543d20SAndroid Build Coastguard Worker 	CuFail_Line(tc, file, line, message, buf);
235*2d543d20SAndroid Build Coastguard Worker }
236*2d543d20SAndroid Build Coastguard Worker 
CuAssertDblEquals_LineMsg(CuTest * tc,const char * file,int line,const char * message,double expected,double actual,double delta)237*2d543d20SAndroid Build Coastguard Worker void CuAssertDblEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message,
238*2d543d20SAndroid Build Coastguard Worker 	double expected, double actual, double delta)
239*2d543d20SAndroid Build Coastguard Worker {
240*2d543d20SAndroid Build Coastguard Worker 	char buf[STRING_MAX];
241*2d543d20SAndroid Build Coastguard Worker 	if (fabs(expected - actual) <= delta) return;
242*2d543d20SAndroid Build Coastguard Worker 	sprintf(buf, "expected <%f> but was <%f>", expected, actual);
243*2d543d20SAndroid Build Coastguard Worker 
244*2d543d20SAndroid Build Coastguard Worker 	CuFail_Line(tc, file, line, message, buf);
245*2d543d20SAndroid Build Coastguard Worker }
246*2d543d20SAndroid Build Coastguard Worker 
CuAssertPtrEquals_LineMsg(CuTest * tc,const char * file,int line,const char * message,void * expected,void * actual)247*2d543d20SAndroid Build Coastguard Worker void CuAssertPtrEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message,
248*2d543d20SAndroid Build Coastguard Worker 	void* expected, void* actual)
249*2d543d20SAndroid Build Coastguard Worker {
250*2d543d20SAndroid Build Coastguard Worker 	char buf[STRING_MAX];
251*2d543d20SAndroid Build Coastguard Worker 	if (expected == actual) return;
252*2d543d20SAndroid Build Coastguard Worker 	sprintf(buf, "expected pointer <0x%p> but was <0x%p>", expected, actual);
253*2d543d20SAndroid Build Coastguard Worker 	CuFail_Line(tc, file, line, message, buf);
254*2d543d20SAndroid Build Coastguard Worker }
255*2d543d20SAndroid Build Coastguard Worker 
256*2d543d20SAndroid Build Coastguard Worker 
257*2d543d20SAndroid Build Coastguard Worker /*-------------------------------------------------------------------------*
258*2d543d20SAndroid Build Coastguard Worker  * CuSuite
259*2d543d20SAndroid Build Coastguard Worker  *-------------------------------------------------------------------------*/
260*2d543d20SAndroid Build Coastguard Worker 
CuSuiteInit(CuSuite * testSuite)261*2d543d20SAndroid Build Coastguard Worker void CuSuiteInit(CuSuite* testSuite)
262*2d543d20SAndroid Build Coastguard Worker {
263*2d543d20SAndroid Build Coastguard Worker 	testSuite->count = 0;
264*2d543d20SAndroid Build Coastguard Worker 	testSuite->failCount = 0;
265*2d543d20SAndroid Build Coastguard Worker         memset(testSuite->list, 0, sizeof(testSuite->list));
266*2d543d20SAndroid Build Coastguard Worker }
267*2d543d20SAndroid Build Coastguard Worker 
CuSuiteNew(void)268*2d543d20SAndroid Build Coastguard Worker CuSuite* CuSuiteNew(void)
269*2d543d20SAndroid Build Coastguard Worker {
270*2d543d20SAndroid Build Coastguard Worker 	CuSuite* testSuite = CU_ALLOC(CuSuite);
271*2d543d20SAndroid Build Coastguard Worker 	CuSuiteInit(testSuite);
272*2d543d20SAndroid Build Coastguard Worker 	return testSuite;
273*2d543d20SAndroid Build Coastguard Worker }
274*2d543d20SAndroid Build Coastguard Worker 
CuSuiteDelete(CuSuite * testSuite)275*2d543d20SAndroid Build Coastguard Worker void CuSuiteDelete(CuSuite *testSuite)
276*2d543d20SAndroid Build Coastguard Worker {
277*2d543d20SAndroid Build Coastguard Worker         unsigned int n;
278*2d543d20SAndroid Build Coastguard Worker         for (n=0; n < MAX_TEST_CASES; n++)
279*2d543d20SAndroid Build Coastguard Worker         {
280*2d543d20SAndroid Build Coastguard Worker                 if (testSuite->list[n])
281*2d543d20SAndroid Build Coastguard Worker                 {
282*2d543d20SAndroid Build Coastguard Worker                         CuTestDelete(testSuite->list[n]);
283*2d543d20SAndroid Build Coastguard Worker                 }
284*2d543d20SAndroid Build Coastguard Worker         }
285*2d543d20SAndroid Build Coastguard Worker         free(testSuite);
286*2d543d20SAndroid Build Coastguard Worker 
287*2d543d20SAndroid Build Coastguard Worker }
288*2d543d20SAndroid Build Coastguard Worker 
CuSuiteAdd(CuSuite * testSuite,CuTest * testCase)289*2d543d20SAndroid Build Coastguard Worker void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase)
290*2d543d20SAndroid Build Coastguard Worker {
291*2d543d20SAndroid Build Coastguard Worker 	assert(testSuite->count < MAX_TEST_CASES);
292*2d543d20SAndroid Build Coastguard Worker 	testSuite->list[testSuite->count] = testCase;
293*2d543d20SAndroid Build Coastguard Worker 	testSuite->count++;
294*2d543d20SAndroid Build Coastguard Worker }
295*2d543d20SAndroid Build Coastguard Worker 
CuSuiteAddSuite(CuSuite * testSuite,CuSuite * testSuite2)296*2d543d20SAndroid Build Coastguard Worker void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2)
297*2d543d20SAndroid Build Coastguard Worker {
298*2d543d20SAndroid Build Coastguard Worker 	int i;
299*2d543d20SAndroid Build Coastguard Worker 	for (i = 0 ; i < testSuite2->count ; ++i)
300*2d543d20SAndroid Build Coastguard Worker 	{
301*2d543d20SAndroid Build Coastguard Worker 		CuTest* testCase = testSuite2->list[i];
302*2d543d20SAndroid Build Coastguard Worker 		CuSuiteAdd(testSuite, testCase);
303*2d543d20SAndroid Build Coastguard Worker 	}
304*2d543d20SAndroid Build Coastguard Worker }
305*2d543d20SAndroid Build Coastguard Worker 
CuSuiteRun(CuSuite * testSuite)306*2d543d20SAndroid Build Coastguard Worker void CuSuiteRun(CuSuite* testSuite)
307*2d543d20SAndroid Build Coastguard Worker {
308*2d543d20SAndroid Build Coastguard Worker 	int i;
309*2d543d20SAndroid Build Coastguard Worker 	for (i = 0 ; i < testSuite->count ; ++i)
310*2d543d20SAndroid Build Coastguard Worker 	{
311*2d543d20SAndroid Build Coastguard Worker 		CuTest* testCase = testSuite->list[i];
312*2d543d20SAndroid Build Coastguard Worker 		CuTestRun(testCase);
313*2d543d20SAndroid Build Coastguard Worker 		if (testCase->failed) { testSuite->failCount += 1; }
314*2d543d20SAndroid Build Coastguard Worker 	}
315*2d543d20SAndroid Build Coastguard Worker }
316*2d543d20SAndroid Build Coastguard Worker 
CuSuiteSummary(CuSuite * testSuite,CuString * summary)317*2d543d20SAndroid Build Coastguard Worker void CuSuiteSummary(CuSuite* testSuite, CuString* summary)
318*2d543d20SAndroid Build Coastguard Worker {
319*2d543d20SAndroid Build Coastguard Worker 	int i;
320*2d543d20SAndroid Build Coastguard Worker 	for (i = 0 ; i < testSuite->count ; ++i)
321*2d543d20SAndroid Build Coastguard Worker 	{
322*2d543d20SAndroid Build Coastguard Worker 		CuTest* testCase = testSuite->list[i];
323*2d543d20SAndroid Build Coastguard Worker 		CuStringAppend(summary, testCase->failed ? "F" : ".");
324*2d543d20SAndroid Build Coastguard Worker 	}
325*2d543d20SAndroid Build Coastguard Worker 	CuStringAppend(summary, "\n\n");
326*2d543d20SAndroid Build Coastguard Worker }
327*2d543d20SAndroid Build Coastguard Worker 
CuSuiteDetails(CuSuite * testSuite,CuString * details)328*2d543d20SAndroid Build Coastguard Worker void CuSuiteDetails(CuSuite* testSuite, CuString* details)
329*2d543d20SAndroid Build Coastguard Worker {
330*2d543d20SAndroid Build Coastguard Worker 	int i;
331*2d543d20SAndroid Build Coastguard Worker 	int failCount = 0;
332*2d543d20SAndroid Build Coastguard Worker 
333*2d543d20SAndroid Build Coastguard Worker 	if (testSuite->failCount == 0)
334*2d543d20SAndroid Build Coastguard Worker 	{
335*2d543d20SAndroid Build Coastguard Worker 		int passCount = testSuite->count - testSuite->failCount;
336*2d543d20SAndroid Build Coastguard Worker 		const char* testWord = passCount == 1 ? "test" : "tests";
337*2d543d20SAndroid Build Coastguard Worker 		CuStringAppendFormat(details, "OK (%d %s)\n", passCount, testWord);
338*2d543d20SAndroid Build Coastguard Worker 	}
339*2d543d20SAndroid Build Coastguard Worker 	else
340*2d543d20SAndroid Build Coastguard Worker 	{
341*2d543d20SAndroid Build Coastguard Worker 		if (testSuite->failCount == 1)
342*2d543d20SAndroid Build Coastguard Worker 			CuStringAppend(details, "There was 1 failure:\n");
343*2d543d20SAndroid Build Coastguard Worker 		else
344*2d543d20SAndroid Build Coastguard Worker 			CuStringAppendFormat(details, "There were %d failures:\n", testSuite->failCount);
345*2d543d20SAndroid Build Coastguard Worker 
346*2d543d20SAndroid Build Coastguard Worker 		for (i = 0 ; i < testSuite->count ; ++i)
347*2d543d20SAndroid Build Coastguard Worker 		{
348*2d543d20SAndroid Build Coastguard Worker 			CuTest* testCase = testSuite->list[i];
349*2d543d20SAndroid Build Coastguard Worker 			if (testCase->failed)
350*2d543d20SAndroid Build Coastguard Worker 			{
351*2d543d20SAndroid Build Coastguard Worker 				failCount++;
352*2d543d20SAndroid Build Coastguard Worker 				CuStringAppendFormat(details, "%d) %s: %s\n",
353*2d543d20SAndroid Build Coastguard Worker 					failCount, testCase->name, testCase->message);
354*2d543d20SAndroid Build Coastguard Worker 			}
355*2d543d20SAndroid Build Coastguard Worker 		}
356*2d543d20SAndroid Build Coastguard Worker 		CuStringAppend(details, "\n!!!FAILURES!!!\n");
357*2d543d20SAndroid Build Coastguard Worker 
358*2d543d20SAndroid Build Coastguard Worker 		CuStringAppendFormat(details, "Runs: %d ",   testSuite->count);
359*2d543d20SAndroid Build Coastguard Worker 		CuStringAppendFormat(details, "Passes: %d ", testSuite->count - testSuite->failCount);
360*2d543d20SAndroid Build Coastguard Worker 		CuStringAppendFormat(details, "Fails: %d\n",  testSuite->failCount);
361*2d543d20SAndroid Build Coastguard Worker 	}
362*2d543d20SAndroid Build Coastguard Worker }
363