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