Home | History | Annotate | Line # | Download | only in unit-tests
varmod-range.mk revision 1.11.2.1
      1  1.11.2.1  perseant # $NetBSD: varmod-range.mk,v 1.11.2.1 2025/08/02 05:58:39 perseant 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.11.2.1  perseant # expect+1: Variable "" is undefined
     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.11.2.1  perseant # expect+1: Invalid number "x}Rest" != "Rest"" for modifier ":range"
     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.11.2.1  perseant # 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.11.2.1  perseant # 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.11.2.1  perseant # 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.11.2.1  perseant # 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