# be present in the basic Exim binary which we require in order to run these
# tests at all. Specialized expansion tests also exist for optional features
# in other test scripts.
+munge dnssec
exim -be
reduce: ${reduce {<, 1,2,3}{0}{${eval:$value+$item}}}
reduce: ${reduce {3:0:9:4:6}{0}{${if >{$item}{$value}{$item}{$value}}}}
+listnamed: ${listnamed:dlist}
+listnamed: ${listnamed:+dlist}
+listnamed: ${listnamed:hlist}
+listnamed: ${listnamed:elist}
+listnamed: ${listnamed:flist}
+listnamed: ${listnamed:nolist}
+listnamed: ${listnamed_d:dlist}
+listnamed: ${listnamed_d:hlist}
+listnamed: ${listnamed_z:dlist}
+
+listcount: ${listcount:a:b:c}
+listcount: ${listcount:}
+listcount: ${listcount:<;a;b;c}
+listcount: ${listcount:${listnamed:dlist}}
+
+listextract: ${listextract{ 2}{a:b:c:d}}
+listextract: ${listextract{-2}{<,a,b,c,d}{X${value}X}}
+listextract: ${listextract{ 5}{a:b:c:d}}
+listextract: ${listextract{-5}{a:b:c:d}}
+listextract: ${listextract{ 5}{a:b:c:d}{}{fail}}
+listextract: ${listextract{ 5}{a:b:c:d}{}fail}
+
+sort: ${sort{3:2:1:4}{<}{$item}}
+sort: ${sort {<, 3,2,1,4}{>}{$item}}
+sort: ${sort{c:B:a:aa}{lti}{$item}}
+sort: ${sort{666 r99.ex.com:10 smtp.ex.com:100 r2.ex.com}{<}{${sg {$item}{([0-9]*).*\$}{\$1}}}}
+sort: ${sort{666,r99.ex.com:10,smtp.ex.com:100,r2.ex.com}{<}{${listextract{1}{<,$item}}}}
+sort: "${sort{}{<}{$item}}"
+
# Tests with iscntrl() and illegal separators
map: ${map{<\n a\n\nb\nc}{'$item'}}
# Operators
+acl: ${acl
+acl: ${acl}
+acl: ${acl {a_nosuch}}
+acl: ${acl {a_ret}}
+acl: ${acl {a_ret}{person@dom.ain}}
+acl: ${acl {a_ret}{firstarg}{secondarg}}
+acl: ${acl {a_ret}{arg with spaces}}
+acl: ${acl {a_none}}
+acl: ${acl {a_none}{person@dom.ain}}
+acl: ${acl {a_deny}}
+acl: ${acl {a_deny}{person@dom.ain}}
+acl: ${acl {a_defer}}
+acl: ${acl {a_sub}{top_arg_1}{top_arg_2}{top_arg_3}}
+acl: ${reduce {1:2:3:4} {} {$value ${acl {a_ret}{$item}}}}
+
addrss: ${address:local-part@dom.ain}
addrss: ${address:Exim Person <local-part@dom.ain> (that's me)}
domain: ${domain:local-part@dom.ain}
quote_local_part: ${quote_local_part:ab\cd"ef}
quote_local_part: ${quote_local_part:}
rxquote:${rxquote:aZ09_,-Q} ${rxquote:ab*cd} ${rxquote:ab\cd"ef}
+hexquote: ${hexquote:\
+ \001\002\003\004\005\006\007 \010\011\012\013\014\015\016\017 \
+\020\021\022\023\024\025\026\027 \030\031\032\033\034\035\036\037 \
+\040\041\042\043\044\045\046\047 \050\051\052\053\054\055\056\057 \
+\060\061\062\063\064\065\066\067 \070\071\072\073\074\075\076\077 \
+\100\101\102\103\104\105\106\107 \110\111\112\113\114\115\116\117 \
+\120\121\122\123\124\125\126\127 \130\131\132\133\134\135\136\137 \
+\140\141\142\143\144\145\146\147 \150\151\152\153\154\155\156\157 \
+\160\161\162\163\164\165\166\167 \170\171\172\173\174\175\176\177}
substr: ${substr_3_2:rhubarb} ${s_-5_2:1234567} ${s_-5_2:12} ${s_-3_2:12}
substr: ${s_3:rhubarb} ${s_-2:rhubarb}
substr: ${s_1:}
md5: ${if eq {1}{2}{${md5:invalid}}{NO}}
mask: ${if eq {1}{2}{${mask:invalid}}{NO}}
+# Number suffixes in conditions
+1k: ${if >{1}{1k}{n}{y}}
+1K: ${if >{1}{1K}{n}{y}}
+1M: ${if >{1}{1M}{n}{y}}
+1G: ${if >{1}{1G}{n}{y}}
+
# Numeric overflow
+# >32b should work, >64b not
-4096M ${if >{1}{4096M}{y}{n}}
-4096000000 ${if >{1}{4096000000}{y}{n}}
+1 > 2047M ${if >{1}{2047M}{y}{n}}
+1 > 2048M ${if >{1}{2048M}{y}{n}}
+1 > 4096000000 ${if >{1}{4096000000}{y}{n}}
+1 > 4096M ${if >{1}{4096M}{y}{n}}
+1 > 4611686018427387904 ${if >{1}{4611686018427387904} {y}{n}}
+1 > 46116860184273879040 ${if >{1}{46116860184273879040}{y}{n}}
# Conditions
5>3m: ${if >{5 } {3m }{y}{n}}
5>3z: ${if >{5 } {3z }{y}{n}}
5>a: ${if >{ 5 } {a}{y}{n}}
+5>bad: ${if >{5 } {${lookup{trick}lsearch{DIR/aux-fixed/0002.lsearch}}} {y}{n}}
>0: ${if > {}{0}{y}{n}}
=: ${if = {}{}{y}{n}}
match_ip: 12 ${if match_ip{1.2.3.4}{lsearch;DIR/aux-fixed/0002.matchip}}
match_ip: 13 ${if match_ip{1.2.3.4}{net-lsearch;DIR/aux-fixed/0002.matchip}}
match_ip: 14 ${if match_ip{5.6.7.8}{net24-lsearch;DIR/aux-fixed/0002.matchip}}
+match_ip: 15 ${if match_ip{abcd::dcba}{net-iplsearch;DIR/aux-fixed/0002.matchip}}
queue_running: ${if queue_running{y}{n}}
first_delivery: ${if first_delivery{y}{n}}
queue_running after or: ${if or{{eq {0}{0}}{queue_running}}{y}{n}}
first_delivery after or: ${if or{{eq {0}{0}}{first_delivery}}{y}{n}}
+# acl expansion condition
+acl if: ${if acl {{a_ret}} {Y:$value}{N:$value}}
+acl if: ${if acl {{a_ret}{argY}} {Y:$value}{N:$value}}
+acl if: ${if acl {{a_deny}{argN}{arg2}} {Y:$value}{N:$value}}
+acl if: ${if acl {{a_defer}{argN}{arg2}} {Y:$value}{N:$value}}
+
# Default values for both if strings
\${if eq{1}{1}} >${if eq{1}{1}}<
abcdea a ${tr{abcdea}{a}{}}
abcdea abc z ${tr{abcdea}{abc}{z}}
+# Boolean
+"TrUe" ${if bool{TrUe}{true}{false}} EXPECT: true
+"FALSE" ${if bool{FALSE}{true}{false}} EXPECT: false
+" yes" ${if bool{ yes}{true}{false}} EXPECT: true
+" no" ${if bool{ no}{true}{false}} EXPECT: false
+"yes " ${if bool{yes }{true}{false}} EXPECT: true
+"-1" ${if bool{-1}{true}{false}} EXPECT: true
+"0" ${if bool{0}{true}{false}} EXPECT: false
+"1" ${if bool{1}{true}{false}} EXPECT: true
+" 0 " ${if bool{ 0 }{true}{false}} EXPECT: false
+" 1 " ${if bool{ 1 }{true}{false}} EXPECT: true
+"1111111111111111111" ${if bool{1111111111111111111}{true}{false}} EXPECT: true
+"9" ${if bool{9}{true}{false}} EXPECT: true
+" " ${if bool{ }{true}{false}} EXPECT: false
+"text" ${if bool{text}{true}{false}} EXPECT: error
+" text" ${if bool{ text}{true}{false}} EXPECT: error
+"-text" ${if bool{-text}{true}{false}} EXPECT: error
+"text " ${if bool{text }{true}{false}} EXPECT: error
+" text " ${if bool{ text }{true}{false}} EXPECT: error
+"00" ${if bool{00}{true}{false}} EXPECT: false
+"!true" ${if !bool{true}{true}{false}} EXPECT: false
+"!false" ${if !bool{false}{true}{false}} EXPECT: true
+
+"TrUe" ${if bool_lax{TrUe}{true}{false}} EXPECT: true
+"FALSE" ${if bool_lax{FALSE}{true}{false}} EXPECT: false
+" yes" ${if bool_lax{ yes}{true}{false}} EXPECT: true
+" no" ${if bool_lax{ no}{true}{false}} EXPECT: false
+"yes " ${if bool_lax{yes }{true}{false}} EXPECT: true
+"-1" ${if bool_lax{-1}{true}{false}} EXPECT: true
+"0" ${if bool_lax{0}{true}{false}} EXPECT: false
+"1" ${if bool_lax{1}{true}{false}} EXPECT: true
+" 0 " ${if bool_lax{ 0 }{true}{false}} EXPECT: false
+" 1 " ${if bool_lax{ 1 }{true}{false}} EXPECT: true
+"1111111111111111111" ${if bool_lax{1111111111111111111}{true}{false}} EXPECT: true
+"9" ${if bool_lax{9}{true}{false}} EXPECT: true
+" " ${if bool_lax{ }{true}{false}} EXPECT: false
+"text" ${if bool_lax{text}{true}{false}} EXPECT: true
+" text" ${if bool_lax{ text}{true}{false}} EXPECT: true
+"text " ${if bool_lax{text }{true}{false}} EXPECT: true
+" text " ${if bool_lax{ text }{true}{false}} EXPECT: true
+"00" ${if bool_lax{00}{true}{false}} EXPECT: true
+"!true" ${if !bool_lax{true}{true}{false}} EXPECT: false
+"!false" ${if !bool_lax{false}{true}{false}} EXPECT: true
+
# RFC 2047
abcd ${rfc2047:abcd}
match_ip: 15 ${if match_ip{1.2.3.4}{1.2.3}}
match_ip: 16 ${if match_ip{1.2.3.4}{1.2.3.4/abc}}
****
+# Operation of inlist and negated inlist
+exim -be
+${if inlist{aa}{aa} {in list}{not in list}}
+${if !inlist{aa}{aa} {not in list}{in list}}
+****