aboutsummaryrefslogtreecommitdiff
path: root/unit-tests
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2016-12-17 23:28:30 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2017-01-05 15:30:41 +0300
commit3ecbf5d51b13e11a93ae5757408a27c21d804c9f (patch)
treebe46e3caa24574de106c2fbf1a05c43d32694e12 /unit-tests
parenta63e1809afd9a837821d6e8376cb14a36e7fc26e (diff)
Add support for regex in runner
Diffstat (limited to 'unit-tests')
-rw-r--r--unit-tests/function/call.test30
-rw-r--r--unit-tests/test/script/parser/buildfile2
-rw-r--r--unit-tests/test/script/parser/here-document.test6
-rw-r--r--unit-tests/test/script/parser/regex.test188
-rw-r--r--unit-tests/test/script/parser/scope.test22
-rw-r--r--unit-tests/test/script/regex/driver.cxx21
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).
//
{