diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2016-11-15 23:14:30 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2016-11-15 23:14:30 -0800 |
commit | 195a846b8ca7b5360c7d19d5d29746f0cee27576 (patch) | |
tree | 75b62bad8cfef44a3a1b734b8e38e2704ccf8248 | |
parent | 00e9ddebbd5c6e23b77a7e43fc8cd6c99a1c0672 (diff) | |
download | mu-195a846b8ca7b5360c7d19d5d29746f0cee27576.tar.gz |
3677 - gracefully handle parse errors in scenarios
Thanks Jack Couch for running into this.
-rw-r--r-- | 050scenario.cc | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/050scenario.cc b/050scenario.cc index a7f59c68..d67b51e0 100644 --- a/050scenario.cc +++ b/050scenario.cc @@ -57,6 +57,10 @@ scenario foo [ struct scenario { string name; string to_run; + void clear() { + name.clear(); + to_run.clear(); + } }; :(before "End Globals") @@ -67,7 +71,9 @@ vector<scenario> Scenarios; :(before "End Command Handlers") else if (command == "scenario") { - Scenarios.push_back(parse_scenario(in)); + scenario result = parse_scenario(in); + if (!result.name.empty()) + Scenarios.push_back(result); } else if (command == "pending-scenario") { // for temporary use only @@ -92,9 +98,17 @@ scenario parse_scenario(istream& in) { // inside comments result.to_run = slurp_quoted(in); // delete [] delimiters - assert(starts_with(result.to_run, "[")); + if (!starts_with(result.to_run, "[")) { + raise << "scenario " << result.name << " should start with '['\n" << end(); + result.clear(); + return result; + } result.to_run.erase(0, 1); - assert(result.to_run.at(SIZE(result.to_run)-1) == ']'); + if (result.to_run.at(SIZE(result.to_run)-1) != ']') { + raise << "scenario " << result.name << " has an unbalanced '['\n" << end(); + result.clear(); + return result; + } result.to_run.erase(SIZE(result.to_run)-1); return result; } @@ -260,6 +274,15 @@ def scenario-foo [ ] +error: redefining recipe scenario-foo +:(scenario scenario_containing_parse_error) +% Hide_errors = true; +scenario foo [ + memory-should-contain [ + 1 <- 0 + # missing ']' +] +# no crash + :(scenario scenario_containing_transform_error) % Hide_errors = true; def main [ |