Modify test harnish:

- Successful TESTASSERTs now continue on
- Failed TESTASSERTs stop the test function with an error message
- Test binary outputs summary at end
- Tests have to be finished with TEST_OK()
This commit is contained in:
Johannes Schriewer 2018-07-28 20:37:17 +02:00
parent dbcc491a5d
commit 8548dcaeb2

View file

@ -42,15 +42,17 @@ extern DefinedTest defined_tests[];
TEST(NULL, NULL) \ TEST(NULL, NULL) \
} }
#define TEST_OK() return (TestResult){ TestStatusOk, NULL, NULL, NULL }
#define TESTRESULT(_status, _message) return (TestResult){ _status, _message, NULL, NULL } #define TESTRESULT(_status, _message) return (TestResult){ _status, _message, NULL, NULL }
#define TESTRESULT_BUFFER(_status, _message, _buffer, _template) return (TestResult){ _status, _message, _buffer, _template } #define TESTRESULT_BUFFER(_status, _message, _buffer, _template) return (TestResult){ _status, _message, _buffer, _template }
#ifdef TIMETRIAL #ifdef TIMETRIAL
# define TESTASSERT(_assertion, _message) return (TestResult){ (_assertion) ? TestStatusOk : TestStatusFailure, NULL } # define TESTASSERT(_assertion, _message) if (!(_assertion)) { return (TestResult){ TestStatusFailure, NULL, NULL, NULL }; }
#else #else
# define TESTASSERT(_assertion, _message) return (TestResult){ (_assertion) ? TestStatusOk : TestStatusFailure, _message } # define TESTASSERT(_assertion, _message) if (!(_assertion)) { return (TestResult){ TestStatusFailure, _message, NULL, NULL }; }
#endif #endif
static inline TestResult TESTMEMCMP(Buffer *template, Buffer *check) { static inline TestResult TESTMEMCMP(Buffer *template, Buffer *check) {
if (template->len != check->len) { if (template->len != check->len) {
TESTRESULT_BUFFER(TestStatusFailureHexdump, "Buffer size differs from template", check, template); TESTRESULT_BUFFER(TestStatusFailureHexdump, "Buffer size differs from template", check, template);
@ -65,12 +67,15 @@ static inline TestResult TESTMEMCMP(Buffer *template, Buffer *check) {
void timetrial(DefinedTest *test); void timetrial(DefinedTest *test);
int main(int argc, char **argv) { int main(int argc, char **argv) {
bool failure_seen = false; uint16_t successes = 0;
uint16_t skips = 0;
uint16_t failures = 0;
for(DefinedTest *test = defined_tests; test->run != NULL; test++) { for(DefinedTest *test = defined_tests; test->run != NULL; test++) {
TestResult result = test->run(); TestResult result = test->run();
switch (result.status) { switch (result.status) {
case TestStatusOk: case TestStatusOk:
successes++;
fprintf(stdout, "info: Test %s suceeded ", test->name); fprintf(stdout, "info: Test %s suceeded ", test->name);
#ifdef TIMETRIAL #ifdef TIMETRIAL
timetrial(test); timetrial(test);
@ -79,20 +84,21 @@ int main(int argc, char **argv) {
#endif #endif
break; break;
case TestStatusSkipped: case TestStatusSkipped:
skips++;
fprintf(stderr, "%s:%d: warning: Skipped test %s\n", test->file, test->line, test->name); fprintf(stderr, "%s:%d: warning: Skipped test %s\n", test->file, test->line, test->name);
if (result.message) { if (result.message) {
fprintf(stderr, " -> %s\n", result.message); fprintf(stderr, " -> %s\n", result.message);
} }
break; break;
case TestStatusFailure: case TestStatusFailure:
failure_seen = true; failures++;
fprintf(stderr, "%s:%d: error: Test %s failed\n", test->file, test->line, test->name); fprintf(stderr, "%s:%d: error: Test %s failed\n", test->file, test->line, test->name);
if (result.message) { if (result.message) {
fprintf(stderr, " -> %s\n", result.message); fprintf(stderr, " -> %s\n", result.message);
} }
break; break;
case TestStatusFailureHexdump: case TestStatusFailureHexdump:
failure_seen = true; failures++;
fprintf(stderr, "%s:%d: error: Test %s failed\n", test->file, test->line, test->name); fprintf(stderr, "%s:%d: error: Test %s failed\n", test->file, test->line, test->name);
if (result.message) { if (result.message) {
fprintf(stderr, " -> %s\n", result.message); fprintf(stderr, " -> %s\n", result.message);
@ -109,7 +115,14 @@ int main(int argc, char **argv) {
} }
} }
return failure_seen; fprintf(stderr, "\n%d Tests, %d skipped, %d succeeded, %d failed\n\n",
skips + successes + failures,
skips,
successes,
failures
);
return failures > 0;
} }
#ifdef TIMETRIAL #ifdef TIMETRIAL