From b808c255b6a9ddba085bf5646e7d20ec344f2e2d Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 28 Apr 2020 08:48:53 +0200 Subject: Initial support for ad hoc recipes (still work in progress) --- tests/dependency/chain/testscript | 2 +- tests/dependency/recipe/buildfile | 4 + tests/dependency/recipe/testscript | 344 +++++++++++++++++++++++++++ tests/test/script/builtin/mv.testscript | 8 +- tests/test/script/builtin/rm.testscript | 6 +- tests/test/script/builtin/rmdir.testscript | 6 +- tests/test/script/runner/cleanup.testscript | 12 +- tests/test/script/runner/redirect.testscript | 195 +++++++++++++-- 8 files changed, 538 insertions(+), 39 deletions(-) create mode 100644 tests/dependency/recipe/buildfile create mode 100644 tests/dependency/recipe/testscript (limited to 'tests') diff --git a/tests/dependency/chain/testscript b/tests/dependency/chain/testscript index 9232840..ac4a946 100644 --- a/tests/dependency/chain/testscript +++ b/tests/dependency/chain/testscript @@ -3,7 +3,7 @@ .include ../../common.testscript -: basic +: basics : $* <>/~%EOE% ./: dir{x}: dir{a} diff --git a/tests/dependency/recipe/buildfile b/tests/dependency/recipe/buildfile new file mode 100644 index 0000000..3dc5452 --- /dev/null +++ b/tests/dependency/recipe/buildfile @@ -0,0 +1,4 @@ +# file : tests/dependency/recipe/buildfile +# license : MIT; see accompanying LICENSE file + +./: testscript $b diff --git a/tests/dependency/recipe/testscript b/tests/dependency/recipe/testscript new file mode 100644 index 0000000..5510e3c --- /dev/null +++ b/tests/dependency/recipe/testscript @@ -0,0 +1,344 @@ +# file : tests/dependency/recipe/testscript +# license : MIT; see accompanying LICENSE file + +.include ../../common.testscript + +# Note: in the parser we have to handle recipes for the with/without +# prerequisites cases separately. So we try to cover both here. + +: basics +: +$* <>/~%EOE% +alias{x}: alias{z} +{{ + cmd +}} +dump alias{x} +EOI +:5:1: dump: +% .+/alias\{x\}: .+/:alias\{z\}% + {{ + cmd + }} +EOE + +: basics-replay +: +$* <>/~%EOE% +alias{x y}: alias{z} +{{ + cmd +}} +dump alias{y} +EOI +:5:1: dump: +% .+/alias\{y\}: .+/:alias\{z\}% + {{ + cmd + }} +EOE + +: basics-header +: +$* <>/~%EOE% +alias{x}: +% +{{ + cmd +}} +dump alias{x} +EOI +:6:1: dump: +% .+/alias\{x\}:% + {{ + cmd + }} +EOE + +: basics-header-replay +: +$* <>/~%EOE% +alias{x y}: +% +{{ + cmd +}} +dump alias{y} +EOI +:6:1: dump: +% .+/alias\{y\}:% + {{ + cmd + }} +EOE + +: basics-lang +: +$* <>/~%EOE% +alias{x}: +{{ c++ + void f (); +}} +dump alias{x} +EOI +:5:1: dump: +% .+/alias\{x\}:% + {{ c++ + void f (); + }} +EOE + +: with-vars +: +$* <>/~%EOE% +alias{x}: +{ + var = x +} +{{ + cmd +}} +dump alias{x} +EOI +:8:1: dump: +% .+/alias\{x\}:% + { + var = x + } + {{ + cmd + }} +EOE + +: with-vars-replay +: +$* <>/~%EOE% +alias{x y}: alias{z} +{ + var = x +} +{{ + cmd +}} +dump alias{y} +EOI +:8:1: dump: +% .+/alias\{y\}: .+/:alias\{z\}% + { + var = x + } + {{ + cmd + }} +EOE + +: with-vars-header +: +$* <>/~%EOE% +alias{x}: alias{z} +{ + var = x +} +% +{{ + cmd +}} +dump alias{x} +EOI +:9:1: dump: +% .+/alias\{x\}: .+/:alias\{z\}% + { + var = x + } + {{ + cmd + }} +EOE + +: with-vars-header-replay +: +$* <>/~%EOE% +alias{x y}: +{ + var = x +} +% +{{ + cmd +}} +dump alias{y} +EOI +:9:1: dump: +% .+/alias\{y\}:% + { + var = x + } + {{ + cmd + }} +EOE + +: chain +: +$* <>/~%EOE% +alias{x}: +{{ + cmd1 +}} +{{{ + cmd2 +}}} +dump alias{x} +EOI +:8:1: dump: +% .+/alias\{x\}:% + {{ + cmd1 + }} + {{{ + cmd2 + }}} +EOE + +: chain-replay +: +$* <>/~%EOE% +alias{x y}: alias{z} +{{ + cmd1 +}} +{{{ + cmd2 +}}} +dump alias{y} +EOI +:8:1: dump: +% .+/alias\{y\}: .+/:alias\{z\}% + {{ + cmd1 + }} + {{{ + cmd2 + }}} +EOE + +: chain-header +: +$* <>/~%EOE% +alias{x}: alias{z} + +{{ + cmd1 +}} + +% +{{{ + cmd2 +}}} +dump alias{x} +EOI +:11:1: dump: +% .+/alias\{x\}: .+/:alias\{z\}% + {{ + cmd1 + }} + {{{ + cmd2 + }}} +EOE + +: chain-header-replay +: +$* <>/~%EOE% +alias{x y}: + +{{ + cmd1 +}} + +% +{{{ + cmd2 +}}} +dump alias{y} +EOI +:11:1: dump: +% .+/alias\{y\}:% + {{ + cmd1 + }} + {{{ + cmd2 + }}} +EOE + +: unterminated +: +$* <>EOE != 0 +alias{x}: +{{{ + cmd +}} +EOI +:5:1: error: unterminated recipe block + :2:1: info: recipe block starts here +EOE + +: expected-lang +: +$* <>EOE != 0 +alias{x}: +{{ $lang + cmd +}} +EOI +:2:4: error: expected recipe language instead of '$' +EOE + +: header-attribute +: +$* <>/~!EOE! +alias{x}: +% [diag=gen] +{{ + cmd +}} +dump alias{x} +EOI +:6:1: dump: +! .+/alias\{x\}:! + % [diag=gen] + {{ + cmd + }} +EOE + +: header-attribute-replay +: +$* <>/~!EOE! +alias{x y}: +% [diag=gen] +{{ + cmd +}} +dump alias{y} +EOI +:6:1: dump: +! .+/alias\{y\}:! + % [diag=gen] + {{ + cmd + }} +EOE + +: header-missing-block +: +$* <>EOE != 0 +alias{x}: +% +{ + cmd +} +EOI +:3:1: error: expected recipe block instead of '{' +EOE diff --git a/tests/test/script/builtin/mv.testscript b/tests/test/script/builtin/mv.testscript index 31e2603..764c1e0 100644 --- a/tests/test/script/builtin/mv.testscript +++ b/tests/test/script/builtin/mv.testscript @@ -21,8 +21,8 @@ : Moving path outside the testscript working directory fails. : $c <>/~%EOE% == 1 - %mv: '.+/fail/a/b/c' is out of working directory '.+/fail/test'% + mv ../../a/b/c ./c 2>>/EOE == 1 + mv: 'a/b/c' is out of working directory 'test/' EOE EOI @@ -84,14 +84,14 @@ : src : $c <"mv: '$~' contains test working directory '$~'" != 0 + mv $~ b 2>/"mv: 'test/1/' contains test working directory 'test/1/'" != 0 EOI : dst : $c <"mv: '$~' contains test working directory '$~'" != 0 + mv a "$~" 2>/"mv: 'test/1' contains test working directory 'test/1/'" != 0 EOI } diff --git a/tests/test/script/builtin/rm.testscript b/tests/test/script/builtin/rm.testscript index 5b00042..21ec2a9 100644 --- a/tests/test/script/builtin/rm.testscript +++ b/tests/test/script/builtin/rm.testscript @@ -11,7 +11,7 @@ : Removing scope directory fails. : $c <"rm: '$~' contains test working directory '$~'" == 1 + rm -r ./ 2>/"rm: 'test/1/' contains test working directory 'test/1/'" == 1 EOI } @@ -28,8 +28,8 @@ : Removing path outside the testscript working directory fails. : $c <>/~%EOE% == 1 - %rm: '.+/path/outside-scope/fail/a/b/c' is out of working directory '.+/path/outside-scope/fail/test'% + rm ../../a/b/c 2>>/EOE == 1 + rm: 'a/b/c' is out of working directory 'test/' EOE EOI diff --git a/tests/test/script/builtin/rmdir.testscript b/tests/test/script/builtin/rmdir.testscript index 269dd58..a63a5dd 100644 --- a/tests/test/script/builtin/rmdir.testscript +++ b/tests/test/script/builtin/rmdir.testscript @@ -11,7 +11,7 @@ : Removing scope directory fails. : $c <"rmdir: '$~' contains test working directory '$~'" == 1 + rmdir ./ 2>/"rmdir: 'test/1/' contains test working directory 'test/1/'" == 1 EOI : outside-scope @@ -24,8 +24,8 @@ : Removing directory outside the testscript working directory fails. : $c <>/~%EOE% == 1 - %rmdir: '.+/dir/outside-scope/fail/a/b/c/' is out of working directory '.+/dir/outside-scope/fail/test'% + rmdir ../../a/b/c 2>>/EOE == 1 + rmdir: 'a/b/c/' is out of working directory 'test/' EOE EOI diff --git a/tests/test/script/runner/cleanup.testscript b/tests/test/script/runner/cleanup.testscript index e39ae95..03153e4 100644 --- a/tests/test/script/runner/cleanup.testscript +++ b/tests/test/script/runner/cleanup.testscript @@ -56,7 +56,7 @@ b += --no-column : Test explicit cleanup of a file out of the testscript working directory. : $c <'$* &../../a' && $b 2>>/EOE != 0 - testscript:1: error: file cleanup ../../a is out of working directory test/ + testscript:1: error: file cleanup ../../a is out of working directory 'test/' info: test id: 1 EOE @@ -116,7 +116,7 @@ b += --no-column : Test cleanup of a directory out of the testscript working directory. : $c <'$* &../../a/' && $b 2>>/EOE != 0 - testscript:1: error: directory cleanup ../../a/ is out of working directory test/ + testscript:1: error: directory cleanup ../../a/ is out of working directory 'test/' info: test id: 1 EOE @@ -150,7 +150,7 @@ b += --no-column : dir : $c <'$* -d a/b' && $b 2>>/EOE != 0 - testscript:1: error: registered for cleanup directory test/1/ is not empty + testscript:1: error: test working directory 'test/1/' is not empty a/ info: test id: 1 EOE @@ -220,7 +220,7 @@ b += --no-column : Test cleanup of a wildcard out of the testscript working directory. : $c <'$* &../../a/***' && $b 2>>/EOE != 0 - testscript:1: error: wildcard cleanup ../../a/*** is out of working directory test/ + testscript:1: error: wildcard cleanup ../../a/*** is out of working directory 'test/' info: test id: 1 EOE @@ -346,7 +346,7 @@ EOI : Test an implicit cleanup being overwritten with the explicit one, : $c <'$* -o foo >=a &!a' && $b 2>>/EOE != 0 -testscript:1: error: registered for cleanup directory test/1/ is not empty +testscript:1: error: test working directory 'test/1/' is not empty a info: test id: 1 EOE @@ -359,7 +359,7 @@ $c <>/EOE != 0 $* &!a; $* -o foo >=a EOO -testscript:2: error: registered for cleanup directory test/1/ is not empty +testscript:2: error: test working directory 'test/1/' is not empty a info: test id: 1 EOE diff --git a/tests/test/script/runner/redirect.testscript b/tests/test/script/runner/redirect.testscript index b8fe74d..0fe3aa3 100644 --- a/tests/test/script/runner/redirect.testscript +++ b/tests/test/script/runner/redirect.testscript @@ -80,10 +80,14 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : literal : { - $c <'$* -i 0 foo' && $b : out - $c <'$* -e foo 2>foo' && $b : err - $c <'$* -i 1 foo' && $b : inout + $c <'$* -i 0 <<<=foo' && $b : in + $c <'$* -i 0 >>?foo' && $b : out + $c <'$* -o foo >foo' && $b : out-alias + $c <'$* -e foo 2>>>?foo' && $b : err + $c <'$* -e foo 2>foo' && $b : err-alias + $c <'$* -i 1 <<<=foo >>>?foo' && $b : inout + $c <'$* -i 1 foo' && $b : inout-alias : inout-fail : @@ -101,11 +105,16 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. info: test id: 1 EOE - $c <'$* -i 2 foo' && $b : inerr - $c <'$* -i 1 -e bar foo 2>bar' && $b : inout-err - $c <'$* -o "" >""' && $b : empty - $c <'$* -i 1 <:"foo" >:"foo"' && $b : no-newline - $c <'$* -i 1 <:"" >:""' && $b : no-newline-empty + $c <'$* -i 2 <<<=foo 2>>>?foo' && $b : inerr + $c <'$* -i 2 foo' && $b : inerr-alias + $c <'$* -i 1 -e bar <<<=foo 1>>>?foo 2>>>?bar' && $b : inout-err + $c <'$* -i 1 -e bar foo 2>bar' && $b : inout-err-alias + $c <'$* -o "" >>>?""' && $b : empty + $c <'$* -o "" >""' && $b : empty-alias + $c <'$* -i 1 <<<=:"foo" >>>?:"foo"' && $b : no-newline + $c <'$* -i 1 <:"foo" >:"foo"' && $b : no-newline-alias + $c <'$* -i 1 <<<=:"" >>>?:""' && $b : no-newline-empty + $c <'$* -i 1 <:"" >:""' && $b : no-newline-empty-alias : no-newline-fail1 : @@ -132,6 +141,15 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : merge : $c <>?EOE 1>&2 + foo + bar + EOE + EOI + + : merge-alias + : + $c <>EOE 1>&2 foo bar @@ -155,6 +173,10 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. { : match : + $c <'$* -o foo >>>?~/Foo?/i' && $b + + : match-alias + : $c <'$* -o foo >~/Foo?/i' && $b : mismatch @@ -209,6 +231,15 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : in : $c <>?EOO + foo + bar + EOO + EOI + + : out-alias + : + $c <>EOO foo bar @@ -227,6 +267,15 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : err : $c <>?EOO + foo + bar + EOO + EOI + + : err-alias + : + $c <>EOO foo bar @@ -236,6 +285,18 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : inout : $c <>?EOO + foo + bar + EOF + foo + bar + EOO + EOI + + : inout-alias + : + $c <>EOO foo bar @@ -248,6 +309,19 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : inerr : $c <>?EOE + foo + bar + EOF + foo + bar + EOE + EOI + + + : inerr-alias + : + $c <>EOE foo bar @@ -260,6 +334,14 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : empty : $c <>?EOO + EOF + EOO + EOI + + : empty-alias + : + $c <>EOO EOF EOO @@ -268,16 +350,43 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : shared : $c <>?EOF + foo + bar + EOF + EOI + + : shared-alias + : + $c <>EOF foo bar EOF EOI + : shared-in-alias + : + $c <>?EOF + foo + bar + EOF + EOI + + : shared-out-alias + : + $c <>EOF + foo + bar + EOF + EOI + : extra-newline : $c <>EOO + $* -i 1 <<=EOF >>?EOO EOF @@ -287,7 +396,7 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : no-newline : $c <>:EOO + $* -i 1 <<=:EOF >>?:EOO foo EOF foo @@ -297,7 +406,7 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : no-newline-fail1 : $c <>~/EOE/ != 0 - $* -i 1 <<:EOF >>EOO + $* -i 1 <<=:EOF >>?EOO foo EOF foo @@ -314,7 +423,7 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : no-newline-fail2 : $c <>~/EOE/ != 0 - $* -i 1 <>:EOO + $* -i 1 <<=EOF >>?:EOO foo EOF foo @@ -331,7 +440,7 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : no-newline-empty : $c <>:EOO + $* -i 1 <<=:EOF >>?:EOO EOF EOO EOI @@ -339,7 +448,7 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : no-newline-extra-newline : $c <>:EOO + $* -i 1 <<=:EOF >>?:EOO EOF @@ -349,7 +458,7 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : merge : $c <>EOO 2>&1 + $* -i 1 <<=EOF -e baz >>?EOO 2>&1 foo bar EOF @@ -387,6 +496,14 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : in : $c <<"EOI" && $b + \$* -i 1 <<=/EOF >>>?'foo$ps' + foo/ + EOF + EOI + + : in-alias + : + $c <<"EOI" && $b \$* -i 1 <'foo$ps' foo/ EOF @@ -395,6 +512,14 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : out : $c <<"EOI" && $b + \$* -i 1 <<<='foo$ps' >>?/EOO + foo/ + EOO + EOI + + : out-alias + : + $c <<"EOI" && $b \$* -i 1 <'foo$ps' >>/EOO foo/ EOO @@ -403,6 +528,14 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : err : $c <<"EOI" && $b + \$* -i 2 <<<='foo$ps' 2>>?/EOE + foo/ + EOE + EOI + + : err-alias + : + $c <<"EOI" && $b \$* -i 2 <'foo$ps' 2>>/EOE foo/ EOE @@ -419,7 +552,7 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : match : $c <>~/EOO/i + $* -o foo -o foo -o bar >>?~/EOO/i /FO*/* bar /* @@ -429,7 +562,7 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : match-empty : $c <>:~/EOO/ + $* >>?:~/EOO/ /.{0} EOO EOI @@ -437,7 +570,7 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : shared : $c <>~/EOF/ 2>>~/EOF/ + $* -o foo -e foo >>?~/EOF/ 2>>?~/EOF/ foo EOF EOI @@ -445,7 +578,7 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : mismatch : $c <>/~%EOE%d != 0 - $* -o foo >>~/EOO/ + $* -o foo >>?~/EOO/ bar EOO EOI @@ -459,7 +592,7 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : mismatch-icase : $c <>/~%EOE%d != 0 - $* -o foo >>~/EOO/i + $* -o foo >>?~/EOO/i bar EOO EOI @@ -479,6 +612,13 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : $c <=out; + $* -i 1 <=out >foo + EOI + + : in-alias + : + $c <=out; $* -i 1 <<foo EOI @@ -490,6 +630,17 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. $c <=out; $* -e bar 2>+out; + $* -i 1 <?out + foo + bar + EOF + EOI + + : match-alias + : + $c <=out; + $* -e bar 2>+out; $* -i 1 <>>out foo bar @@ -500,7 +651,7 @@ psr = ($cxx.target.class != 'windows' ? '/' : '\\') # Path separator in regex. : $c <>/~%EOE%d != 0 $* -o foo >=out; - $* -o bar >>>out + $* -o bar >?out EOI %testscript:2: error: ../../../../../driver(.exe)? stdout doesn't match expected% info: stdout: test/1/stdout-2 -- cgit v1.1