diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-04-22 13:29:02 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-04-22 13:30:13 -0700 |
commit | b39ceb27794272100154b88b6d50195d1dca0431 (patch) | |
tree | 8ad4ea50075be99e874c63c95067a3ce410d4a64 /cpp | |
parent | 8c9ffa039f2f623cf61f263d487c1f4a919bea65 (diff) | |
download | mu-b39ceb27794272100154b88b6d50195d1dca0431.tar.gz |
1133 - more reorg of commandline parsing
1. Drop the ability to run just some C++ tests. It's a lousy interface to use line numbers, we can't selectively run mu tests, we haven't used it in a while because our tests run plenty fast, and it's complicating other parts, like Next_recipe_number and test space handling. 2. Create a new layer right up top to show the usage message and all the different forms that are possible. Good for documentation until we come up with a way to put the different forms in their own layers. At least it's out of the test layer now. 3. Strengthen the assertion that no recipes exist in test space before we start running any sorts of tests. Earlier it was possible for files loaded explicitly to overflow into test space because we were asserting before load, not after. Now we check if we need to run tests, load all files, then make the assertion, run tests, and exit if necessary. Now we don't need to mess with commandline args at all in layer 50. That's a sign that we're on the right track.
Diffstat (limited to 'cpp')
-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) { |