Home | History | Annotate | Line # | Download | only in unit-tests
cond-token-string.mk revision 1.13
      1  1.13  rillig # $NetBSD: cond-token-string.mk,v 1.13 2024/08/29 20:20:36 rillig Exp $
      2   1.1  rillig #
      3   1.4  rillig # Tests for quoted string literals in .if conditions.
      4   1.4  rillig #
      5   1.4  rillig # See also:
      6   1.4  rillig #	cond-token-plain.mk
      7   1.4  rillig #		Covers string literals without quotes (called "bare words").
      8   1.1  rillig 
      9   1.1  rillig # TODO: Implementation
     10   1.1  rillig 
     11   1.3  rillig # Cover the code in CondParser_String that frees the memory after parsing
     12   1.7  rillig # an expression based on an undefined variable.
     13  1.12  rillig # expect+2: Malformed conditional '"" != "${:Uvalue:Z}"'
     14  1.13  rillig # expect+1: Unknown modifier "Z"
     15   1.3  rillig .if "" != "${:Uvalue:Z}"
     16   1.3  rillig .  error
     17   1.3  rillig .else
     18   1.3  rillig .  error
     19   1.3  rillig .endif
     20   1.3  rillig 
     21   1.3  rillig .if x${:Uvalue}
     22   1.3  rillig .  error
     23   1.3  rillig .else
     24   1.8  rillig # expect+1: xvalue is not defined.
     25   1.3  rillig .  info xvalue is not defined.
     26   1.3  rillig .endif
     27   1.3  rillig 
     28   1.3  rillig # The 'x' produces a "Malformed conditional" since the left-hand side of a
     29   1.9  rillig # comparison in an .if directive must be either an expression, a
     30   1.3  rillig # quoted string literal or a number that starts with a digit.
     31  1.12  rillig # expect+1: Malformed conditional 'x${:Uvalue} == ""'
     32   1.3  rillig .if x${:Uvalue} == ""
     33   1.3  rillig .  error
     34   1.3  rillig .else
     35   1.3  rillig .  error
     36   1.3  rillig .endif
     37   1.3  rillig 
     38   1.3  rillig # In plain words, a '\' can be used to escape any character, just as in
     39   1.3  rillig # double-quoted string literals.  See CondParser_String.
     40   1.3  rillig .if \x${:Uvalue} == "xvalue"
     41   1.8  rillig # expect+1: Expected.
     42   1.3  rillig .  info Expected.
     43   1.3  rillig .else
     44   1.3  rillig .  error
     45   1.3  rillig .endif
     46   1.3  rillig 
     47   1.4  rillig .MAKEFLAGS: -dc
     48   1.4  rillig 
     49   1.4  rillig # A string in quotes is checked whether it is not empty.
     50   1.4  rillig .if "UNDEF"
     51   1.8  rillig # expect+1: The string literal "UNDEF" is not empty.
     52   1.4  rillig .  info The string literal "UNDEF" is not empty.
     53   1.4  rillig .else
     54   1.4  rillig .  error
     55   1.4  rillig .endif
     56   1.4  rillig 
     57   1.4  rillig # A space is not empty as well.
     58   1.4  rillig # This differs from many other places where whitespace is trimmed.
     59   1.4  rillig .if " "
     60   1.8  rillig # expect+1: The string literal " " is not empty, even though it consists of whitespace only.
     61   1.4  rillig .  info The string literal " " is not empty, even though it consists of $\
     62   1.4  rillig 	whitespace only.
     63   1.4  rillig .else
     64   1.4  rillig .  error
     65   1.4  rillig .endif
     66   1.4  rillig 
     67   1.4  rillig .if "${UNDEF}"
     68   1.4  rillig .  error
     69   1.4  rillig .else
     70   1.8  rillig # expect+1: An undefined variable in quotes expands to an empty string, which then evaluates to false.
     71   1.4  rillig .  info An undefined variable in quotes expands to an empty string, which $\
     72   1.4  rillig 	then evaluates to false.
     73   1.4  rillig .endif
     74   1.4  rillig 
     75   1.4  rillig .if "${:Uvalue}"
     76   1.9  rillig # expect+1: A nonempty expression evaluates to true.
     77   1.9  rillig .  info A nonempty expression evaluates to true.
     78   1.4  rillig .else
     79   1.4  rillig .  error
     80   1.4  rillig .endif
     81   1.4  rillig 
     82   1.4  rillig .if "${:U}"
     83   1.4  rillig .  error
     84   1.4  rillig .else
     85   1.8  rillig # expect+1: An empty variable evaluates to false.
     86   1.4  rillig .  info An empty variable evaluates to false.
     87   1.4  rillig .endif
     88   1.4  rillig 
     89   1.5  rillig # A non-empty string evaluates to true, no matter if it's a literal string or
     90   1.9  rillig # if it contains expressions.  The parentheses are not necessary for
     91   1.6  rillig # the parser, in this case their only purpose is to make the code harder to
     92   1.6  rillig # read for humans.
     93   1.5  rillig VAR=	value
     94   1.6  rillig .if ("${VAR}")
     95   1.5  rillig .else
     96   1.5  rillig .  error
     97   1.5  rillig .endif
     98   1.5  rillig 
     99   1.5  rillig # In the conditions in .if directives, the left-hand side of a comparison must
    100   1.5  rillig # be enclosed in quotes.  The right-hand side does not need to be enclosed in
    101   1.5  rillig # quotes.
    102   1.5  rillig .if "quoted" == quoted
    103   1.5  rillig .else
    104   1.5  rillig .  error
    105   1.5  rillig .endif
    106   1.5  rillig 
    107   1.4  rillig .MAKEFLAGS: -d0
    108   1.4  rillig 
    109   1.5  rillig all: .PHONY
    110