diff options
-rw-r--r-- | cpp/000organization | 4 | ||||
-rw-r--r-- | cpp/001help | 32 | ||||
-rw-r--r-- | cpp/002test | 72 | ||||
-rw-r--r-- | cpp/014types | 3 | ||||
-rw-r--r-- | cpp/020run | 7 | ||||
-rw-r--r-- | cpp/050scenario | 19 |
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) { |