Home | History | Annotate | Line # | Download | only in unit-tests
      1 # $NetBSD: varmod-no-match.mk,v 1.3 2023/02/26 06:08:06 rillig Exp $
      2 #
      3 # Tests for the expression modifier ':N', which filters words that do not
      4 # match the given pattern.
      5 
      6 
      7 # Keep all words except for 'two'.
      8 .if ${:U one two three :Ntwo} != "one three"
      9 .  error
     10 .endif
     11 
     12 # Keep all words except those starting with 't'.
     13 # See varmod-match.mk for the details of pattern matching.
     14 .if ${:U one two three four six :Nt*} != "one four six"
     15 .  error
     16 .endif
     17 
     18 
     19 # Idiom: normalize whitespace
     20 #
     21 # The modifier ':N' can be used with an empty pattern.  As that pattern never
     22 # matches a word, the only effect is that the string is split into words and
     23 # then joined again, thereby normalizing whitespace around and between the
     24 # words.  And even though the 'N' in ':N' might serve as a mnemonic for
     25 # "normalize whitespace", this idiom is not used in practice, resorting to the
     26 # much more common ':M*' to "select all words" instead.
     27 .if ${:U :N} != ""
     28 .  error
     29 .endif
     30 .if ${:U one    two three :N} != "one two three"
     31 .  error
     32 .endif
     33 .if ${:U one    two three :M*} != "one two three"
     34 .  error
     35 .endif
     36 
     37 
     38 # Idiom: single-word expression equals any of several words or patterns
     39 #
     40 # If an expression is guaranteed to consist of a single word, the modifier
     41 # ':N' can be chained to compare the expression to several words or even
     42 # patterns in a sequence.  If one of the patterns matches, the final
     43 # expression will be the empty string.
     44 #
     45 .if ${:U word :None:Ntwo:Nthree} != ""
     46 #  good
     47 .else
     48 .  error
     49 .endif
     50 .if ${:U two :None:Ntwo:Nthree} != ""
     51 .  error
     52 .else
     53 #  good
     54 .endif
     55 #
     56 # The modifier ':N' is seldom used in general since positive matches with ':M'
     57 # are easier to grasp.  Chaining the ':N' modifier is even more difficult to
     58 # grasp due to the many negations involved.
     59 #
     60 # The final '!= ""' adds to the confusion because at first glance, the
     61 # condition may look like '${VAR} != ""', which for a single-word variable is
     62 # always true.
     63 #
     64 # The '!= ""' can be omitted if the expression cannot have the numeric value
     65 # 0, which is common in practice.  In that form, each ':N' can be pronounced
     66 # as 'neither' or 'nor', which makes the expression sound more natural.
     67 #
     68 .if ${:U word :None:Ntwo:Nthree}
     69 #  good
     70 .else
     71 .  error
     72 .endif
     73 .if ${:U two :None:Ntwo:Nthree}
     74 .  error
     75 .else
     76 #  good
     77 .endif
     78 #
     79 # Replacing the '${...} != ""' with '!empty(...)' doesn't improve the
     80 # situation as the '!' adds another level of negations, and the word 'empty'
     81 # is a negation on its own, thereby creating a triple negation.  Furthermore,
     82 # due to the '!empty', the expression to be evaluated no longer starts with
     83 # '$' and is thus more difficult to spot quickly.
     84 #
     85 .if !empty(:U word :None:Ntwo:Nthree)
     86 #  good
     87 .else
     88 .  error
     89 .endif
     90 .if !empty(:U two :None:Ntwo:Nthree)
     91 .  error
     92 .else
     93 #  good
     94 .endif
     95 
     96 
     97 all:
     98