1b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence/*
2b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * Copyright (c) 2003 Asim Jalis
3b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *
4b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * This software is provided 'as-is', without any express or implied
5b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * warranty. In no event will the authors be held liable for any damages
6b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * arising from the use of this software.
7b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *
8b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * Permission is granted to anyone to use this software for any purpose,
9b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * including commercial applications, and to alter it and redistribute it
10b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * freely, subject to the following restrictions:
11b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *
12b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * 1. The origin of this software must not be misrepresented; you must not
13b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * claim that you wrote the original software. If you use this software in
14b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * a product, an acknowledgment in the product documentation would be
15b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * appreciated but is not required.
16b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *
17b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * 2. Altered source versions must be plainly marked as such, and must not
18b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * be misrepresented as being the original software.
19b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *
20b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * 3. This notice may not be removed or altered from any source
21b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * distribution.
22b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence */
23b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
24b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#ifndef CU_TEST_H
25b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CU_TEST_H
26b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
27b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include <setjmp.h>
28b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include <stdarg.h>
29b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
30b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CUTEST_VERSION  "CuTest 1.5"
31b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
32b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence/* CuString */
33b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
34b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencechar* CuStrAlloc(int size);
35b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencechar* CuStrCopy(const char* old);
36b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
37b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CU_ALLOC(TYPE)		((TYPE*) malloc(sizeof(TYPE)))
38b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
39b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define HUGE_STRING_LEN	8192
40b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define STRING_MAX		256
41b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define STRING_INC		256
42b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
43b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencetypedef struct
44b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
45b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	int length;
46b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	int size;
47b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char* buffer;
48b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence} CuString;
49b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
50b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuStringInit(CuString* str);
51b19eafb97feb6389d78e1693f276fc5b10e25bdSteve LawrenceCuString* CuStringNew(void);
52b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuStringRead(CuString* str, const char* path);
53b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuStringAppend(CuString* str, const char* text);
54b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuStringAppendChar(CuString* str, char ch);
55b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuStringAppendFormat(CuString* str, const char* format, ...);
56b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuStringInsert(CuString* str, const char* text, int pos);
57b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuStringResize(CuString* str, int newSize);
58b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuStringDelete(CuString* str);
59b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
60b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence/* CuTest */
61b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
62b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencetypedef struct CuTest CuTest;
63b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
64b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencetypedef void (*TestFunction)(CuTest *);
65b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
66b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencestruct CuTest
67b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
68b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char* name;
69b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	TestFunction function;
70b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	int failed;
71b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	int ran;
72b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	const char* message;
73b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	jmp_buf *jumpBuf;
74b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence};
75b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
76b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuTestInit(CuTest* t, const char* name, TestFunction function);
77b19eafb97feb6389d78e1693f276fc5b10e25bdSteve LawrenceCuTest* CuTestNew(const char* name, TestFunction function);
78b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuTestRun(CuTest* tc);
79b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuTestDelete(CuTest *t);
80b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
81b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence/* Internal versions of assert functions -- use the public versions */
82b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuFail_Line(CuTest* tc, const char* file, int line, const char* message2, const char* message);
83b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuAssert_Line(CuTest* tc, const char* file, int line, const char* message, int condition);
84b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuAssertStrEquals_LineMsg(CuTest* tc,
85b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	const char* file, int line, const char* message,
86b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	const char* expected, const char* actual);
87b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuAssertIntEquals_LineMsg(CuTest* tc,
88b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	const char* file, int line, const char* message,
89b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	int expected, int actual);
90b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuAssertDblEquals_LineMsg(CuTest* tc,
91b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	const char* file, int line, const char* message,
92b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	double expected, double actual, double delta);
93b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuAssertPtrEquals_LineMsg(CuTest* tc,
94b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	const char* file, int line, const char* message,
95b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	void* expected, void* actual);
96b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
97b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence/* public assert functions */
98b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
99b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuFail(tc, ms)                        CuFail_Line(  (tc), __FILE__, __LINE__, NULL, (ms))
100b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuAssert(tc, ms, cond)                CuAssert_Line((tc), __FILE__, __LINE__, (ms), (cond))
101b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuAssertTrue(tc, cond)                CuAssert_Line((tc), __FILE__, __LINE__, "assert failed", (cond))
102b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
103b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuAssertStrEquals(tc,ex,ac)           CuAssertStrEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac))
104b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuAssertStrEquals_Msg(tc,ms,ex,ac)    CuAssertStrEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac))
105b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuAssertIntEquals(tc,ex,ac)           CuAssertIntEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac))
106b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuAssertIntEquals_Msg(tc,ms,ex,ac)    CuAssertIntEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac))
107b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuAssertDblEquals(tc,ex,ac,dl)        CuAssertDblEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac),(dl))
108b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuAssertDblEquals_Msg(tc,ms,ex,ac,dl) CuAssertDblEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac),(dl))
109b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuAssertPtrEquals(tc,ex,ac)           CuAssertPtrEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac))
110b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuAssertPtrEquals_Msg(tc,ms,ex,ac)    CuAssertPtrEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac))
111b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
112b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuAssertPtrNotNull(tc,p)        CuAssert_Line((tc),__FILE__,__LINE__,"null pointer unexpected",(p != NULL))
113b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define CuAssertPtrNotNullMsg(tc,msg,p) CuAssert_Line((tc),__FILE__,__LINE__,(msg),(p != NULL))
114b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
115b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence/* CuSuite */
116b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
117b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define MAX_TEST_CASES	1024
118b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
119b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#define SUITE_ADD_TEST(SUITE,TEST)	CuSuiteAdd(SUITE, CuTestNew(#TEST, TEST))
120b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
121b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencetypedef struct
122b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
123b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	int count;
124b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	CuTest* list[MAX_TEST_CASES];
125b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	int failCount;
126b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
127b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence} CuSuite;
128b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
129b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
130b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuSuiteInit(CuSuite* testSuite);
131b19eafb97feb6389d78e1693f276fc5b10e25bdSteve LawrenceCuSuite* CuSuiteNew(void);
132b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuSuiteDelete(CuSuite *testSuite);
133b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuSuiteAdd(CuSuite* testSuite, CuTest *testCase);
134b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2);
135b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuSuiteRun(CuSuite* testSuite);
136b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuSuiteSummary(CuSuite* testSuite, CuString* summary);
137b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid CuSuiteDetails(CuSuite* testSuite, CuString* details);
138b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
139b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#endif /* CU_TEST_H */
140