> +
> +
>
+> eval: 0
+> eval: 1
+> eval: -1
+> eval: 1
+> eval: 2
+> eval: 7
+> eval: 9
+> eval: 4
+> eval: 6
+> eval: 42
+> Failed: error in expression evaluation: expecting number or opening parenthesis (after processing "")
+> eval: -2
+> eval: 1
+> eval: 1
+> Failed: error in expression evaluation: expecting closing parenthesis (after processing "-2 - (-3")
+> Failed: error in expression evaluation: expecting operator (after processing "-2 - -3")
+> eval: 1
+> eval: -5
+> eval: 1
+> eval: 40962
+> eval: 63
+> 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
+>
> # List operations
>
> filter: "a:b:c"
> listextract: fail
> Failed: "listextract" failed and "fail" requested
>
+> listquote: abcd
+> listquote: ab::cd
+> listquote: ::a::b::c::d::
+> listquote: ab::::cd
+> listquote: ab:cd
+> listquote: ab;;cd
+> listquote: ab cd
+> listquote: < >
+>
> sort: 1:2:3:4
> sort: 4,3,2,1
> sort: a:aa:B:c
>
> Failed: Not enough arguments for 'acl' (min is 1)
> Failed: Not enough arguments for 'acl' (min is 1)
-> Failed: error from acl "a_nosuch"
+> Failed: ERROR from acl "a_nosuch"
> acl: (0) [] []
> acl: (1) [person@dom.ain] []
> acl: (2) [firstarg] [secondarg]
> acl:
> acl: (0) [] []
> acl: (1) [person@dom.ain] []
-> Failed: error from acl "a_defer"
+> Failed: DEFER from acl "a_defer"
> acl: (2) [new arg1] [top_arg_1]
> acl: (1) [1] [] (1) [2] [] (1) [3] [] (1) [4] []
>
> addrss: local-part@dom.ain
> addrss: local-part@dom.ain
+> addrss: local-part@dom.ain
+> addrss: local-part@dom.ain
+> addrss: local-part@dom.ain
+> addrss: local-part.dot-atom@dom.ain
+> addrss: local-part@dom.ain
+> domain: dom.ain
> domain: dom.ain
> domain: dom.ain
+> domain:
>
> 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:
+> Failed: output separator missing in expanding ${addresses:>}
>
> escape: B7\267F2\362
> excape8bit: undisturbed text tab
newline tab\134backslash ~tilde\177DEL\200\201.
>
-> eval: 2
-> eval: 7
-> eval: 9
-> eval: 4
-> eval: 6
-> eval: 42
-> Failed: error in expression evaluation: expecting number or opening parenthesis (after processing "")
-> eval: -2
-> eval: 1
-> eval: 1
-> Failed: error in expression evaluation: expecting closing parenthesis (after processing "-2 - (-3")
-> Failed: error in expression evaluation: expecting operator (after processing "-2 - -3")
-> eval: 1
-> eval: -5
-> eval: 1
-> eval: 40962
-> eval: 63
-> 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
> base32d: 42 42
> Failed: argument for base32d operator is "ABC", which is not a base 32 number
>
-> The base62 operator is actually a base36 operator in the Darwin and Cygwin
+> the base62 operator is actually a base36 operator in the Darwin and Cygwin
> environments. Write cunning tests that produce the same output in both cases,
> while doing a reasonable check.
>
> ipv6norm: 2a00:eadf::1:0
> ipv6norm: 2a00:eadf:0:1::
> ipv6norm: 2a00::
-> ipv6norm: 2a00:2:3:4:5:6:7:8
+> ipv6norm: 2a00:2:3:4:5:6:7:8trailing_text
> nhash: 19 0/61
> lc/uc: the quick BROWN FOX
> length: The quick abc
> lclpt: local-part
> lclpt: local-part
+> lclpt: local.part
+> lclpt: a.b.c
> quote: aZ09_.-Q "ab*cd" "abcd\"ef"
> quote: "nl(\n)"
> quote: "cr(\r)"
> match_domain: yes
> match_domain: no
>
-> >x@zz.aa.bb< [] >x@zz.aa.bb<
+> >x@zz.aa.bb< [zz] >x@zz.aa.bb<
>
-> >x@xxxabc< [] >x@xxxabc<
+> >x@xxxabc< [abc] >x@xxxabc<
>
> match_address: yes
> match_address: yes
> acl if: Y:(0) [] []
> acl if: Y:(1) [argY] []
> acl if: N:(2) [argN] [arg2]
-> Failed: error from acl "a_defer"
+> Failed: DEFER from acl "a_defer"
>
> # Default values for both if strings
>
> # lookups that are required in all cases.
>
> CALLER
+> postmaster: CALLER
>
> ==X@Y
> ==*
> ==*@Z
> ==*
>
+> x@y ==X@Y
+> * ==*
+> *@z ==*@Z
+> * ==*
+>
> data for a.b.c.d
> failed x.y.z
> data for *.p.q
> Failed: "lookup" failed and "fail" requested
> data for *
>
+> a.b.c.d: data for a.b.c.d
+> failed x.y.z
+> *.p.q: data for *.p.q
+> *.p.q: data for *.p.q
+> *.p.q: data for *.p.q
+> Failed: "lookup" failed and "fail" requested
+> *: data for *
+>
> q1: "abc"
> q2: "xyz":
> q3: "pqr" :
> q6: "white space"
> q7: "b\\s"
>
+> q1f: abc "abc"
+> q2f: xyz: "xyz":
+> q3f: pqr : "pqr" :
+> q4f: a:b "a:b" abc continued data (make sure not key)
+> q5f: "quoted" "\"quoted\""
+> q6f: white space "white space"
+> q7f: b\s "b\\s"
+>
> abc: abc
> a.b.c: *.b.c
> ab.c: *b.c
> xyz: ^X
-> Xyz: ^X
-> Zyz: ^Z
+> .Xyz: ^X
+> .Zyz: ^Z
> a b: "^a +b"
> a b: "^a +b"
> a:b: lookup succeeded
> a.b.c: *.b.c
> ab.c: *b.c
> xyz: ^X
-> Xyz: ^X
-> Zyz: ^Z
+> .Xyz: ^X
+> .Zyz: ^Z
> a b: "^a +b"
> a b: "^a +b"
> a:b: lookup succeeded
>
> # 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
+> .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
>
> 2
> 2
> 2
-> Empty:<>
-> Empty:<>
+> empty:<>
+> empty:<>
> <3>
> <3>
-> Empty:<>
-> Empty:<>
+> empty:<>
+> empty:<>
> no Z
> no 4
> Failed: "extract" failed and "fail" requested
> 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_?= =?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?=
+> long: =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_it_will_go_ov?= =?iso-8859-8?Q?er_the_75-char_limit?=
+> long: =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_it_will_go_ov?= =?iso-8859-8?Q?er_the_75-char_limit_by_a_long_way=3B_in_fact_this_on?= =?iso-8859-8?Q?e_will_go_over_the_150_character_limit?=
>
> # RFC 2047 decode
>
> abcd
1234
-> RC=0
+> rc=0
> 1
-> RC=0
+> rc=0
> abcd
1234
-> RC=0
+> rc=0
> 2
-> RC=1
+> rc=1
> abcd
1234
-> RC=1
+> rc=1
> N
-> RC=127
+> rc=127
> >><<
-> RC=0
+> rc=0
> 1!=2
-> RC=0
+> rc=0
>
> # PRVS
>
>
> # Syntax errors
>
-> Failed: prvs second argument must be a single digit
-> Failed: prvs second argument must be a single digit
-> Failed: prvs second argument must be a single digit
+> Failed: prvs third argument must be a single digit
+> Failed: prvs third argument must be a single digit
+> Failed: prvs third argument must be a single digit
>
> # Correct checks; can't put explicit addresses in the tests, because they
> # will change over time.
> CALLER
> correct
>
+> # JSON
+>
+> "http://www.example.com/image/481989943"
+> 100
+> 943
+> 943
+>
+> "green"
+> green
+> <>
+> expect: <>
+>
+> 59
+> 59
+>
+> {"1":116, "2":943, "3":234}
+> expect: {"1":116, "2":943, "3":234}
+>
+> {"1":116, "2":943, "3":234}
+> expect: {"1":116, "2":943, "3":234}
+>
+> <>
+> expect: <>
+> <>
+> expect: <>
+>
+> yes
+> yes
+>
>
> escape: B7·F2ò
>
> primary_hostname: myhost.test.ex
+> sender_address: sndr@dom
+> match: cdab
+> Failed: "if" failed and "fail" requested
+> yes
+> match_address: no
+>
+> primary_hostname: myhost.test.ex
> match: cdab
> Failed: "if" failed and "fail" requested
> yes
> in list
> in list
>
+> '${listextract {2} {<. my.target.host.name}}' => 'target'
+>