| #include <stdarg.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include "harness.h" |
| |
| test_batch_runner* |
| test_batch_runner_new() |
| { |
| return (test_batch_runner *)calloc(1, sizeof(test_batch_runner)); |
| } |
| |
| static void |
| test_result(test_batch_runner *runner, int cond, const char *msg, va_list ap) |
| { |
| ++runner->test_num; |
| |
| if (cond) { |
| ++runner->num_passed; |
| } |
| else { |
| fprintf(stderr, "FAILED test %d: ", runner->test_num); |
| vfprintf(stderr, msg, ap); |
| fprintf(stderr, "\n"); |
| ++runner->num_failed; |
| } |
| } |
| |
| void |
| SKIP(test_batch_runner *runner, int num_tests) |
| { |
| runner->test_num += num_tests; |
| runner->num_skipped += num_tests; |
| } |
| |
| void |
| OK(test_batch_runner *runner, int cond, const char *msg, ...) |
| { |
| va_list ap; |
| va_start(ap, msg); |
| test_result(runner, cond, msg, ap); |
| va_end(ap); |
| } |
| |
| void |
| INT_EQ(test_batch_runner *runner, int got, int expected, const char *msg, ...) |
| { |
| int cond = got == expected; |
| |
| va_list ap; |
| va_start(ap, msg); |
| test_result(runner, cond, msg, ap); |
| va_end(ap); |
| |
| if (!cond) { |
| fprintf(stderr, " Got: %d\n", got); |
| fprintf(stderr, " Expected: %d\n", expected); |
| } |
| } |
| |
| void |
| STR_EQ(test_batch_runner *runner, const char *got, const char *expected, |
| const char *msg, ...) |
| { |
| int cond = strcmp(got, expected) == 0; |
| |
| va_list ap; |
| va_start(ap, msg); |
| test_result(runner, cond, msg, ap); |
| va_end(ap); |
| |
| if (!cond) { |
| fprintf(stderr, " Got: \"%s\"\n", got); |
| fprintf(stderr, " Expected: \"%s\"\n", expected); |
| } |
| } |
| |
| int |
| test_ok(test_batch_runner *runner) |
| { |
| return runner->num_failed == 0; |
| } |
| |
| void |
| test_print_summary(test_batch_runner *runner) |
| { |
| int num_passed = runner->num_passed; |
| int num_skipped = runner->num_skipped; |
| int num_failed = runner->num_failed; |
| |
| fprintf(stderr, "%d tests passed, %d failed, %d skipped\n", |
| num_passed, num_failed, num_skipped); |
| |
| if (test_ok(runner)) { |
| fprintf(stderr, "PASS\n"); |
| } |
| else { |
| fprintf(stderr, "FAIL\n"); |
| } |
| } |
| |