aboutsummaryrefslogtreecommitdiff
path: root/contrib/bmake/unit-tests/cond-token-string.mk
blob: edc9936b7d534dda584aefbaae02b9d7dc738300 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# $NetBSD: cond-token-string.mk,v 1.10 2024/04/20 10:18:55 rillig Exp $
#
# Tests for quoted string literals in .if conditions.
#
# See also:
#	cond-token-plain.mk
#		Covers string literals without quotes (called "bare words").

# TODO: Implementation

# Cover the code in CondParser_String that frees the memory after parsing
# an expression based on an undefined variable.
# expect+2: Malformed conditional ("" != "${:Uvalue:Z}")
# expect+1: while evaluating "${:Uvalue:Z}"": Unknown modifier "Z"
.if "" != "${:Uvalue:Z}"
.  error
.else
.  error
.endif

.if x${:Uvalue}
.  error
.else
# expect+1: xvalue is not defined.
.  info xvalue is not defined.
.endif

# The 'x' produces a "Malformed conditional" since the left-hand side of a
# comparison in an .if directive must be either an expression, a
# quoted string literal or a number that starts with a digit.
# expect+1: Malformed conditional (x${:Uvalue} == "")
.if x${:Uvalue} == ""
.  error
.else
.  error
.endif

# In plain words, a '\' can be used to escape any character, just as in
# double-quoted string literals.  See CondParser_String.
.if \x${:Uvalue} == "xvalue"
# expect+1: Expected.
.  info Expected.
.else
.  error
.endif

.MAKEFLAGS: -dc

# A string in quotes is checked whether it is not empty.
.if "UNDEF"
# expect+1: The string literal "UNDEF" is not empty.
.  info The string literal "UNDEF" is not empty.
.else
.  error
.endif

# A space is not empty as well.
# This differs from many other places where whitespace is trimmed.
.if " "
# expect+1: The string literal " " is not empty, even though it consists of whitespace only.
.  info The string literal " " is not empty, even though it consists of $\
	whitespace only.
.else
.  error
.endif

.if "${UNDEF}"
.  error
.else
# expect+1: An undefined variable in quotes expands to an empty string, which then evaluates to false.
.  info An undefined variable in quotes expands to an empty string, which $\
	then evaluates to false.
.endif

.if "${:Uvalue}"
# expect+1: A nonempty expression evaluates to true.
.  info A nonempty expression evaluates to true.
.else
.  error
.endif

.if "${:U}"
.  error
.else
# expect+1: An empty variable evaluates to false.
.  info An empty variable evaluates to false.
.endif

# A non-empty string evaluates to true, no matter if it's a literal string or
# if it contains expressions.  The parentheses are not necessary for
# the parser, in this case their only purpose is to make the code harder to
# read for humans.
VAR=	value
.if ("${VAR}")
.else
.  error
.endif

# In the conditions in .if directives, the left-hand side of a comparison must
# be enclosed in quotes.  The right-hand side does not need to be enclosed in
# quotes.
.if "quoted" == quoted
.else
.  error
.endif

.MAKEFLAGS: -d0

all: .PHONY