#ifndef LILY_TEST_H #define LILY_TEST_H #include /* gives a string like 'some/filename:xxx' */ #define STR_IMP(x) #x #define STR(x) STR_IMP(x) /* define SOURCE_PATH_SIZE to strip away the leading parts of the full compilation path */ #ifndef SOURCE_PATH_SIZE #define LILY_LOCATION "" __FILE__ ":" STR(__LINE__) #else #define LILY_LOCATION (("" __FILE__ ":" STR(__LINE__)) + SOURCE_PATH_SIZE) #endif struct lily_test_result_t { int error; const char *message; const char *location; void *data; }; typedef struct lily_test_result_t lily_test; #define LILY_SUCCESS (struct lily_test_result_t){ 0, NULL, NULL, NULL } // assertions #define LILY_NO_ERROR 0 #define LILY_NULL_DATA 1 #define LILY_INT_DATA 2 #define LILY_STRING_DATA 3 #define lily_assert_msg(statement, code, message, data) do { \ if(!(statement)) { \ return (struct lily_test_result_t){ \ (code), (message), LILY_LOCATION, (data) \ }; \ } \ } while(0) #define lily_assert_equal(a, b) \ lily_assert_msg(a == b, LILY_NULL_DATA, #a " is not equal to " #b, NULL) #endif