Home | History | Annotate | Line # | Download | only in unit-tests
cond-func.mk revision 1.14.2.1
      1  1.14.2.1  perseant # $NetBSD: cond-func.mk,v 1.14.2.1 2025/08/02 05:58:31 perseant Exp $
      2       1.1    rillig #
      3       1.1    rillig # Tests for those parts of the functions in .if conditions that are common
      4       1.1    rillig # among several functions.
      5       1.1    rillig #
      6      1.12    rillig # The below test uses the 'defined' function since it has no side-effects.
      7      1.12    rillig # The other functions would work equally well, except for 'empty', which
      8      1.12    rillig # parses its argument differently from the other functions.
      9      1.12    rillig #
     10       1.1    rillig 
     11       1.1    rillig DEF=			defined
     12       1.1    rillig ${:UA B}=		variable name with spaces
     13       1.1    rillig ${:UVAR(value)}=	variable name with parentheses
     14       1.6    rillig ${:UVAR{value}}=	variable name with balanced braces
     15       1.6    rillig 
     16       1.6    rillig # Really strange variable names must be given indirectly via another variable,
     17       1.6    rillig # so that no unbalanced braces appear in the top-level expression.
     18       1.6    rillig VARNAME_UNBALANCED_BRACES=	VAR{{{value
     19       1.6    rillig ${VARNAME_UNBALANCED_BRACES}=	variable name with unbalanced braces
     20       1.1    rillig 
     21       1.1    rillig .if !defined(DEF)
     22       1.4    rillig .  error
     23       1.1    rillig .endif
     24       1.1    rillig 
     25       1.3    rillig # Horizontal whitespace (space tab) after the opening parenthesis is ignored.
     26       1.1    rillig .if !defined( 	DEF)
     27       1.4    rillig .  error
     28       1.1    rillig .endif
     29       1.1    rillig 
     30       1.3    rillig # Horizontal whitespace (space tab) before the closing parenthesis is ignored.
     31       1.1    rillig .if !defined(DEF 	)
     32       1.4    rillig .  error
     33       1.1    rillig .endif
     34       1.1    rillig 
     35       1.1    rillig # The argument of a function must not directly contain whitespace.
     36  1.14.2.1  perseant # expect+1: Missing ")" after argument "A" for "defined"
     37       1.1    rillig .if !defined(A B)
     38       1.4    rillig .  error
     39       1.1    rillig .endif
     40       1.1    rillig 
     41      1.14    rillig # If necessary, the whitespace can be generated by an expression.
     42       1.1    rillig .if !defined(${:UA B})
     43       1.4    rillig .  error
     44       1.1    rillig .endif
     45       1.1    rillig 
     46       1.1    rillig # Characters that could be mistaken for operators must not appear directly
     47       1.1    rillig # in a function argument.  As with whitespace, these can be generated
     48       1.1    rillig # indirectly.
     49       1.1    rillig #
     50       1.1    rillig # It's not entirely clear why these characters are forbidden.
     51       1.1    rillig # The most plausible reason seems to be typo detection.
     52  1.14.2.1  perseant # expect+1: Missing ")" after argument "A" for "defined"
     53       1.1    rillig .if !defined(A&B)
     54       1.4    rillig .  error
     55       1.1    rillig .endif
     56  1.14.2.1  perseant # expect+1: Missing ")" after argument "A" for "defined"
     57       1.1    rillig .if !defined(A|B)
     58       1.4    rillig .  error
     59       1.1    rillig .endif
     60       1.1    rillig 
     61       1.1    rillig # Even parentheses may appear in variable names.
     62       1.1    rillig # They must be balanced though.
     63       1.1    rillig .if !defined(VAR(value))
     64       1.4    rillig .  error
     65       1.1    rillig .endif
     66       1.1    rillig 
     67       1.1    rillig # Braces do not have any special meaning when parsing arguments.
     68       1.1    rillig .if !defined(VAR{value})
     69       1.4    rillig .  error
     70       1.1    rillig .endif
     71       1.1    rillig 
     72       1.6    rillig # Braces do not have any special meaning when parsing arguments.
     73       1.6    rillig # They don't need to be balanced.
     74       1.6    rillig .if !defined(VAR{{{value)
     75       1.6    rillig .  error
     76       1.6    rillig .endif
     77       1.6    rillig 
     78       1.2    rillig # There may be spaces around the operators and parentheses, and even
     79       1.2    rillig # inside the parentheses.  The spaces inside the parentheses are not
     80      1.12    rillig # allowed for the 'empty' function (see cond-func-empty.mk), therefore
     81       1.2    rillig # they are typically omitted for the other functions as well.
     82       1.2    rillig .if ! defined ( DEF )
     83       1.2    rillig .  error
     84       1.2    rillig .endif
     85       1.2    rillig 
     86  1.14.2.1  perseant # Before cond.c 1.366 from 2024-07-06, the following condition was
     87  1.14.2.1  perseant # interpreted as defined(A) && defined(B). Each kind of .if directive has a
     88       1.5    rillig # default function that is called when a bare word is parsed.  For the plain
     89  1.14.2.1  perseant # .if directive, this function is 'defined'; see "struct If ifs" in cond.c.
     90  1.14.2.1  perseant # expect+1: Unknown operator "&"
     91       1.5    rillig .if A&B
     92       1.5    rillig .  error
     93       1.5    rillig .endif
     94       1.5    rillig 
     95  1.14.2.1  perseant # The empty variable is never defined.
     96       1.7    rillig .if defined()
     97       1.7    rillig .  error
     98       1.7    rillig .endif
     99       1.7    rillig 
    100      1.11    rillig # The plain word 'defined' is interpreted as 'defined(defined)', see
    101      1.11    rillig # CondParser_ComparisonOrLeaf.
    102       1.7    rillig # That variable is not defined (yet).
    103       1.7    rillig .if defined
    104       1.7    rillig .  error
    105       1.7    rillig .else
    106      1.13    rillig # expect+1: A plain function name is parsed as defined(...).
    107      1.11    rillig .  info A plain function name is parsed as defined(...).
    108       1.7    rillig .endif
    109       1.7    rillig 
    110      1.10    rillig # If a variable named 'defined' is actually defined, the bare word 'defined'
    111      1.10    rillig # is interpreted as 'defined(defined)', and the condition evaluates to true.
    112      1.10    rillig defined=	# defined but empty
    113       1.7    rillig .if defined
    114      1.13    rillig # expect+1: A plain function name is parsed as defined(...).
    115      1.11    rillig .  info A plain function name is parsed as defined(...).
    116       1.7    rillig .else
    117       1.7    rillig .  error
    118       1.7    rillig .endif
    119       1.7    rillig 
    120       1.7    rillig # A plain symbol name may start with one of the function names, in this case
    121       1.7    rillig # 'defined'.
    122       1.7    rillig .if defined-var
    123       1.7    rillig .  error
    124       1.7    rillig .else
    125      1.13    rillig # expect+1: Symbols may start with a function name.
    126       1.7    rillig .  info Symbols may start with a function name.
    127       1.7    rillig .endif
    128       1.7    rillig 
    129      1.10    rillig defined-var=	# defined but empty
    130       1.7    rillig .if defined-var
    131      1.13    rillig # expect+1: Symbols may start with a function name.
    132       1.7    rillig .  info Symbols may start with a function name.
    133       1.7    rillig .else
    134       1.7    rillig .  error
    135       1.7    rillig .endif
    136       1.7    rillig 
    137  1.14.2.1  perseant # expect+1: Missing ")" after argument "" for "defined"
    138       1.8    rillig .if defined(
    139       1.8    rillig .  error
    140       1.8    rillig .else
    141       1.8    rillig .  error
    142       1.8    rillig .endif
    143  1.14.2.1  perseant 
    144  1.14.2.1  perseant # expect+1: Missing ")" after argument "${:UVARNAME}.param" for "defined"
    145  1.14.2.1  perseant .if defined(${:UVARNAME}.param extra)
    146  1.14.2.1  perseant .  error
    147  1.14.2.1  perseant .else
    148  1.14.2.1  perseant .  error
    149  1.14.2.1  perseant .endif
    150