about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cpp/000organization4
-rw-r--r--cpp/001help32
-rw-r--r--cpp/002test72
-rw-r--r--cpp/014types3
-rw-r--r--cpp/020run7
-rw-r--r--cpp/050scenario19
6 files changed, 62 insertions, 75 deletions
diff --git a/cpp/000organization b/cpp/000organization
index bf703f05..939324ef 100644
--- a/cpp/000organization
+++ b/cpp/000organization
@@ -98,7 +98,11 @@
 // End Globals
 
 int main(int argc, char* argv[]) {
+
   // End One-time Setup
+
+  // End Commandline Parsing
+
   return 0;  // End Main
 }
 
diff --git a/cpp/001help b/cpp/001help
new file mode 100644
index 00000000..c3ce7874
--- /dev/null
+++ b/cpp/001help
@@ -0,0 +1,32 @@
+:(before "End Commandline Parsing")
+if (argc <= 1 || is_equal(argv[1], "--help")) {
+  // this is the functionality later layers will provide
+  // currently no automated tests for commandline arg parsing
+  cerr << "To load files and run 'main':\n"
+       << "  mu file1.mu file2.mu ...\n"
+       << "To run all tests:\n"
+       << "  mu test\n"
+       << "To load files and then run all tests:\n"
+       << "  mu test file1.mu file2.mu ...\n"
+       ;
+  return 0;
+}
+
+:(code)
+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>
+#include<string>
+using std::string;
+#define NOT_FOUND string::npos  // macro doesn't complain about redef
diff --git a/cpp/002test b/cpp/002test
index f704f7f0..6f0fcaa8 100644
--- a/cpp/002test
+++ b/cpp/002test
@@ -16,6 +16,7 @@ const test_fn Tests[] = {
   #include "test_list"  // auto-generated; see makefile
 };
 
+bool Run_tests = false;
 bool Passed = true;  // set this to false inside any test to indicate failure
 long Num_failures = 0;
 
@@ -36,40 +37,24 @@ long Num_failures = 0;
     return;  /* Currently we stop at the very first failure. */ \
   }
 
-:(before "End Main")
-if (argc <= 1 || is_equal(argv[1], "--help")) {
-  // need some way to distribute this across layers
-  cerr << "To load files and run 'main': mu file1.mu file2.mu ...\n"
-       << "To run all core tests: mu test\n"
-       << "To load files and run tests defined in them: mu test file1.mu file2.mu ...\n"
-       << "To run just some C++ tests in `test_list` file: mu test n1 n2 ...\n"
-       << "  (look up n1 n2 ... by running `grep -n` on test_list`)\n"
-       ;
-  return 0;
-}
+:(before "End Commandline Parsing")
 if (argc > 1 && is_equal(argv[1], "test")) {
-  // End Test Run Initialization
-  if (argc == 2) {
-    run_tests();
-    cerr << '\n';
-    if (Num_failures > 0)
-      cerr << Num_failures << " failure"
-           << (Num_failures > 1 ? "s" : "")
-           << '\n';
-    return 0;
-  }
-  if (is_number(argv[2])) {
-    // all args are line numbers in test_file specifying tests to run
-    run_tests(argc, argv);
-    cerr << '\n';
-    if (Num_failures > 0)
-      cerr << Num_failures << " failure"
-           << (Num_failures > 1 ? "s" : "")
-           << '\n';
-    return 0;
-  }
+  Run_tests = true;  --argc;  ++argv;  // shift 'test' out of commandline args
+}
+
+:(before "End Main")
+if (Run_tests) {
+  // Test Runs
+  // we run some tests and then exit; assume no state need be maintained afterward
 
-  // End Test Runs
+  // End Test Run Initialization
+  run_tests();
+  cerr << '\n';
+  if (Num_failures > 0)
+    cerr << Num_failures << " failure"
+         << (Num_failures > 1 ? "s" : "")
+         << '\n';
+  return 0;
 }
 
 :(code)
@@ -82,12 +67,6 @@ void run_tests() {
   // End Tests
 }
 
-void run_tests(int argc, char* argv[]) {
-  for (int i = 2; i < argc; ++i) {
-    run_test(to_int(argv[i])-1);
-  }
-}
-
 void run_test(size_t i) {
   if (i >= sizeof(Tests)/sizeof(Tests[0])) {
     cerr << "no test " << i << '\n';
@@ -102,10 +81,6 @@ void run_test(size_t i) {
   // End Test Teardown
 }
 
-bool is_equal(char* s, const char* lit) {
-  return strncmp(s, lit, strlen(lit)) == 0;
-}
-
 bool is_number(const string& s) {
   return s.find_first_not_of("0123456789-.") == string::npos;
 }
@@ -120,16 +95,3 @@ int to_int(string n) {
 :(before "End Includes")
 #include<assert.h>
 #include<cstdlib>
-
-#include<iostream>
-using std::istream;
-using std::ostream;
-using std::iostream;
-using std::cin;
-using std::cout;
-using std::cerr;
-
-#include<cstring>
-#include<string>
-using std::string;
-#define NOT_FOUND string::npos  // macro doesn't complain about redef
diff --git a/cpp/014types b/cpp/014types
index 60f9c845..1a600c4c 100644
--- a/cpp/014types
+++ b/cpp/014types
@@ -83,8 +83,9 @@ recently_added_types.clear();
 //: lastly, ensure scenarios are consistent by always starting them at the
 //: same type number.
 Next_type_number = 1000;
-:(before "End One-time Setup")
+:(before "End Test Run Initialization")
 assert(Next_type_number < 1000);
+:(before "End Setup")
 Next_type_number = 1000;
 
 :(code)
diff --git a/cpp/020run b/cpp/020run
index 0ce86d7a..3dad12bf 100644
--- a/cpp/020run
+++ b/cpp/020run
@@ -93,13 +93,16 @@ inline bool done(routine& rr) {
   return running_at(rr) >= steps(rr).size();
 }
 
-:(before "End Main")
+:(before "End Commandline Parsing")
 if (argc > 1) {
-  setup();
   for (int i = 1; i < argc; ++i) {
     load(argv[i]);
   }
+}
 
+:(before "End Main")
+if (!Run_tests) {
+  setup();
   Trace_stream = new trace_stream;
 //?   Trace_stream->dump_layer = "all"; //? 2
   transform_all();
diff --git a/cpp/050scenario b/cpp/050scenario
index c863b1b4..9b5b74bb 100644
--- a/cpp/050scenario
+++ b/cpp/050scenario
@@ -183,6 +183,8 @@ void handle_type(const string& lhs, istream& in, scenario& out) {
   raise << "scenario doesn't know how to parse memory expectation on " << lhs << '\n';
 }
 
+//:: Helpers
+
 void slurp_until_matching_bracket(istream& in, ostream& out) {
   int brace_depth = 1;  // just scanned '['
   char c;
@@ -194,23 +196,6 @@ void slurp_until_matching_bracket(istream& in, ostream& out) {
   }
 }
 
-//:: Run tests for loaded mu files (rather than running 'main').
-
-:(before "End Test Runs")
-if (argc > 2 && is_equal(argv[1], "test") && file_exists(argv[2])) {
-  Scenarios.clear();  // ignore core.mu
-  for (int i = 2; i < argc; ++i) {
-    load(argv[i]);
-  }
-  run_mu_tests();
-  cerr << '\n';
-  if (Num_failures > 0)
-    cerr << Num_failures << " failure"
-         << (Num_failures > 1 ? "s" : "")
-         << '\n';
-  return 0;
-}
-
 :(code)
 // for tests
 void parse_scenario(const string& s) {