diff options
Diffstat (limited to 'cpp/001test')
-rw-r--r-- | cpp/001test | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/cpp/001test b/cpp/001test new file mode 100644 index 00000000..45ec591d --- /dev/null +++ b/cpp/001test @@ -0,0 +1,79 @@ +// A simple test harness. To create new tests define functions starting with +// 'test_'. To run all tests so defined, run: +// $ wart test +// +// So far it seems tasteful for layers to never ever reach back to modify +// previously-defined tests. Every test is a contract once written, and should +// pass as-is if it is included, regardless of how much later layers change +// the program. Avoid writing 'temporary' tests that only work with some +// subsets of the program. + +:(before "End Types") +typedef void (*test_fn)(void); + +:(before "End Globals") +const test_fn Tests[] = { + #include "test_list" // auto-generated; see makefile +}; + +bool Passed = true; + +long Num_failures = 0; + +#define CHECK(X) \ + if (!(X)) { \ + ++Num_failures; \ + cerr << "\nF " << __FUNCTION__ << "(" << __FILE__ << ":" << __LINE__ << "): " << #X << '\n'; \ + Passed = false; \ + return; \ + } + +#define CHECK_EQ(X, Y) \ + if ((X) != (Y)) { \ + ++Num_failures; \ + cerr << "\nF " << __FUNCTION__ << "(" << __FILE__ << ":" << __LINE__ << "): " << #X << " == " << #Y << '\n'; \ + cerr << " got " << (X) << '\n'; /* BEWARE: multiple eval */ \ + Passed = false; \ + return; \ + } + +:(after "Commandline Options") + if (is_equal(argv[1], "test")) { + run_tests(); + return 0; + } + +:(code) +void run_tests() { + time_t t; time(&t); + cerr << "C tests: " << ctime(&t); + for (unsigned long i=0; i < sizeof(Tests)/sizeof(Tests[0]); ++i) { + setup(); + // End Test Setup + (*Tests[i])(); + if (Passed) cerr << "."; + // Test Teardown + // End Test Teardown + } + + cerr << '\n'; + if (Num_failures > 0) + cerr << Num_failures << " failure" + << (Num_failures > 1 ? "s" : "") + << '\n'; +} + +bool is_equal(char* s, const char* lit) { + return strncmp(s, lit, strlen(lit)) == 0; +} + +:(before "End Includes") +#include<iostream> +using std::istream; +using std::ostream; +using std::iostream; +using std::cin; +using std::cout; +using std::cerr; + +#include<cstring> |