summaryrefslogtreecommitdiff
path: root/unit-tests/varmod-sysv.mk
diff options
context:
space:
mode:
Diffstat (limited to 'unit-tests/varmod-sysv.mk')
-rw-r--r--unit-tests/varmod-sysv.mk61
1 files changed, 61 insertions, 0 deletions
diff --git a/unit-tests/varmod-sysv.mk b/unit-tests/varmod-sysv.mk
new file mode 100644
index 000000000000..c8410ed900d8
--- /dev/null
+++ b/unit-tests/varmod-sysv.mk
@@ -0,0 +1,61 @@
+# $NetBSD: varmod-sysv.mk,v 1.3 2020/08/23 14:52:06 rillig Exp $
+#
+# Tests for the ${VAR:from=to} variable modifier, which replaces the suffix
+# "from" with "to". It can also use '%' as a wildcard.
+#
+# This modifier is applied when the other modifiers don't match exactly.
+
+all: words ampersand anchor-dollar mismatch
+
+# The :Q looks like a modifier but isn't.
+# It is part of the replacement string.
+words:
+ @echo a${a b c d e:L:%a=x:Q}b
+
+# Before 2020-07-19, an ampersand could be used in the replacement part
+# of a SysV substitution modifier. This was probably a copy-and-paste
+# mistake since the SysV modifier code looked a lot like the code for the
+# :S and :C modifiers. The ampersand is not mentioned in the manual page.
+ampersand:
+ @echo ${:U${a.bcd.e:L:a.%=%}:Q}
+ @echo ${:U${a.bcd.e:L:a.%=&}:Q}
+
+# Before 2020-07-20, when a SysV modifier was parsed, a single dollar
+# before the '=' was interpreted as an anchor, which doesn't make sense
+# since the anchor was discarded immediately.
+anchor-dollar:
+ @echo $@: ${:U${value:L:e$=x}:Q}
+ @echo $@: ${:U${value:L:e=x}:Q}
+
+# Words that don't match are copied unmodified.
+# The % placeholder can be anywhere in the string.
+mismatch:
+ @echo $@: ${:Ufile.c file.h:%.c=%.cpp}
+ @echo $@: ${:Ufile.c other.c:file.%=renamed.%}
+
+# Trying to cover all possible variants of the SysV modifier.
+LIST= one two
+EXPR.1= ${LIST:o=X}
+EXP.1= one twX
+EXPR.2= ${LIST:o=}
+EXP.2= one tw
+EXPR.3= ${LIST:o=%}
+EXP.3= one tw%
+EXPR.4= ${LIST:%o=X}
+EXP.4= one X
+EXPR.5= ${LIST:o%=X}
+EXP.5= X two
+EXPR.6= ${LIST:o%e=X}
+EXP.6= X two
+EXPR.7= ${LIST:o%%e=X} # Only the first '%' is the wildcard.
+EXP.7= one two # None of the words contains a literal '%'.
+EXPR.8= ${LIST:%=%%}
+EXP.8= one% two%
+EXPR.9= ${LIST:%nes=%xxx} # lhs is longer than the word "one"
+EXP.9= one two
+
+.for i in ${:U:range=9}
+.if ${EXPR.$i} != ${EXP.$i}
+.warning test case $i expected "${EXP.$i}", got "${EXPR.$i}
+.endif
+.endfor