require "vnd.stalwart.testsuite"; require "variables"; test_set "message" text: From: stephan@example.org To: test@example.com Subject: Variables test Testing variables... . ; /* * Substitution syntax */ test "Unknown variables" { set "q" "a"; set "qw" "bb"; set "qwe" "ccc"; set "qwer" "dddd"; set "qwert" "ccc"; if anyof ( not string "[${qwerty}]" "[]", not string "[${20}]" "[]" ) { test_fail "unknown variable not substituted with empty string"; } } test "One pass" { set "something" "value"; set "s" "$"; if string "${s}{something}" "value" { test_fail "somehow variable string is scanned multiple times"; } if not string :matches "${s}{something}" "?{something}" { test_fail "unexpected result"; } } test "Syntax errors" { set "s" "$"; set "variable" "nonsense"; if anyof ( not string "$" "${s}", not string "${" "${s}{", not string "${a" "${s}{a", not string "${$}" "${s}{$}", not string "${%%%%}" "${s}{%%%%}", not string "${0.s}" "${s}{0.s}", not string "&%${}!" "&%${s}{}!", not string "${doh!}" "${s}{doh!}" ) { test_fail "variables substitution changed substring not matching variable-ref"; } } test "RFC syntax examples" { # The variable "company" holds the value "ACME". No other variables # are set. set "company" "ACME"; # "${full}" => the empty string if not string :is "${full}" "" { test_fail "unknown variable did not yield empty string"; } # "${company}" => "ACME" if not string :is "${company}" "ACME" { test_fail "assigned variable did not get substituted"; } # "${BAD${Company}" => "${BADACME" if not string :is "${BAD${Company}" "${BADACME" { test_fail "'BADACME' test did not yield expected result"; } #"${President, ${Company} Inc.}" # => "${President, ACME Inc.}" if not string "${President, ${Company} Inc.}" "${President, ACME Inc.}" { test_fail "'Company president' test did not yield expected result"; } } /* * Variable assignments */ test "Basic assignment" { set "test" "Value"; if not string :is "${test}" "Value" { test_fail "variable assignment failed"; } if string :is :comparator "i;octet" "${test}" "value" { test_fail "string test failed"; } } test "Assignment overwritten" { set "test" "Value"; set "test" "More"; if not string :is "${test}" "More" { test_fail "variable assignment failed"; } if string :is "${test}" "Value" { test_fail "value not overwritten"; } if string :is "${test}" "nonsense" { test_fail "string test failed"; } } test "Two assignments" { set "test" "Value"; set "test2" "More"; if not string :is "${test}" "Value" { test_fail "variable assignment failed"; } if string :is "${test}" "More" { test_fail "assignments to different variables overlap"; } if string :is "${test}" "nonsense" { test_fail "string test failed"; } } test "Variables case-insensitive" { set "VeRyElAboRATeVaRIABLeName" "interesting value"; if not string "${veryelaboratevariablename}" "interesting value" { test_fail "variable names are case sensitive (lower case try)"; } if not string "${VERYELABORATEVARIABLENAME}" "interesting value" { test_fail "variable names are case sensitive (upper case try)"; } } test "RFC set command example" { set "honorific" "Mr"; set "first_name" "Wile"; set "last_name" "Coyote"; set "vacation" text: Dear ${HONORIFIC} ${last_name}, I'm out, please leave a message after the meep. . ; if not string :is :comparator "i;octet" "${VAcaTION}" text: Dear Mr Coyote, I'm out, please leave a message after the meep. . { test_fail "failed to set variable correctly: ${VAcaTION}"; } } /* * Variable substitution */ test "Multi-line string substitution" { set "name" "Stephan Bosch"; set "address" "stephan@example.org"; set "subject" "Test message"; set "message" text: # Message with substitutions From: ${name} <${address}> To: Bertus van Asseldonk Subject: ${subject} This is a test message. . ; if not string :is "${message}" text: From: Stephan Bosch To: Bertus van Asseldonk Subject: Test message This is a test message. . { test_fail "variable substitution failed"; } } test "Multiple substitutions" { set "a" "the monkey"; set "b" "a nut"; set "c" "the fish"; set "d" "on fire"; set "e" "eats"; set "f" "is"; if not string :is "${a} ${e} ${b}" "the monkey eats a nut" { test_fail "variable substitution failed (1)"; } if not string :is "${c} ${f} ${d}" "the fish is on fire" { test_fail "variable substitution failed (2)"; } set :upperfirst "sentence" "${a} ${e} ${b}"; if not string :is "${sentence}" "The monkey eats a nut" { test_fail "modified variable substitution failed"; } }