Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/make/unit-tests tests/make: add test for short-circu...
details: https://anonhg.NetBSD.org/src/rev/b272861c18b1
branches: trunk
changeset: 1019563:b272861c18b1
user: rillig <rillig%NetBSD.org@localhost>
date: Sun Mar 14 11:49:37 2021 +0000
description:
tests/make: add test for short-circuit evaluation of modifiers
diffstat:
distrib/sets/lists/tests/mi | 4 +-
usr.bin/make/unit-tests/Makefile | 3 +-
usr.bin/make/unit-tests/cond-short.mk | 14 +-
usr.bin/make/unit-tests/var-eval-short.exp | 11 ++
usr.bin/make/unit-tests/var-eval-short.mk | 128 +++++++++++++++++++++++++++++
5 files changed, 150 insertions(+), 10 deletions(-)
diffs (223 lines):
diff -r 6f79d2d63e6e -r b272861c18b1 distrib/sets/lists/tests/mi
--- a/distrib/sets/lists/tests/mi Sun Mar 14 11:15:37 2021 +0000
+++ b/distrib/sets/lists/tests/mi Sun Mar 14 11:49:37 2021 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1031 2021/03/12 00:13:06 rillig Exp $
+# $NetBSD: mi,v 1.1032 2021/03/14 11:49:37 rillig Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -5727,6 +5727,8 @@
./usr/tests/usr.bin/make/unit-tests/var-class-local.mk tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/var-class.exp tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/var-class.mk tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-eval-short.exp tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-eval-short.mk tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/var-op-append.exp tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/var-op-append.mk tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/var-op-assign.exp tests-usr.bin-tests compattestfile,atf
diff -r 6f79d2d63e6e -r b272861c18b1 usr.bin/make/unit-tests/Makefile
--- a/usr.bin/make/unit-tests/Makefile Sun Mar 14 11:15:37 2021 +0000
+++ b/usr.bin/make/unit-tests/Makefile Sun Mar 14 11:49:37 2021 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.272 2021/03/14 10:45:51 rillig Exp $
+# $NetBSD: Makefile,v 1.273 2021/03/14 11:49:37 rillig Exp $
#
# Unit tests for make(1)
#
@@ -320,6 +320,7 @@
TESTS+= var-class-global
TESTS+= var-class-local
TESTS+= var-class-local-legacy
+TESTS+= var-eval-short
TESTS+= var-op
TESTS+= var-op-append
TESTS+= var-op-assign
diff -r 6f79d2d63e6e -r b272861c18b1 usr.bin/make/unit-tests/cond-short.mk
--- a/usr.bin/make/unit-tests/cond-short.mk Sun Mar 14 11:15:37 2021 +0000
+++ b/usr.bin/make/unit-tests/cond-short.mk Sun Mar 14 11:49:37 2021 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: cond-short.mk,v 1.15 2020/12/01 19:37:23 rillig Exp $
+# $NetBSD: cond-short.mk,v 1.16 2021/03/14 11:49:37 rillig Exp $
#
# Demonstrates that in conditions, the right-hand side of an && or ||
# is only evaluated if it can actually influence the result.
@@ -13,8 +13,11 @@
# parse them. They were still evaluated though, the only difference to
# relevant variable expressions was that in the irrelevant variable
# expressions, undefined variables were allowed.
+#
+# See also:
+# var-eval-short.mk, for short-circuited variable modifiers
-# The && operator.
+# The && operator:
.if 0 && ${echo "unexpected and" 1>&2 :L:sh}
.endif
@@ -86,7 +89,7 @@
. warning first=${FIRST} last=${LAST} appended=${APPENDED} ran=${RAN}
.endif
-# The || operator.
+# The || operator:
.if 1 || ${echo "unexpected or" 1>&2 :L:sh}
.endif
@@ -208,9 +211,4 @@
. error
.endif
-# TODO: Test each modifier to make sure it is skipped when it is irrelevant
-# for the result. Since this test is already quite long, do that in another
-# test.
-
all:
- @:;:
diff -r 6f79d2d63e6e -r b272861c18b1 usr.bin/make/unit-tests/var-eval-short.exp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.bin/make/unit-tests/var-eval-short.exp Sun Mar 14 11:49:37 2021 +0000
@@ -0,0 +1,11 @@
+unexpected
+make: Bad modifier ":[${FAIL" for variable ""
+make: "var-eval-short.mk" line 43: Malformed conditional (0 && ${:Uword:[${FAIL}]})
+make: "var-eval-short.mk" line 48: Missing argument for ".error"
+make: "var-eval-short.mk" line 63: Invalid time value: ${FAIL}}
+make: "var-eval-short.mk" line 63: Malformed conditional (0 && ${:Uword:gmtime=${FAIL}})
+make: "var-eval-short.mk" line 77: Invalid time value: ${FAIL}}
+make: "var-eval-short.mk" line 77: Malformed conditional (0 && ${:Uword:localtime=${FAIL}})
+make: Fatal errors encountered -- cannot continue
+make: stopped in unit-tests
+exit status 1
diff -r 6f79d2d63e6e -r b272861c18b1 usr.bin/make/unit-tests/var-eval-short.mk
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.bin/make/unit-tests/var-eval-short.mk Sun Mar 14 11:49:37 2021 +0000
@@ -0,0 +1,128 @@
+# $NetBSD: var-eval-short.mk,v 1.1 2021/03/14 11:49:37 rillig Exp $
+#
+# Tests for each variable modifier to ensure that they only do the minimum
+# necessary computations. If the result of the expression is not needed, they
+# should only parse the modifier but not actually evaluate it.
+#
+# See also:
+# var.c, the comment starting with 'The ApplyModifier functions'
+# ApplyModifier, for the order of the modifiers
+# ParseModifierPart, for evaluating nested expressions
+# cond-short.mk
+
+FAIL= ${:!echo unexpected 1>&2!}
+
+# The following tests only ensure that nested expressions are not evaluated.
+# They cannot ensure that any unexpanded text returned from ParseModifierPart
+# is ignored as well. To do that, it is necessary to step through the code of
+# each modifier.
+
+.if 0 && ${FAIL}
+.endif
+
+.if 0 && ${VAR::=${FAIL}}
+.elif defined(VAR)
+. error
+.endif
+
+.if 0 && ${${FAIL}:?then:else}
+.endif
+
+.if 0 && ${1:?${FAIL}:${FAIL}}
+.endif
+
+.if 0 && ${0:?${FAIL}:${FAIL}}
+.endif
+
+.if 0 && ${:Uword:@${FAIL}@expr@}
+.endif
+
+.if 0 && ${:Uword:@var@${FAIL}@}
+.endif
+
+.if 0 && ${:Uword:[${FAIL}]}
+.endif
+
+.if 0 && ${:Uword:_=VAR}
+.elif defined(VAR)
+. error
+.endif
+
+.if 0 && ${:Uword:C,${FAIL}****,,}
+.endif
+
+DEFINED= # defined
+.if 0 && ${DEFINED:D${FAIL}}
+.endif
+
+.if 0 && ${:Uword:E}
+.endif
+
+# As of 2021-03-14, the error 'Invalid time value: ${FAIL}}' is ok since
+# ':gmtime' does not expand its argument.
+.if 0 && ${:Uword:gmtime=${FAIL}}
+.endif
+
+.if 0 && ${:Uword:H}
+.endif
+
+.if 0 && ${:Uword:hash}
+.endif
+
+.if 0 && ${value:L}
+.endif
+
+# As of 2021-03-14, the error 'Invalid time value: ${FAIL}}' is ok since
+# ':localtime' does not expand its argument.
+.if 0 && ${:Uword:localtime=${FAIL}}
+.endif
+
+.if 0 && ${:Uword:M${FAIL}}
+.endif
+
+.if 0 && ${:Uword:N${FAIL}}
+.endif
+
+.if 0 && ${:Uword:O}
+.endif
+
+.if 0 && ${:Uword:Ox}
+.endif
+
+.if 0 && ${:Uword:P}
+.endif
+
+.if 0 && ${:Uword:Q}
+.endif
+
+.if 0 && ${:Uword:q}
+.endif
+
+.if 0 && ${:Uword:R}
+.endif
+
+.if 0 && ${:Uword:range}
+.endif
+
+.if 0 && ${:Uword:S,${FAIL},${FAIL},}
+.endif
+
+.if 0 && ${:Uword:sh}
+.endif
+
+.if 0 && ${:Uword:T}
+.endif
+
+.if 0 && ${:Uword:ts/}
+.endif
+
+.if 0 && ${:U${FAIL}}
+.endif
+
+.if 0 && ${:Uword:u}
+.endif
+
+.if 0 && ${:Uword:word=replacement}
+.endif
+
+all:
Home |
Main Index |
Thread Index |
Old Index