aboutsummaryrefslogtreecommitdiff
path: root/tests/name/pattern.testscript
diff options
context:
space:
mode:
Diffstat (limited to 'tests/name/pattern.testscript')
-rw-r--r--tests/name/pattern.testscript332
1 files changed, 332 insertions, 0 deletions
diff --git a/tests/name/pattern.testscript b/tests/name/pattern.testscript
new file mode 100644
index 0000000..d40e3a4
--- /dev/null
+++ b/tests/name/pattern.testscript
@@ -0,0 +1,332 @@
+# file : tests/name/pattern.testscript
+# copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+.include ../common.testscript
+
++cat <<EOI >=build/root.build
+define txt: file
+txt{*}: extension = txt
+EOI
+
+$* <'print pp%*.txt' >'pp%*.txt' : project-simple
+$* <'print pp%{*.txt -x*}' >'pp%*.txt pp%-x*' : project-group
+
+$* <"print '*.txt'" >'*.txt' : quoted-single
+$* <'print "*.txt"' >'*.txt' : quoted-double
+$* <<EOI >'*.txt' : quoted-expansion
+pat = '*'
+print "$(pat).txt"
+EOI
+
+: detect
+:
+: Test pattern_mode parsing logic.
+{
+ : second-pattern
+ :
+ touch foo.txt;
+ $* <'print {foo *.txt}' >'foo foo.txt'
+
+ : independent-patterns
+ :
+ touch foo.txt -bar;
+ $* <'print {*.txt foo* -b*}' >'foo.txt foo.txt -bar'
+
+ : second-inclusion
+ :
+ touch foo.txt bar.txt;
+ $* <'print {f*.txt +b*.txt}' >'foo.txt bar.txt'
+}
+
+: diagnostics
+:
+{
+ : simple
+ :
+ $* <'print {*.txt +foo file{bar}}' 2>>EOE != 0
+ <stdin>:1:19: error: name pattern inclusion or exclusion expected
+ EOE
+
+ : inclusion-exclusion-sign
+ :
+ $* <'print {*.txt -foo bar}' 2>>EOE != 0
+ <stdin>:1:19: error: name pattern inclusion or exclusion expected
+ EOE
+
+ : inclusion-quoted
+ :
+ $* <'print {*.txt -foo "+bar"}' 2>>EOE != 0
+ <stdin>:1:19: error: name pattern inclusion or exclusion expected
+ EOE
+
+ : empty-inclusion-exclusion
+ :
+ $* <'print {*.txt -}' 2>>EOE != 0
+ <stdin>:1:8: error: empty name pattern
+ EOE
+
+ : inconsistent-result
+ :
+ $* <'print {*.txt +foo/}' 2>>EOE != 0
+ <stdin>:1:8: error: inconsistent file/directory result in name pattern
+ EOE
+}
+
+: basics
+:
+{
+ touch foo.txt;
+ $* <'print *.txt' >'foo.txt' : simple-file
+
+ mkdir foo;
+ $* <'print */' >/'foo/' : simple-dir
+
+ touch foo.txt;
+ $* <'print {*.txt}' >'foo.txt' : group
+
+ touch foo.txt;
+ $* <'print {+*.txt}' >'foo.txt' : plus-prefixed
+
+ mkdir dir && touch dir/foo.txt;
+ $* <'print dir/{*.txt}' >'dir/foo.txt' : dir
+
+ touch foo.txt;
+ $* <'print file{*.txt}' >'file{foo.txt}' : type
+
+ touch foo.txt;
+ $* <'print x@{*.txt}' >'x@foo.txt' : pair
+
+ touch bar.txt;
+ $* <'print x@dir/file{f*.txt}' >'' : empty
+
+ mkdir dir && touch dir/foo.txt;
+ $* <'print **.txt' >/'dir/foo.txt' : recursive
+
+ mkdir dir && touch dir/foo.txt;
+ $* <'print d*/*.txt' >/'dir/foo.txt' : multi-pattern
+
+ touch foo.txt bar.txt;
+ $* <'print {*.txt -bar.txt}' >'foo.txt' : exclude-non-pattern
+
+ mkdir baz;
+ touch foo.txt bar.txt baz/fox.txt baz/box.txt;
+ $* <'print {**.txt -b*.txt -b*/*}' >'foo.txt' : exclude-pattern
+
+ touch foo.txt bar.txt baz.txt;
+ $* <'print {*.txt -{*z.txt bar.txt}}' >'foo.txt' : exclude-group
+
+ touch bar.txt;
+ $* <'print {f*.txt +bar.txt}' >'bar.txt' : include-non-wildcard
+
+ touch bar.txt;
+ $* <'print {f*.txt +b*.txt}' >'bar.txt' : include-pattern
+
+ mkdir bar;
+ $* <'print {f*/ +{b*/}}' >/'bar/' : include-group
+
+ touch foo.txt fox.txt;
+ $* <'print {*.txt -f*.txt +*x.txt}' >'fox.txt' : include-exclude-order
+
+ touch foo.txt;
+ $* <'print {+foo.txt} {+bar.txt}' >'foo.txt' : non-wildcard
+}
+
+: target-type
+:
+: Test target type-specific pattern amendment logic.
+{
+ : append-extension
+ :
+ touch foo.txt bar.txt;
+ $* <'print txt{* -bar}' >'txt{foo}'
+
+ : existing-extension
+ :
+ touch foo.txt bar.txt;
+ $* <'print txt{*.txt -bar.txt}' >'txt{foo.txt}'
+
+ : append-slash
+ :
+ mkdir foo bar;
+ $* <'print dir{* -bar}' >/'dir{foo/}'
+
+ : existing-slash
+ :
+ mkdir foo bar;
+ $* <'print dir{*/ -bar/}' >/'dir{foo/}'
+}
+
+: dot
+:
+: Test filtering of hidden files/directories.
+{
+ touch foo.txt .foo.txt;
+ $* <'print *.txt' >'foo.txt' : file-excl
+
+ touch foo.txt .foo.txt;
+ $* <'print .*.txt' >'.foo.txt' : file-incl
+
+ mkdir dir .dir;
+ $* <'print */' >/'dir/' : dir-excl
+
+ mkdir dir .dir;
+ $* <'print .*/' >/'.dir/' : dir-incl
+
+ mkdir dir .dir && touch dir/foo.txt .dir/foo.txt;
+ $* <'print */*.txt' >/'dir/foo.txt';
+ $* <'print **.txt' >/'dir/foo.txt' : dir-interm-excl
+
+ mkdir dir .dir && touch dir/foo.txt .dir/foo.txt;
+ $* <'print .*/*.txt' >/'.dir/foo.txt' : dir-interm-incl
+}
+
+: expansion
+:
+: Test interaction with expansion/concatenation/re-parse.
+{
+ # Do we want to recognize patterns in non-concatenating expansion?
+ #
+ # pat = '*.txt'
+ # print $pat
+ #
+ # While this case is probably better rewritten as (i.e., move pattern search
+ # to variable assignment):
+ #
+ # pat = *.txt
+ # print $pat
+ #
+ # One may also want to do something like this:
+ #
+ # pat = '*.txt'
+ # print dir1/{$pat}
+ # print dir2/{$pat}
+ #
+ # Instead, he should write it as follows:
+ #
+ # pat = '*.txt'
+ # print dir1/{+$pat}
+ # print dir2/{+$pat}
+ #
+ # Note that if we make it work, escaping this case will be pretty hairy:
+ #
+ # filters = --include '*.txt' --exclude '*.obj'
+ # options += $filters
+
+ : prefixed-pattern-via-expansion
+ :
+ : Pattern is prefixed with the literal unquoted plus character, that is
+ : stripped.
+ :
+ touch foo.txt;
+ $* <<EOI >foo.txt
+ pat = '*.txt'
+ print {+$pat}
+ EOI
+
+ : non-prefixed-pattern-via-concat-expansion
+ :
+ : Plus character is a part of the pattern and so is not stripped.
+ :
+ touch +foo.txt;
+ $* <<EOI >'+foo.txt'
+ pat = '+*'
+ ext = 'txt'
+ print {$pat.$ext}
+ EOI
+
+ : not-pattern-expansion
+ :
+ $* <<EOI >'+*.txt'
+ pat = '+*.txt'
+ print {$pat}
+ EOI
+
+ : not-pattern-quoted
+ :
+ $* <<EOI >'+*.txt'
+ print {'+*.txt'}
+ EOI
+
+ : pattern-via-expansion-list
+ :
+ touch foo.txt bar.hxx;
+ $* <<EOI >'bar.hxx foo.txt'
+ pats = '*.hxx' '*.txt'
+ print {+{$pats}}
+ EOI
+
+ : pattern-via-expansion-type
+ :
+ touch foo.txt;
+ $* <<EOI >'txt{foo}'
+ pat = '*'
+ print txt{+$pat}
+ EOI
+
+ : pattern-via-expansion-dir
+ :
+ mkdir dir;
+ touch dir/foo.txt;
+ $* <<EOI >dir/foo.txt
+ pat = '*.txt'
+ print dir/{+$pat}
+ EOI
+
+ : pattern-via-expansion-dir-type
+ :
+ mkdir dir;
+ touch dir/foo.txt;
+ $* <<EOI >dir/txt{foo}
+ pat = '*'
+ print dir/txt{+$pat}
+ EOI
+
+ : pattern-via-concat
+ :
+ touch foo.txt;
+ $* <<EOI >'foo.txt'
+ ext = txt
+ print *.$ext
+ EOI
+
+ : pattern-via-concat-expansion
+ :
+ touch foo.txt;
+ $* <<EOI >'foo.txt'
+ pat = 'f*'
+ ext = txt
+ print $pat.$ext
+ EOI
+}
+
+: command-line
+:
+: Test pattern expansion on the command line.
+{
+ : variable
+ :
+ {
+ mkdir dir;
+ $* <'print $d' 'd=*/' >/'dir/' : dir
+
+ mkdir dir;
+ $* <'print $d' 'd=dir{*}' >/'dir{dir/}' : dir-type
+
+ touch foo.txt;
+ $* <'print $f' 'f=*.txt' >'foo.txt' : feil
+ }
+
+ : buildspec
+ :
+ {
+ test.arguments =
+ test.options += --buildfile buildfile
+
+ mkdir dir && cat <'./:' >=dir/buildfile;
+ $* '*/' : dir
+
+ mkdir dir dir1 && cat <'./:' >=dir/buildfile;
+ $* 'update(dir{* -dir1})' : dir-type
+ }
+}