/* 9unit Copyright (C) Jonathan Lamothe This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include "../9unit.h" #include "util.h" // Local Types typedef struct CompareInts CompareInts; struct CompareInts { const char *context; int expected; int actual; }; // Local Prototypes // compare the run value of two states static void compare_run( TestState *, const char *, const char *, const TestState *, const TestState * ); // compare the passed value of two states static void compare_passed( TestState *, const char *, const char *, const TestState *, const TestState * ); // compare the failed value of two states static void compare_failed( TestState *, const char *, const char *, const TestState *, const TestState * ); // compare the pending value of two states static void compare_pending( TestState *, const char *, const char *, const TestState *, const TestState * ); // compare two ints static void compare_ints( TestState *, const char *, int, int ); decl_test(compare_ints_test); // Public Functions void compare_states( TestState *s, const char *prefix, const char *context, const TestState *expected, const TestState *actual ) { compare_run(s, prefix, context, expected, actual); compare_passed(s, prefix, context, expected, actual); compare_failed(s, prefix, context, expected, actual); compare_pending(s, prefix, context, expected, actual); } // Local Functions static void compare_run( TestState *s, const char *prefix, const char *context, const TestState *expected, const TestState *actual ) { char full_context[STR_BUF_SIZE]; print(prefix); print("run\n"); snprintf(full_context, STR_BUF_SIZE, "%s run:", context); compare_ints(s, full_context, expected->run, actual->run); } static void compare_passed( TestState *s, const char *prefix, const char *context, const TestState *expected, const TestState *actual ) { char full_context[STR_BUF_SIZE]; print(prefix); print("passed\n"); snprintf(full_context, STR_BUF_SIZE, "%s passed:", context); compare_ints(s, full_context, expected->passed, actual->passed); } static void compare_failed( TestState *s, const char *prefix, const char *context, const TestState *expected, const TestState *actual ) { char full_context[STR_BUF_SIZE]; print(prefix); print("failed\n"); snprintf(full_context, STR_BUF_SIZE, "%s failed:", context); compare_ints(s, full_context, expected->failed, actual->failed); } static void compare_pending( TestState *s, const char *prefix, const char *context, const TestState *expected, const TestState *actual ) { char full_context[STR_BUF_SIZE]; print(prefix); print("pending\n"); snprintf(full_context, STR_BUF_SIZE, "%s pending:", context); compare_ints(s, full_context, expected->pending, actual->pending); } static void compare_ints( TestState *s, const char *context, int expected, int actual ) { void *old_ptr = s->ptr; CompareInts ci; ci.context = context; ci.expected = expected; ci.actual = actual; s->ptr = &ci; run_test(s, compare_ints_test); s->ptr = old_ptr; } def_test(compare_ints_test, s) { const CompareInts *ci = s->ptr; if (ci->actual == ci->expected) return test_success; char str[STR_BUF_SIZE]; append_test_log(s, ci->context); snprintf(str, STR_BUF_SIZE, "\texpected: %d", ci->expected); append_test_log(s, str); snprintf(str, STR_BUF_SIZE, "\tactual: %d", ci->actual); append_test_log(s, str); return test_failure; } //jl