Home | History | Annotate | Line # | Download | only in unit-tests
varmod-range.mk revision 1.17
      1  1.17  rillig # $NetBSD: varmod-range.mk,v 1.17 2025/03/29 19:08:52 rillig Exp $
      2   1.1  rillig #
      3   1.2  rillig # Tests for the :range variable modifier, which generates sequences
      4   1.2  rillig # of integers from the given range.
      5   1.6  rillig #
      6   1.6  rillig # See also:
      7   1.6  rillig #	modword.mk
      8   1.1  rillig 
      9   1.4  rillig # The :range modifier generates a sequence of integers, one number per
     10   1.9  rillig # word of the expression's value.
     11   1.4  rillig .if ${a b c:L:range} != "1 2 3"
     12   1.4  rillig .  error
     13   1.4  rillig .endif
     14   1.4  rillig 
     15   1.4  rillig # To preserve spaces in a word, they can be enclosed in quotes, just like
     16   1.4  rillig # everywhere else.
     17   1.4  rillig .if ${:U first "the second word" third 4 :range} != "1 2 3 4"
     18   1.4  rillig .  error
     19   1.4  rillig .endif
     20   1.4  rillig 
     21   1.4  rillig # The :range modifier takes the number of words from the value of the
     22   1.9  rillig # expression.  If that expression is undefined, the range is
     23   1.4  rillig # undefined as well.  This should not come as a surprise.
     24   1.4  rillig .if "${:range}" != ""
     25   1.4  rillig .  error
     26   1.4  rillig .endif
     27   1.4  rillig 
     28  1.10  rillig # An empty expression results in a sequence of a single number, even though
     29  1.10  rillig # the expression contains 0 words.
     30  1.10  rillig .if ${:U:range} != "1"
     31  1.10  rillig .  error
     32  1.10  rillig .endif
     33  1.10  rillig 
     34   1.4  rillig # The :range modifier can be given a parameter, which makes the generated
     35   1.9  rillig # range independent from the value or the name of the expression.
     36   1.4  rillig .if "${:range=5}" != ""
     37   1.4  rillig .  error
     38   1.4  rillig .endif
     39  1.10  rillig # XXX: As of 2023-12-17, the ':range=n' modifier does not turn the undefined
     40  1.10  rillig # expression into a defined one, even though it does not depend on the value
     41  1.10  rillig # of the expression.  This looks like an oversight.
     42  1.14  rillig # expect+1: Malformed conditional '${:range=5} != ""'
     43  1.10  rillig .if ${:range=5} != ""
     44  1.10  rillig .  error
     45  1.10  rillig .else
     46  1.10  rillig .  error
     47  1.10  rillig .endif
     48   1.4  rillig 
     49   1.5  rillig # Negative ranges don't make sense.
     50   1.5  rillig # As of 2020-11-01, they are accepted though, using up all available memory.
     51   1.5  rillig #.if "${:range=-1}"
     52   1.5  rillig #.  error
     53   1.5  rillig #.else
     54   1.5  rillig #.  error
     55   1.5  rillig #.endif
     56   1.5  rillig 
     57   1.5  rillig # The :range modifier requires a number as parameter.
     58   1.7  rillig #
     59   1.7  rillig # Until 2020-11-01, the parser tried to read the 'x' as a number, failed and
     60   1.7  rillig # stopped there.  It then tried to parse the next modifier at that point,
     61   1.7  rillig # which failed with the message "Unknown modifier".
     62   1.7  rillig #
     63   1.7  rillig # Since 2020-11-01, the parser issues a more precise "Invalid number" error
     64   1.7  rillig # instead.
     65  1.16  rillig # expect+1: Invalid number "x}Rest" != "Rest"" for ':range' modifier
     66   1.5  rillig .if "${:U:range=x}Rest" != "Rest"
     67   1.5  rillig .  error
     68   1.5  rillig .else
     69   1.5  rillig .  error
     70   1.5  rillig .endif
     71   1.5  rillig 
     72   1.5  rillig # The upper limit of the range must always be given in decimal.
     73   1.5  rillig # This parse error stops at the 'x', trying to parse it as a variable
     74   1.5  rillig # modifier.
     75  1.17  rillig # expect+1: Unknown modifier ":x0"
     76   1.5  rillig .if "${:U:range=0x0}Rest" != "Rest"
     77   1.5  rillig .  error
     78   1.5  rillig .else
     79   1.5  rillig .  error
     80   1.5  rillig .endif
     81   1.5  rillig 
     82   1.5  rillig # As of 2020-11-01, numeric overflow is not detected.
     83   1.5  rillig # Since strtoul returns ULONG_MAX in such a case, it is interpreted as a
     84   1.5  rillig # very large number, consuming all available memory.
     85   1.5  rillig #.if "${:U:range=18446744073709551619}Rest" != "Rest"
     86   1.5  rillig #.  error
     87   1.5  rillig #.else
     88   1.5  rillig #.  error
     89   1.5  rillig #.endif
     90   1.5  rillig 
     91   1.5  rillig # modifier name too short
     92  1.17  rillig # expect+1: Unknown modifier ":rang"
     93   1.5  rillig .if "${a b c:L:rang}Rest" != "Rest"
     94   1.5  rillig .  error
     95   1.5  rillig .else
     96   1.5  rillig .  error
     97   1.5  rillig .endif
     98   1.5  rillig 
     99   1.5  rillig # misspelled modifier name
    100  1.17  rillig # expect+1: Unknown modifier ":rango"
    101   1.5  rillig .if "${a b c:L:rango}Rest" != "Rest"
    102   1.5  rillig .  error
    103   1.5  rillig .else
    104   1.5  rillig .  error
    105   1.5  rillig .endif
    106   1.5  rillig 
    107   1.5  rillig # modifier name too long
    108  1.17  rillig # expect+1: Unknown modifier ":ranger"
    109   1.5  rillig .if "${a b c:L:ranger}Rest" != "Rest"
    110   1.5  rillig .  error
    111   1.5  rillig .else
    112   1.5  rillig .  error
    113   1.5  rillig .endif
    114   1.5  rillig 
    115   1.1  rillig all:
    116