137 lines
2.8 KiB
C
137 lines
2.8 KiB
C
/*
|
|
* testrunner.h
|
|
*
|
|
* Created on: Jun 19, 2013
|
|
* Author: petera
|
|
*/
|
|
|
|
/*
|
|
|
|
SUITE(mysuite)
|
|
|
|
void setup(test *t) {}
|
|
|
|
void teardown(test *t) {}
|
|
|
|
TEST(mytest) {
|
|
printf("mytest runs now..\n");
|
|
return 0;
|
|
} TEST_END(mytest)
|
|
|
|
SUITE_END(mysuite)
|
|
|
|
|
|
|
|
SUITE(mysuite2)
|
|
|
|
void setup(test *t) {}
|
|
|
|
void teardown(test *t) {}
|
|
|
|
TEST(mytest2a) {
|
|
printf("mytest2a runs now..\n");
|
|
return 0;
|
|
} TEST_END(mytest2a)
|
|
|
|
TEST(mytest2b) {
|
|
printf("mytest2b runs now..\n");
|
|
return 0;
|
|
} TEST_END(mytest2b)
|
|
|
|
SUITE_END(mysuite2)
|
|
|
|
|
|
|
|
void add_suites() {
|
|
ADD_SUITE(mysuite);
|
|
ADD_SUITE(mysuite2);
|
|
}
|
|
*/
|
|
|
|
#ifndef TESTRUNNER_H_
|
|
#define TESTRUNNER_H_
|
|
|
|
#define TEST_RES_OK 0
|
|
#define TEST_RES_FAIL -1
|
|
#define TEST_RES_ASSERT -2
|
|
|
|
struct test_s;
|
|
|
|
typedef int (*test_f)(struct test_s *t);
|
|
|
|
typedef struct test_s {
|
|
test_f f;
|
|
char name[256];
|
|
void *data;
|
|
void (*setup)(struct test_s *t);
|
|
void (*teardown)(struct test_s *t);
|
|
struct test_s *_next;
|
|
unsigned char test_result;
|
|
} test;
|
|
|
|
typedef struct test_res_s {
|
|
char name[256];
|
|
struct test_res_s *_next;
|
|
} test_res;
|
|
|
|
#define TEST_CHECK(x) if (!(x)) { \
|
|
printf(" TEST FAIL %s:%i\n", __FILE__, __LINE__); \
|
|
goto __fail_stop; \
|
|
}
|
|
#define TEST_CHECK_EQ(x, y) if ((x) != (y)) { \
|
|
printf(" TEST FAIL %s:%i, %i != %i\n", __FILE__, __LINE__, (x), (y)); \
|
|
goto __fail_stop; \
|
|
}
|
|
#define TEST_CHECK_NEQ(x, y) if ((x) == (y)) { \
|
|
printf(" TEST FAIL %s:%i, %i == %i\n", __FILE__, __LINE__, (x), (y)); \
|
|
goto __fail_stop; \
|
|
}
|
|
#define TEST_CHECK_GT(x, y) if ((x) <= (y)) { \
|
|
printf(" TEST FAIL %s:%i, %i <= %i\n", __FILE__, __LINE__, (x), (y)); \
|
|
goto __fail_stop; \
|
|
}
|
|
#define TEST_CHECK_LT(x, y) if ((x) >= (y)) { \
|
|
printf(" TEST FAIL %s:%i, %i >= %i\n", __FILE__, __LINE__, (x), (y)); \
|
|
goto __fail_stop; \
|
|
}
|
|
#define TEST_CHECK_GE(x, y) if ((x) < (y)) { \
|
|
printf(" TEST FAIL %s:%i, %i < %i\n", __FILE__, __LINE__, (x), (y)); \
|
|
goto __fail_stop; \
|
|
}
|
|
#define TEST_CHECK_LE(x, y) if ((x) > (y)) { \
|
|
printf(" TEST FAIL %s:%i, %i > %i\n", __FILE__, __LINE__, (x), (y)); \
|
|
goto __fail_stop; \
|
|
}
|
|
#define TEST_ASSERT(x) if (!(x)) { \
|
|
printf(" TEST ASSERT %s:%i\n", __FILE__, __LINE__); \
|
|
goto __fail_assert; \
|
|
}
|
|
|
|
#define DBGT(...) printf(__VA_ARGS__)
|
|
|
|
#define str(s) #s
|
|
|
|
#define SUITE(sui) \
|
|
extern void __suite_##sui() {
|
|
#define SUITE_END(sui) \
|
|
}
|
|
#define ADD_SUITE(sui) \
|
|
__suite_##sui();
|
|
#define TEST(tf) \
|
|
int tf(struct test_s *t) { do
|
|
#define TEST_END(tf) \
|
|
while(0); \
|
|
__fail_stop: return TEST_RES_FAIL; \
|
|
__fail_assert: return TEST_RES_ASSERT; \
|
|
} \
|
|
add_test(tf, str(tf), setup, teardown);
|
|
|
|
|
|
void add_suites();
|
|
void test_init(void (*on_stop)(test *t));
|
|
void add_test(test_f f, char *name, void (*setup)(test *t), void (*teardown)(test *t));
|
|
// returns 0 if all tests ok, -1 if any test failed, -2 on badness
|
|
int run_tests(int argc, char **args);
|
|
|
|
#endif /* TESTRUNNER_H_ */
|