diff options
Diffstat (limited to 'unit-tests')
-rw-r--r-- | unit-tests/function/call.test | 30 | ||||
-rw-r--r-- | unit-tests/test/script/parser/buildfile | 2 | ||||
-rw-r--r-- | unit-tests/test/script/parser/here-document.test | 6 | ||||
-rw-r--r-- | unit-tests/test/script/parser/regex.test | 188 | ||||
-rw-r--r-- | unit-tests/test/script/parser/scope.test | 22 | ||||
-rw-r--r-- | unit-tests/test/script/regex/driver.cxx | 21 |
6 files changed, 242 insertions, 27 deletions
diff --git a/unit-tests/function/call.test b/unit-tests/function/call.test index 9129785..5584c15 100644 --- a/unit-tests/function/call.test +++ b/unit-tests/function/call.test @@ -63,11 +63,16 @@ EOE : ambig : -$* <'$ambig(abc)' 2>- != 0 # @@ REGEX -#buildfile:1:2: error: ambiguous call to ambig(<untyped>) -# info: candidate: ambig(<untyped> [, uint64]), qualified name dummy.ambig -# info: candidate: ambig(<untyped> [, string]), qualified name dummy.ambig -#EOE +$* <'$ambig(abc)' 2>>~/EOE/ != 0 +buildfile:1:2: error: ambiguous call to ambig(<untyped>) +/(( + info: candidate: ambig(<untyped> [, uint64]), qualified name dummy.ambig + info: candidate: ambig(<untyped> [, string]), qualified name dummy.ambig +/)|( + info: candidate: ambig(<untyped> [, string]), qualified name dummy.ambig + info: candidate: ambig(<untyped> [, uint64]), qualified name dummy.ambig +/)) +EOE : optional-absent : @@ -115,11 +120,16 @@ EOE : print-fovl : -$* <'$ambig([bool] true)' 2>- != 0 # @@ REGEX -#buildfile:1:2: error: unmatched call to ambig(bool) -# info: candidate: ambig(<untyped> [, uint64]), qualified name dummy.ambig -# info: candidate: ambig(<untyped> [, string]), qualified name dummy.ambig -#EOE +$* <'$ambig([bool] true)' 2>>~/EOE/ != 0 +buildfile:1:2: error: unmatched call to ambig(bool) +/(( + info: candidate: ambig(<untyped> [, uint64]), qualified name dummy.ambig + info: candidate: ambig(<untyped> [, string]), qualified name dummy.ambig +/)|( + info: candidate: ambig(<untyped> [, string]), qualified name dummy.ambig + info: candidate: ambig(<untyped> [, uint64]), qualified name dummy.ambig +/)) +EOE : print-fovl-variadic : diff --git a/unit-tests/test/script/parser/buildfile b/unit-tests/test/script/parser/buildfile index 41fe34d..34b6d9e 100644 --- a/unit-tests/test/script/parser/buildfile +++ b/unit-tests/test/script/parser/buildfile @@ -17,6 +17,6 @@ scheduler exe{driver}: cxx{driver} ../../../../build2/cxx{$src} $libs \ test{cleanup command-if command-re-parse description directive exit \ expansion here-document here-string include pipe-expr pre-parse \ - redirect scope scope-if setup-teardown} + redirect regex scope scope-if setup-teardown} include ../../../../build2/ diff --git a/unit-tests/test/script/parser/here-document.test b/unit-tests/test/script/parser/here-document.test index 7cb9474..4afcf68 100644 --- a/unit-tests/test/script/parser/here-document.test +++ b/unit-tests/test/script/parser/here-document.test @@ -13,6 +13,12 @@ testscript:1:8: error: expected here-document end marker EOE + : missing-empty + : + $* <'cmd <<""' 2>>EOE != 0 + testscript:1:7: error: expected here-document end marker + EOE + : unseparated-expansion : $* <'cmd <<FOO$foo' 2>>EOE != 0 diff --git a/unit-tests/test/script/parser/regex.test b/unit-tests/test/script/parser/regex.test new file mode 100644 index 0000000..d28a1a4 --- /dev/null +++ b/unit-tests/test/script/parser/regex.test @@ -0,0 +1,188 @@ +# file : unit-tests/test/script/parser/regex.test +# copyright : Copyright (c) 2014-2016 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +: here-string +: +{ + : stdout + : + { + : missing + : + $* <'cmd >~' 2>>EOE != 0 + testscript:1:7: error: missing stdout here-string regex + EOE + + : no-introducer + : + $* <'cmd >~""' 2>>EOE != 0 + testscript:1:7: error: no introducer character in stdout regex redirect + EOE + + : no-term-introducer + : + $* <'cmd >~/' 2>>EOE != 0 + testscript:1:7: error: no closing introducer character in stdout regex redirect + EOE + + : empty + : + $* <'cmd >~//' 2>>EOE != 0 + testscript:1:7: error: stdout regex redirect is empty + EOE + + : invalid-flags1 + : + $* <'cmd >~/foo/z' 2>>EOE != 0 + testscript:1:7: error: junk at the end of stdout regex redirect + EOE + + : invalid-flags2 + : + $* <'cmd >~/foo/iz' 2>>EOE != 0 + testscript:1:7: error: junk at the end of stdout regex redirect + EOE + + : malformed + : + $* <'cmd >~/*foo/' 2>>~/EOE/ != 0 + /testscript:1:7: error: invalid stdout regex redirect.*/ + info: regex: /*foo/ + EOE + + : without-flags + : + $* <'cmd >~/fo*/' >'cmd >~/fo*/' + + : with-flags + : + $* <'cmd >~/fo*/i' >'cmd >~/fo*/i' + + : no-newline + : + $* <'cmd >:~/fo*/' >'cmd >:~/fo*/' + } + + : stderr + : + { + : missing + : + $* <'cmd 2>~' 2>>EOE != 0 + testscript:1:8: error: missing stderr here-string regex + EOE + + : no-introducer + : + : Note that there is no need to reproduce all the errors as for stdout. + : All we need is to make sure that the proper description is passed to + : the parse_regex() function. + : + $* <'cmd 2>~""' 2>>EOE != 0 + testscript:1:8: error: no introducer character in stderr regex redirect + EOE + } +} + +: here-doc +: +{ + : stdout + : + { + : missing + : + $* <'cmd >>~' 2>>EOE != 0 + testscript:1:8: error: expected here-document regex end marker + EOE + + : unterminated-line-char + : + $* <<EOI 2>>EOE != 0 + cmd >>~/EOO/ + / + EOO + EOI + testscript:2:1: error: regex introducer without regex + info: consider changing regex introducer '/' in here-document end marker + EOE + + : invalid-syntax-char + : + $* <<EOI 2>>EOE != 0 + cmd >>~/EOO/ + /x + EOO + EOI + testscript:2:1: error: invalid line-regex syntax character 'x' + EOE + + : invalid-char-regex + : + $* <<EOI 2>>~/EOE/ != 0 + cmd >>~/EOO/ + /?foo/ + EOO + EOI + /testscript:2:1: error: invalid regex.*/ + EOE + + : invalid-line-regex + : + $* <<EOI 2>>~/EOE/ != 0 + cmd >>~/EOO/ + /* + EOO + EOI + /testscript:3:1: error: invalid here-document regex.*/ + EOE + + : empty + : + $* <<EOI 2>>EOE != 0 + cmd >>:~/EOO/ + EOO + EOI + testscript:2:1: error: empty here-document regex + EOE + + : valid + : + $* <<EOI >>EOO + cmd 2>>~/EOE/ + foo + /? + /foo/ + /foo/* + /foo/i + /foo/i* + + // + //* + EOE + EOI + cmd 2>>~/EOE/ + foo + /? + /foo/ + /foo/* + /foo/i + /foo/i* + + // + //* + EOE + EOO + } + + : stderr + : + { + : missing + : + $* <'cmd 2>>~' 2>>EOE != 0 + testscript:1:9: error: expected here-document regex end marker + EOE + } +} diff --git a/unit-tests/test/script/parser/scope.test b/unit-tests/test/script/parser/scope.test index 24b4a42..7d78aca 100644 --- a/unit-tests/test/script/parser/scope.test +++ b/unit-tests/test/script/parser/scope.test @@ -1,23 +1,13 @@ -# @@ REGEX Note that the script can still fail on POSIX for space-containing -# paths. -# -if ($cxx.target.class == "windows") - q = "'" -end - $* testscript <'cmd $@' >"cmd 1" # id-testscript $* foo.test <'cmd $@' >"cmd foo/1" # id -wd = [dir_path] $~; -wd += test-driver; -wd += 1; -$* testscript <'cmd "$~"' >"cmd $q$wd$q" # wd-testscript +: wd-testscript +: +$* testscript <'cmd "$~"' >~"%cmd '?.+[/\\\\]test-driver[/\\\\]1'?%" -wd = [dir_path] $~; -wd += test-driver; -wd += foo; -wd += 1; -$* foo.test <'cmd "$~"' >"cmd $q$wd$q" # wd +: wd +: +$* foo.test <'cmd "$~"' >~"%cmd '?.+[/\\\\]test-driver[/\\\\]foo[/\\\\]1'?%" $* -s <<EOI # group-empty { diff --git a/unit-tests/test/script/regex/driver.cxx b/unit-tests/test/script/regex/driver.cxx index ca09048..5b3d648 100644 --- a/unit-tests/test/script/regex/driver.cxx +++ b/unit-tests/test/script/regex/driver.cxx @@ -129,6 +129,27 @@ main () assert (v1 == vc ({'1', '2', '2'})); } + // Test line_string. + // + // @@ Add more tests. + // + // Note that the following code crashes if compiled with libc++ (LLVM bug + // #31454). + // + // @@ Probably we can overcome it by providing our own allocator for + // basic_string instantiation. The function allocate() could allocate some + // more elements that would be enough not to corrupt the memory (which + // push_back() does). + // @@ But maybe doesn't worth to bother as the bug seems to get assigned. + // @@ Heavily affects MacOS where clang++/libc++ is the default setup. + // + { + line_string s; + s.push_back (line_char ('0')); + s.push_back (line_char ('1')); + s.push_back (line_char ('2')); + } + // Test line_char_locale and ctype<line_char> (only non-trivial functions). // { |