Home | History | Annotate | Line # | Download | only in unit-tests
cond-cmp-string.mk revision 1.12
      1 # $NetBSD: cond-cmp-string.mk,v 1.12 2020/11/08 23:00:09 rillig Exp $
      2 #
      3 # Tests for string comparisons in .if conditions.
      4 
      5 # This is a simple comparison of string literals.
      6 # Nothing surprising here.
      7 .if "str" != "str"
      8 .  error
      9 .endif
     10 
     11 # The right-hand side of the comparison may be written without quotes.
     12 .if "str" != str
     13 .  error
     14 .endif
     15 
     16 # The left-hand side of the comparison must be enclosed in quotes.
     17 # This one is not enclosed in quotes and thus generates an error message.
     18 .if str != str
     19 .  error
     20 .endif
     21 
     22 # The left-hand side of the comparison requires a defined variable.
     23 # The variable named "" is not defined, but applying the :U modifier to it
     24 # makes it "kind of defined" (see VAR_KEEP).  Therefore it is ok here.
     25 .if ${:Ustr} != "str"
     26 .  error
     27 .endif
     28 
     29 # Any character in a string literal may be escaped using a backslash.
     30 # This means that "\n" does not mean a newline but a simple "n".
     31 .if "string" != "\s\t\r\i\n\g"
     32 .  error
     33 .endif
     34 
     35 # It is not possible to concatenate two string literals to form a single
     36 # string.
     37 .if "string" != "str""ing"
     38 .  error
     39 .endif
     40 
     41 # There is no = operator for strings.
     42 .if !("value" = "value")
     43 .  error
     44 .else
     45 .  error
     46 .endif
     47 
     48 # There is no === operator for strings either.
     49 .if !("value" === "value")
     50 .  error
     51 .else
     52 .  error
     53 .endif
     54 
     55 # A variable expression can be enclosed in double quotes.
     56 .if ${:Uword} != "${:Uword}"
     57 .  error
     58 .endif
     59 
     60 # Between 2003-01-01 (maybe even earlier) and 2020-10-30, adding one of the
     61 # characters " \t!=><" directly after a variable expression resulted in a
     62 # "Malformed conditional", even though the string was well-formed.
     63 .if ${:Uword } != "${:Uword} "
     64 .  error
     65 .endif
     66 # Some other characters worked though, and some didn't.
     67 # Those that are mentioned in is_separator didn't work.
     68 .if ${:Uword0} != "${:Uword}0"
     69 .  error
     70 .endif
     71 .if ${:Uword&} != "${:Uword}&"
     72 .  error
     73 .endif
     74 .if ${:Uword!} != "${:Uword}!"
     75 .  error
     76 .endif
     77 .if ${:Uword<} != "${:Uword}<"
     78 .  error
     79 .endif
     80 
     81 # Adding another variable expression to the string literal works though.
     82 .if ${:Uword} != "${:Uwo}${:Urd}"
     83 .  error
     84 .endif
     85 
     86 # Adding a space at the beginning of the quoted variable expression works
     87 # though.
     88 .if ${:U word } != " ${:Uword} "
     89 .  error
     90 .endif
     91 
     92 # If at least one side of the comparison is a string literal, the string
     93 # comparison is performed.
     94 .if 12345 != "12345"
     95 .  error
     96 .endif
     97 
     98 # If at least one side of the comparison is a string literal, the string
     99 # comparison is performed.  The ".0" in the left-hand side makes the two
    100 # sides of the equation unequal.
    101 .if 12345.0 == "12345"
    102 .  error
    103 .endif
    104