From 8548dcaeb2f1e887ebe202357cbc5897146f1937 Mon Sep 17 00:00:00 2001 From: Johannes Schriewer Date: Sat, 28 Jul 2018 20:37:17 +0200 Subject: [PATCH] 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() --- tests/test.h | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/tests/test.h b/tests/test.h index 589fcad..4e42d51 100644 --- a/tests/test.h +++ b/tests/test.h @@ -42,15 +42,17 @@ extern DefinedTest defined_tests[]; TEST(NULL, NULL) \ } +#define TEST_OK() return (TestResult){ TestStatusOk, NULL, 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 } #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 -# define TESTASSERT(_assertion, _message) return (TestResult){ (_assertion) ? TestStatusOk : TestStatusFailure, _message } +# define TESTASSERT(_assertion, _message) if (!(_assertion)) { return (TestResult){ TestStatusFailure, _message, NULL, NULL }; } #endif + static inline TestResult TESTMEMCMP(Buffer *template, Buffer *check) { if (template->len != check->len) { 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); 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++) { TestResult result = test->run(); switch (result.status) { case TestStatusOk: + successes++; fprintf(stdout, "info: Test %s suceeded ", test->name); #ifdef TIMETRIAL timetrial(test); @@ -79,20 +84,21 @@ int main(int argc, char **argv) { #endif break; case TestStatusSkipped: + skips++; fprintf(stderr, "%s:%d: warning: Skipped test %s\n", test->file, test->line, test->name); if (result.message) { fprintf(stderr, " -> %s\n", result.message); } break; case TestStatusFailure: - failure_seen = true; + failures++; fprintf(stderr, "%s:%d: error: Test %s failed\n", test->file, test->line, test->name); if (result.message) { fprintf(stderr, " -> %s\n", result.message); } break; case TestStatusFailureHexdump: - failure_seen = true; + failures++; fprintf(stderr, "%s:%d: error: Test %s failed\n", test->file, test->line, test->name); if (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