about summary refs log tree commit diff stats
path: root/cpp/literate/001test
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-02-17 16:57:37 -0800
committerKartik K. Agaram <vc@akkartik.com>2015-02-17 17:14:45 -0800
commit515309164793b2e03c15954bf8a89f0f288a7f2c (patch)
tree7fd7ed06fc7a7a772c6002cbb57b59faafcd6ada /cpp/literate/001test
parent6042828bdea2a1ed1da1b0d2013a4479fb3d005a (diff)
downloadmu-515309164793b2e03c15954bf8a89f0f288a7f2c.tar.gz
775 - starting to reorg C++ mu to use layers
Diffstat (limited to 'cpp/literate/001test')
-rw-r--r--cpp/literate/001test79
1 files changed, 79 insertions, 0 deletions
diff --git a/cpp/literate/001test b/cpp/literate/001test
new file mode 100644
index 00000000..45ec591d
--- /dev/null
+++ b/cpp/literate/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>