Я сделал это для простого C, основываясь на ответе Notinlist (спасибо!):
my_assert.c:
void _assert_int(char *astr, char *oper, char *bstr, int a, int b, char *file, int line) {
printf("\nAssertion failed: %s %s %s\n%s = %d\n%s = %d\nfile: %s\nline: %d\n", astr, oper, bstr, astr, a, bstr, b, file, line);
exit(1);
}
void _assert_str_equal(char *vara, char *varb, char *a, char *b, char *file, int line) {
if (a == b) {
#ifdef TREAT_BOTH_NULL_STRS_AS_ERROR
if (a != 0) return;
goto loc_failed;
#else
return;
#endif
}
if ((a == 0) || (b == 0) || (strcmp(a, b) != 0)) {
loc_failed:
printf("\nAssertion failed: %s == %s\n%s = %s\n%s = %s\nfile: %s\nline: %d\n", vara, varb, vara, a, varb, b, file, line);
exit(1);
}
}
my_assert.h:
#define TREAT_BOTH_NULL_STRS_AS_ERROR
#define assert_int(left,operator,right) do { if(!((left) operator (right))) _assert_int(#left, #operator, #right, left, right, __FILE__, __LINE__); } while (0)
#define assert_str_equal(left,right) do { _assert_str_equal(#left, #right, left, right, __FILE__, __LINE__); } while (0)
использование:
assert_int(a,==,b);
assert_str_equal(str1,str2);
проверьте также основную систему модульных испытаний