Module Name: src Committed By: rillig Date: Thu Mar 3 20:20:23 UTC 2022
Modified Files: src/usr.bin/make/unit-tests: varmod-match.exp varmod-match.mk Log Message: tests/make: add more comprehensive tests for ':M' and ':N' To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/usr.bin/make/unit-tests/varmod-match.exp cvs rdiff -u -r1.6 -r1.7 src/usr.bin/make/unit-tests/varmod-match.mk Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/unit-tests/varmod-match.exp diff -u src/usr.bin/make/unit-tests/varmod-match.exp:1.4 src/usr.bin/make/unit-tests/varmod-match.exp:1.5 --- src/usr.bin/make/unit-tests/varmod-match.exp:1.4 Thu Mar 3 19:36:35 2022 +++ src/usr.bin/make/unit-tests/varmod-match.exp Thu Mar 3 20:20:23 2022 @@ -9,4 +9,8 @@ CondParser_Eval: ${:Ua \$ sign:M*$$*} != Comparing "$" != "$" CondParser_Eval: ${:Ua \$ sign any-asterisk:M*\$*} != "any-asterisk" Comparing "any-asterisk" != "any-asterisk" -exit status 0 +make: "varmod-match.mk" line 146: Unknown modifier "]" +make: "varmod-match.mk" line 146: Malformed conditional (${ ${:U\:} ${:U\:\:} :L:M[:]} != ":") +make: Fatal errors encountered -- cannot continue +make: stopped in unit-tests +exit status 1 Index: src/usr.bin/make/unit-tests/varmod-match.mk diff -u src/usr.bin/make/unit-tests/varmod-match.mk:1.6 src/usr.bin/make/unit-tests/varmod-match.mk:1.7 --- src/usr.bin/make/unit-tests/varmod-match.mk:1.6 Sun Nov 15 18:33:41 2020 +++ src/usr.bin/make/unit-tests/varmod-match.mk Thu Mar 3 20:20:23 2022 @@ -1,4 +1,4 @@ -# $NetBSD: varmod-match.mk,v 1.6 2020/11/15 18:33:41 rillig Exp $ +# $NetBSD: varmod-match.mk,v 1.7 2022/03/03 20:20:23 rillig Exp $ # # Tests for the :M variable modifier, which filters words that match the # given pattern. @@ -56,5 +56,131 @@ ${:U*}= asterisk # TODO: ${VAR:M${UNBALANCED}} # TODO: ${VAR:M${:U(((\}\}\}}} -all: - @:; +.MAKEFLAGS: -d0 + +# Special characters: +# * matches 0 or more arbitrary characters +# ? matches a single arbitrary character +# \ starts an escape sequence, only outside ranges +# [ starts a set for matching a single character +# ] ends a set for matching a single character +# - in a set, forms a range of characters +# ^ as the first character in a set, negates the set +# ( during parsing of the pattern, starts a nesting level +# ) during parsing of the pattern, ends a nesting level +# { during parsing of the pattern, starts a nesting level +# } during parsing of the pattern, ends a nesting level +# : during parsing of the pattern, finishes the pattern +# $ during parsing of the pattern, starts a nested expression +# # in a line except a shell command, starts a comment +# +# Pattern parts: +# * matches 0 or more arbitrary characters +# ? matches exactly 1 arbitrary character +# \x matches exactly the character 'x' +# [...] matches exactly 1 character from the set +# [^...] matches exactly 1 character outside the set +# [a-z] matches exactly 1 character from the range 'a' to 'z' +# + +# [] matches never +.if ${ ab a[]b a[b a b :L:M[]} != "" +. error +.endif + +# a[]b matches never +.if ${ ab a[]b a[b a b [ ] :L:Ma[]b} != "" +. error +.endif + +# [^] matches exactly 1 arbitrary character +.if ${ ab a[]b a[b a b [ ] :L:M[^]} != "a b [ ]" +. error +.endif + +# a[^]b matches 'a', then exactly 1 arbitrary character, then 'b' +.if ${ ab a[]b a[b a b :L:Ma[^]b} != "a[b" +. error +.endif + +# [Nn0] matches exactly 1 character from the set 'N', 'n', '0' +.if ${ a b N n 0 Nn0 [ ] :L:M[Nn0]} != "N n 0" +. error +.endif + +# [a-c] matches exactly 1 character from the range 'a' to 'c' +.if ${ A B C a b c d [a-c] [a] :L:M[a-c]} != "a b c" +. error +.endif + +# [c-a] matches the same as [a-c] +.if ${ A B C a b c d [a-c] [a] :L:M[c-a]} != "a b c" +. error +.endif + +# [^a-c67] +# matches a single character, except for 'a', 'b', 'c', '8' or +# '9' +.if ${ A B C a b c d 5 6 7 8 [a-c] [a] :L:M[^a-c67]} != "A B C d 5 8" +. error +.endif + +# : terminates the pattern +.if ${ A * :L:M:} != "" +. error +.endif + +# \: matches a colon +.if ${ ${:U\: \:\:} :L:M\:} != ":" +. error +.endif + +# ${:U\:} matches a colon +.if ${ ${:U\:} ${:U\:\:} :L:M${:U\:}} != ":" +. error +.endif + +# [:] matches never since the ':' starts the next modifier +# expect+2: Unknown modifier "]" +# expect+1: Malformed conditional (${ ${:U\:} ${:U\:\:} :L:M[:]} != ":") +.if ${ ${:U\:} ${:U\:\:} :L:M[:]} != ":" +. error +.else +. error +.endif + +# [\] matches exactly a backslash; no escaping takes place in +# character ranges +# Without the 'a' in the below expressions, the backslash would end a word and +# thus influence how the string is split into words. +.if ${ ${:U\\a} ${:U\\\\a} :L:M[\]a} != "\\a" +. error +.endif + +#.MAKEFLAGS: -dcv +# +# Incomplete patterns: +# [ matches TODO +# [x matches TODO +# [^ matches TODO +# [- matches TODO +# [xy matches TODO +# [^x matches TODO +# [\ matches TODO +# +# [x- matches exactly 'x', doesn't match 'x-' +# [^x- matches TODO +# \ matches never + + +# The modifier ':tW' prevents splitting at whitespace. Even leading and +# trailing whitespace is preserved. +.if ${ plain string :L:tW:M*} != " plain string " +. error +.endif + +# Without the modifier ':tW', the string is split into words. All whitespace +# around and between the words is normalized to a single space. +.if ${ plain string :L:M*} != "plain string" +. error +.endif