From 6362c4e4eda8340eedc73dfdbf6b92b281ccbadd Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 10 Mar 2017 11:51:24 +0200 Subject: Implement support for wildcard patterns --- tests/buildfile | 2 +- tests/name/buildfile | 5 + tests/name/pattern.test | 237 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 tests/name/buildfile create mode 100644 tests/name/pattern.test (limited to 'tests') diff --git a/tests/buildfile b/tests/buildfile index 4b5f149..1938139 100644 --- a/tests/buildfile +++ b/tests/buildfile @@ -2,6 +2,6 @@ # copyright : Copyright (c) 2014-2017 Code Synthesis Ltd # license : MIT; see accompanying LICENSE file -./: directive/ eval/ expansion/ function/ search/ test/ value/ \ +./: directive/ eval/ expansion/ function/ name/ search/ test/ value/ \ variable/ file{common.test} diff --git a/tests/name/buildfile b/tests/name/buildfile new file mode 100644 index 0000000..8eaf31e --- /dev/null +++ b/tests/name/buildfile @@ -0,0 +1,5 @@ +# file : tests/name/buildfile +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +./: test{pattern} $b diff --git a/tests/name/pattern.test b/tests/name/pattern.test new file mode 100644 index 0000000..e9e1c45 --- /dev/null +++ b/tests/name/pattern.test @@ -0,0 +1,237 @@ +# file : tests/name/pattern.test +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +.include ../common.test + ++cat <=build/root.build +define txt: file +txt{*}: extension = txt +EOI + +$* <'print p%*.txt' >'p%*.txt' : project-simple +$* <'print p%{*.txt -x*}' >'p%*.txt p%-x*' : project-group + +$* <"print '*.txt'" >'*.txt' : quoted-single +$* <'print "*.txt"' >'*.txt' : quoted-double +$* <'*.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' + + : second-inclusion + : + touch foo.txt bar.txt; + $* <'print {f*.txt +b*.txt}' >'foo.txt bar.txt' +} + +: diagnostics +: +{ + : simple + : + $* <'print {*.txt file{foo}}' 2>>EOE != 0 + :1:8: error: invalid 'file{foo}' in name pattern + EOE + + : inclusion-exclusion-sign + : + $* <'print {*.txt foo}' 2>>EOE != 0 + :1:8: error: missing leading +/- in 'foo' name pattern + EOE + + : empty-inclusion-exclusion + : + $* <'print {*.txt -}' 2>>EOE != 0 + :1:8: error: empty name pattern + EOE + + : inconsistent-result + : + $* <'print {*.txt +foo/}' 2>>EOE != 0 + :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 + + 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-match + + touch foo.txt bar.txt; + $* <'print {*.txt -b*.txt}' >'foo.txt' : exclude-pattern + + touch bar.txt; + $* <'print {f*.txt +bar.txt}' >'bar.txt' : include-match + + touch bar.txt; + $* <'print {f*.txt +b*.txt}' >'bar.txt' : include-pattern + + touch foo.txt fox.txt; + $* <'print {*.txt -f*.txt +*x.txt}' >'fox.txt' : include-exclude-order +} + +: 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/}' +} + +: 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} + # + # Note that if we make it work, escaping this case will be pretty hairy: + # + # filters = --include '*.txt' --exclude '*.obj' + # options += $filters + + #: pattern-via-expansion + #: + #$* <'<*.txt>' + #pat = '*.txt' + #print $pat + #EOI + + #: pattern-via-expansion-list + #: + #$* <'<*.hxx+*.txt>' + #pats = '*.hxx' '+*.txt' + #print {$pats} + #EOI + + #: pattern-via-expansion-type + #: + #$* <'<*.txt>' + #pat = '*.txt' + #print txt{$pat} + #EOI + + #: pattern-via-expansion-dir + #: + #$* <'<*.txt>' + #pat = '*.txt' + #print dir/{$pat} + #EOI + + : pattern-via-concat + : + touch foo.txt; + $* <'foo.txt' + ext = txt + print *.$ext + EOI + + : pattern-via-concat-expansion + : + touch foo.txt; + $* <'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 + } +} -- cgit v1.1