> +
> +
>
+> # List operations
+>
+> filter: "a:b:c"
+> filter: a:c
+> filter: a'c
+> filter: ''a' ''c
+> filter: ""
+>
+> map: ""
+> map: a:b:c
+> map: ::a::: ::b::: ::c::
+> map: fail string
+> map: []:[b]:[c]
+>
+> reduce: "+"
+> reduce: +abc
+> reduce: 6
+> reduce: 9
+>
+> # Tests with iscntrl() and illegal separators
+>
+> map: 'a'
+''
+'b'
+'c'
+>
+> Failed: error in expression evaluation: expecting number or opening parenthesis (after processing "0+") inside "reduce" item
+> reduce: 6
+> reduce: 6
+> reduce: 6
+>
> # Operators
>
> addrss: local-part@dom.ain
> addrss: local-part@dom.ain
> domain: dom.ain
> domain: dom.ain
+>
+> addresses: ''abc@xyz' ''pqr@xyz
+> addresses: local-part@dom.ain
+> addresses: local-part@dom.ain+xyz@abc
+> addresses: local-part@dom.ain:xyz@abc:p@q:r@s
+> addresses:
+>
> escape: B7\267F2\362
> eval: 2
> eval: 7
> eval: 1
> eval: 1
> Failed: error in expression evaluation: expecting closing parenthesis (after processing "-2 - (-3")
-> Failed: error in expression evaluation: expecting + or - (after processing "-2 - -3")
+> Failed: error in expression evaluation: expecting operator (after processing "-2 - -3")
> eval: 1
> eval: -5
-> Failed: error in expression evaluation: expecting number or opening parenthesis (after processing "-2 -")
+> eval: 1
> eval: 40962
> eval: 63
-> Failed: error in expression evaluation: expecting + or - (after processing "0")
+> Failed: error in expression evaluation: expecting operator (after processing "0")
> eval10: 77
> eval10: 8
+> Failed: error in expression evaluation: expecting operator (after processing "0")
+> eval: 4
+> eval: 4
+> eval: 4
+> eval: 13
+> eval: 9
+> eval: 6
+> eval: 3
+> eval: 0
+> eval: 24
+> eval: 4608
+> eval: 4608
+> eval: -4608
+>
> expand: $primary_hostname myhost.test.ex
> hash: jmg monty fbWx
> hash: abcX abX aX X
> strlen: 0
> strlen: 1
> strlen: 8
+> time_eval: 10
+> time_eval: 7200
+> time_eval: 86700
+> time_eval: 788645
+> Failed: string "14" is not an Exim time interval in "time_eval" operator
+> Failed: string "rhubarb" is not an Exim time interval in "time_eval" operator
> time_interval: 0s
> time_interval: 44s
> time_interval: 1w4d13h46m39s
> md5: NO
> mask: NO
>
+> # Numeric overflow
+>
+> Failed: absolute value of integer "4096M" is too large (overflow)
+> Failed: absolute value of integer "4096000000" is too large (overflow)
+>
> # Conditions
>
> 2=2: y
> 2>3: n
> 3>3: n
> 4>3: y
+> 1>-1: y
> 2>=3: n
> 3>=3: y
> 4>=3: y
> 3<=3: y
> 4<=3: n
> 5<=3: n
+> -3<=1: y
>
> 5>3k: n
> 5>3m: n
-> Failed: "3z " is not a number
-> Failed: "a" is not a number
+> Failed: invalid integer "3z "
+> Failed: integer expected but "a" found
+>
+> >0: n
+> =: y
+> -2<: y
+> 08>07: y
+> 011=11: y
>
> def:y y
> def:n n
> match_ip: 12 true
> match_ip: 13 true
> match_ip: 14 true
+> match_ip: 15 true
>
> queue_running: n
> first_delivery: n
> a\:b: ^a\\.+b
> a\:Xb: ^a\\.+b
>
+> # Some tests of case-(in)dependence
+>
+> MiXeD-CD: Data found for case-dependent MiXeD-CD
+> MixeD-CD: NOT FOUND
+> MiXeD-Ncd: Data found for case-independent MiXeD-nCD
+> MixeD-Ncd: Data found for case-independent MiXeD-nCD
+>
> # IP address (CIDR) lookups
>
> 1.2.3.4: data for 1.2.3.4
> abcdea a abcdea
> abcdea abc z zzzdez
>
+> # Boolean
+> "TrUe" true EXPECT: true
+> "FALSE" false EXPECT: false
+> " yes" true EXPECT: true
+> " no" false EXPECT: false
+> "yes " true EXPECT: true
+> Failed: unrecognised boolean value "-1"
+> "0" false EXPECT: false
+> "1" true EXPECT: true
+> " 0 " false EXPECT: false
+> " 1 " true EXPECT: true
+> "1111111111111111111" true EXPECT: true
+> "9" true EXPECT: true
+> " " false EXPECT: false
+> Failed: unrecognised boolean value "text"
+> Failed: unrecognised boolean value "text"
+> Failed: unrecognised boolean value "text"
+> Failed: unrecognised boolean value "text"
+> "00" false EXPECT: false
+> "!true" false EXPECT: false
+> "!false" true EXPECT: true
+>
+> "TrUe" true EXPECT: true
+> "FALSE" false EXPECT: false
+> " yes" true EXPECT: true
+> " no" false EXPECT: false
+> "yes " true EXPECT: true
+> "-1" true EXPECT: true
+> "0" false EXPECT: false
+> "1" true EXPECT: true
+> " 0 " false EXPECT: false
+> " 1 " true EXPECT: true
+> "1111111111111111111" true EXPECT: true
+> "9" true EXPECT: true
+> " " false EXPECT: false
+> "text" true EXPECT: true
+> " text" true EXPECT: true
+> "text " true EXPECT: true
+> " text " true EXPECT: true
+> "00" true EXPECT: true
+> "!true" false EXPECT: false
+> "!false" true EXPECT: true
+>
> # RFC 2047
>
> abcd abcd
> <:abcd:> =?iso-8859-8?Q?=3C=3Aabcd=3A=3E?=
> <:ab cd:> =?iso-8859-8?Q?=3C=3Aab_cd=3A=3E?=
-> Long: =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_i?= =?iso-8859-8?Q?t_will_go_over_the_75-char_limit?=
-> Long: =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_i?= =?iso-8859-8?Q?t_will_go_over_the_75-char_limit_by_a_long_way=3B_in_fac?= =?iso-8859-8?Q?t_this_one_will_go_over_the_150_character_limit?=
+> Long: =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_?= =?iso-8859-8?Q?it_will_go_over_the_75-char_limit?=
+> Long: =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_?= =?iso-8859-8?Q?it_will_go_over_the_75-char_limit_by_a_long_way=3B_in?= =?iso-8859-8?Q?_fact_this_one_will_go_over_the_150_character_limit?=
>
+> # RFC 2047 decode
+>
+> abcd abcd
+> <:abcd:> <:abcd:>
+> <:ab cd:> <:ab cd:>
+> Long: here we go: a string that is going to be encoded: it will go over the 75-char limit
+> Long: here we go: a string that is going to be encoded: it will go over the 75-char limit by a long way; in fact this one will go over the 150 character limit
>
> # UTF-8
>
>
> # PRVS
>
-> prvs=userx/xxxxxxxxxx@test.ex
-> prvs=userx/xxxxxxxxxx@test.ex
-> prvs=userx/xxxxxxxxxx@test.ex
+> prvs=xxxxxxxxxx=userx@test.ex
+> prvs=xxxxxxxxxx=userx@test.ex
+> prvs=xxxxxxxxxx=userx@test.ex
>
> # Syntax errors
>
> Failed: unknown condition "xya" inside "and{...}" condition
> Failed: condition name expected, but found "${lookup{x}lsear" inside "and{...}" condition
> Failed: missing } at end of string - could be header name not terminated by colon
+> Failed: missing or misplaced { or }
+> Failed: missing or misplaced { or } - could be header name not terminated by colon
> Failed: each subcondition inside an "or{...}" condition must be in its own {}
> Failed: missing } at end of condition inside "or" group
> Failed: unknown condition "yes" inside "or{...}" condition
> Failed: non-digit after underscore in "substr_1_"
> Failed: non-digit after underscore in "substr__3"
>
+> # Iterations: forany and forall
+>
+> yes
+> yes
+> yes
+> no
+> yes
+> no
+> no
+> yes
+> yes
+>
+> Failed: unknown condition "yes" inside "forany" condition
+> Failed: missing } at end of condition inside "forany"
+>
+> yes
+> no
+> no
+> no
+>
+> no
+> yes
+> yes
+> yes
+>
+> # Expect yes
+> outer=yes item='' (unset)
+>
+> # Expect no
+> outer=no
+>
+> # Error inside nest - check message is helpful
+> Failed: missing } at end of condition inside "forall" inside "forany" condition
+>
+>
> # Miscellaneous (for bug fixes, etc)
>
> true