From f4b2107284329b12f595eba856072b79b824a63f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 8 Nov 2016 16:37:44 +0200 Subject: Implement testscript command-if --- unit-tests/test/script/parser/buildfile | 3 +- unit-tests/test/script/parser/description.test | 2 +- unit-tests/test/script/parser/driver.cxx | 39 +- unit-tests/test/script/parser/if-else.test | 518 +++++++++++++++++++++++++ unit-tests/test/script/parser/scope.test | 4 +- 5 files changed, 557 insertions(+), 9 deletions(-) create mode 100644 unit-tests/test/script/parser/if-else.test (limited to 'unit-tests/test') diff --git a/unit-tests/test/script/parser/buildfile b/unit-tests/test/script/parser/buildfile index f87f7e8..eab5b36 100644 --- a/unit-tests/test/script/parser/buildfile +++ b/unit-tests/test/script/parser/buildfile @@ -12,6 +12,7 @@ test/{target script/{token lexer parser script}} exe{driver}: cxx{driver} ../../../../build2/cxx{$src} $libs \ test{cleanup command-re-parse description exit expansion here-document \ - here-string include pipe-expr pre-parse redirect scope setup-teardown} + here-string if-else include pipe-expr pre-parse redirect scope \ + setup-teardown} include ../../../../build2/ diff --git a/unit-tests/test/script/parser/description.test b/unit-tests/test/script/parser/description.test index c2c441b..48a2faf 100644 --- a/unit-tests/test/script/parser/description.test +++ b/unit-tests/test/script/parser/description.test @@ -172,7 +172,7 @@ $* <>EOE != 0 # both : foo cmd : bar EOI -testscript:2:1: error: both leading and trailing description +testscript:2:1: error: both leading and trailing descriptions EOE # Legal places for a description. diff --git a/unit-tests/test/script/parser/driver.cxx b/unit-tests/test/script/parser/driver.cxx index badb658..de34da7 100644 --- a/unit-tests/test/script/parser/driver.cxx +++ b/unit-tests/test/script/parser/driver.cxx @@ -30,7 +30,8 @@ namespace build2 class print_runner: public runner { public: - print_runner (bool scope, bool id): scope_ (scope), id_ (id) {} + print_runner (bool scope, bool id, bool line) + : scope_ (scope), id_ (id), line_ (line) {} virtual void enter (scope& s, const location&) override @@ -81,9 +82,33 @@ namespace build2 } virtual void - run (scope&, const command_expr& e, size_t, const location&) override + run (scope&, + const command_expr& e, + size_t i, + const location&) override { - cout << ind_ << e << endl; + cout << ind_ << e; + + if (line_) + cout << " # " << i; + + cout << endl; + } + + virtual bool + run_if (scope&, + const command_expr& e, + size_t i, + const location&) override + { + cout << ind_ << "? " << e; + + if (line_) + cout << " # " << i; + + cout << endl; + + return e.back ().pipe.back ().program.string () == "true"; } virtual void @@ -99,10 +124,11 @@ namespace build2 private: bool scope_; bool id_; + bool line_; string ind_; }; - // Usage: argv[0] [-s] [-i] [] + // Usage: argv[0] [-s] [-i] [-l] [] // int main (int argc, char* argv[]) @@ -114,6 +140,7 @@ namespace build2 bool scope (false); bool id (false); + bool line (false); path name; for (int i (1); i != argc; ++i) @@ -124,6 +151,8 @@ namespace build2 scope = true; else if (a == "-i") id = true; + else if (a == "-l") + line = true; else { name = path (move (a)); @@ -168,7 +197,7 @@ namespace build2 script s (tt, st, dir_path (work) /= "test-driver"); p.pre_parse (cin, s); - print_runner r (scope, id); + print_runner r (scope, id, line); p.parse (s, r); } catch (const failed&) diff --git a/unit-tests/test/script/parser/if-else.test b/unit-tests/test/script/parser/if-else.test new file mode 100644 index 0000000..8663920 --- /dev/null +++ b/unit-tests/test/script/parser/if-else.test @@ -0,0 +1,518 @@ +: if-true +: +$* <>EOO +if true foo + cmd1 + cmd2 +end +EOI +? true foo +cmd1 +cmd2 +EOO + +: if-false +: +$* <>EOO +if false foo + cmd1 + cmd2 +end +EOI +? false foo +EOO + +: ifn-true +: +$* <>EOO +if! true foo + cmd1 + cmd2 +end +EOI +? true foo +EOO + +: ifn-false +: +$* <>EOO +if! false foo + cmd1 + cmd2 +end +EOI +? false foo +cmd1 +cmd2 +EOO + +: elif-true +: +$* <>EOO +if false + cmd1 + cmd2 +elif true + cmd3 + cmd4 +end +EOI +? false +? true +cmd3 +cmd4 +EOO + +: elif-false +: +$* <>EOO +if false + cmd1 + cmd2 +elif false + cmd3 + cmd4 +end +EOI +? false +? false +EOO + +: elifn-true +: +$* <>EOO +if false + cmd1 + cmd2 +elif! true + cmd3 + cmd4 +end +EOI +? false +? true +EOO + +: elifn-false +: +$* <>EOO +if false + cmd1 + cmd2 +elif! false + cmd3 + cmd4 +end +EOI +? false +? false +cmd3 +cmd4 +EOO + +: else-true +: +$* <>EOO +if false + cmd1 + cmd2 +else + cmd3 + cmd4 +end +EOI +? false +cmd3 +cmd4 +EOO + +: else-false +: +$* <>EOO +if true + cmd1 + cmd2 +else + cmd3 + cmd4 +end +EOI +? true +cmd1 +cmd2 +EOO + +: if-chain +: +$* <>EOO +if false + cmd + cmd +elif false + cmd + cmd +elif false + cmd + cmd +elif true + cmd1 + cmd2 +elif false + cmd + cmd +else + cmd + cmd +end +EOI +? false +? false +? false +? true +cmd1 +cmd2 +EOO + +: nested-take +: +$* <>EOO +if true + cmd1 + if false + cmd + elif false + if true + cmd + end + else + cmd2 + end + cmd3 +end +EOI +? true +cmd1 +? false +? false +cmd2 +cmd3 +EOO + +: nested-skip +: +$* <>EOO +if false + cmd1 + if false + cmd + elif false + if true + cmd + end + else + cmd2 + end + cmd3 +else + cmd +end +EOI +? false +cmd +EOO + +: line-index +: +$* -l <>EOO +if false + cmd + if true + cmd + end + cmd +elif false + cmd +else + cmd +end +EOI +? false # 1 +? false # 6 +cmd # 8 +EOO + +: var +: +$* <>EOO +if true + x = foo +else + x = bar +end; +cmd \$x +EOI +? true +cmd foo +EOO + +: semi-inside +: +$* <>EOE != 0 +if + cmd; + cmd +end +EOI +testscript:2:3: error: ';' inside 'if' +EOE + +: colon-inside-leading +: +$* <>EOE != 0 +if + : foo + cmd +end +EOI +testscript:2:3: error: description inside 'if' +EOE + +: colon-inside-trailing +: +$* <>EOE != 0 +if + cmd : foo +end +EOI +testscript:2:3: error: description inside 'if' +EOE + +: eos-inside +: +$* <>EOE != 0 +if +EOI +testscript:2:1: error: expected closing 'end' +EOE + +: scope-inside +: +$* <>EOE != 0 +if + { + } +end +EOI +testscript:2:3: error: expected closing 'end' +EOE + +: setup-inside +: +$* <>EOE != 0 +if + +cmd +end +EOI +testscript:2:3: error: setup command inside 'if' +EOE + +: tdown-inside +: +$* <>EOE != 0 +if + -cmd +end +EOI +testscript:2:3: error: teardown command inside 'if' +EOE + +: if-without-command +: +$* <>EOE != 0 +if + cmd +end +EOI +testscript:1:3: error: missing program +EOE + +: command-after-else +: +$* <>EOE != 0 +if true + cmd +else cmd + cmd +end +EOI +testscript:3:6: error: expected newline instead of 'cmd' +EOE + +: command-after-end +: +$* <>EOE != 0 +if true + cmd +end cmd +EOI +testscript:3:5: error: expected newline instead of 'cmd' +EOE + +: elif-without-if +: +$* <>EOE != 0 +cmd +elif true + cmd +end +EOI +testscript:2:1: error: 'elif' without preceding 'if' +EOE + +: elifn-without-if +: +$* <>EOE != 0 +cmd +elif! true + cmd +end +EOI +testscript:2:1: error: 'elif!' without preceding 'if' +EOE + +: else-without-if +: +$* <>EOE != 0 +cmd +else + cmd +end +EOI +testscript:2:1: error: 'else' without preceding 'if' +EOE + +: end-without-if +: +$* <>EOE != 0 +cmd +end +EOI +testscript:2:1: error: 'end' without preceding 'if' +EOE + +: else-after-else +: +$* <>EOE != 0 +if false + cmd +else + cmd +else + cmd +end +EOI +testscript:5:1: error: 'else' after 'else' +EOE + +: elif-after-else +: +$* <>EOE != 0 +if false + cmd +else + cmd +elif true + cmd +end +EOI +testscript:5:1: error: 'elif' after 'else' +EOE + +: if-after-semi +: +$* -s <>EOO +cmd1; +if true + cmd2 +end +EOI +{ + { + cmd1 + ? true + cmd2 + } +} +EOO + +: setup-if +: +$* -s <>EOO ++if true + cmd +end +EOI +{ + ? true + cmd +} +EOO + +: tdown-if +: +$* -s <>EOO +-if true + cmd +end +EOI +{ + ? true + cmd +} +EOO + +: semi-after-end +: +$* -s <>EOO +if true + cmd1 +end; +cmd2 +EOI +{ + { + ? true + cmd1 + cmd2 + } +} +EOO + +: colon-after-end +: +$* -s <>EOO +if true + cmd1 + cmd2 +end : test +EOI +{ + : id:test + { + ? true + cmd1 + cmd2 + } +} +EOO + +: leading-and-trailing-description +: +$* <>EOE != 0 +: foo +if true + cmd +end : bar +EOI +testscript:4:1: error: both leading and trailing descriptions +EOE diff --git a/unit-tests/test/script/parser/scope.test b/unit-tests/test/script/parser/scope.test index 38b6a76..8708b19 100644 --- a/unit-tests/test/script/parser/scope.test +++ b/unit-tests/test/script/parser/scope.test @@ -123,7 +123,7 @@ $* <>EOE != 0 # expected-line-rcbrace cmd; } EOI -testscript:3:1: error: expected another line after semicolon +testscript:3:1: error: expected another line after ';' EOE $* <<:EOI 2>>EOE != 0 # expected-newline-rcbrace @@ -217,7 +217,7 @@ EOE $* <>EOE != 0 # expected-line-eof cmd; EOI -testscript:2:1: error: expected another line after semicolon +testscript:2:1: error: expected another line after ';' EOE $* <<:EOI 2>>EOE != 0 # expected-newline-cmd -- cgit v1.1