defaultcpp/tests/test.h

43 lines
1.2 KiB
C++

#define TESTFAILED 0
#define TESTGOOD 1
#define TESTSKIPPED -1
#include <iostream>
#define TESTDATA "./tests/data/"
// very helpfull: https://mgalgs.io/2013/05/10/hacking-your-ELF-for-fun-and-profit.html
#define TESTNAME(NAME) test_##NAME
#define TESTFUNC(NAME) int TESTNAME(NAME)()
#define REGISTERTEST(NAME) static const testdef __test_ ## NAME \
__attribute((__section__("testlist"))) \
__attribute((__used__)) = { \
TESTNAME(NAME), \
#NAME, \
}
#define TEST(NAME) static TESTFUNC(NAME); \
REGISTERTEST(NAME); \
TESTFUNC(NAME) {
#define TESTEND return TESTGOOD; } \
#define ASSERT(BED, ERR) if(!(BED)) { std::cout << __FILE__ << ":" << __LINE__ << " " << ERR << ' ' << std::flush; return TESTFAILED; }
#define CMPASSERTE(IS, SHOULD, ERR) if( !((IS) == (SHOULD))) { std::cout << __FILE__ << ":" << __LINE__ << " is: \"" << (IS) << "\" should: \"" << (SHOULD) << "\" "<< std::flush; return TESTFAILED; }
#define CMPASSERT(IS, SHOULD) CMPASSERTE(IS, SHOULD, "")
#define SKIPTEST return TESTSKIPPED
typedef int (*test_t)();
struct testdef {
test_t testf;
const char* name;
};
// linker generates this <3
extern struct testdef __start_testlist;
extern struct testdef __stop_testlist;