summaryrefslogtreecommitdiffstats
path: root/pigeonhole/tests/control-if.svtest
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--pigeonhole/tests/control-if.svtest292
1 files changed, 292 insertions, 0 deletions
diff --git a/pigeonhole/tests/control-if.svtest b/pigeonhole/tests/control-if.svtest
new file mode 100644
index 0000000..e11de64
--- /dev/null
+++ b/pigeonhole/tests/control-if.svtest
@@ -0,0 +1,292 @@
+require "vnd.dovecot.testsuite";
+
+/*
+ * ## RFC 5228, Section 3.1. Control if (page 21) ##
+ */
+
+test_set "message" text:
+From: stephan@example.org
+To: test@dovecot.example.net
+Cc: friep@example.com
+Subject: Test
+
+Test!
+.
+;
+
+/*
+ * Basic functionality
+ */
+
+/* "The semantics are similar to those of any of the many other
+ * programming languages these control structures appear in. When the
+ * interpreter sees an "if", it evaluates the test associated with it.
+ * If the test is true, it executes the block associated with it.
+ *
+ * If the test of the "if" is false, it evaluates the test of the first
+ * "elsif" (if any). If the test of "elsif" is true, it runs the
+ * elsif's block. An elsif may be followed by an elsif, in which case,
+ * the interpreter repeats this process until it runs out of elsifs.
+ *
+ * When the interpreter runs out of elsifs, there may be an "else" case.
+ * If there is, and none of the if or elsif tests were true, the
+ * interpreter runs the else's block.
+ *
+ * This provides a way of performing exactly one of the blocks in the
+ * chain.
+ * "
+ */
+
+/*
+ * TEST: Basic functionality: if true/false
+ */
+
+test "Basic functionality: if true/false" {
+ /* Static */
+ if true {
+ /* Correct */
+ } else {
+ test_fail "executed wrong alternative for static true";
+ }
+
+ if false {
+ test_fail "executed wrong alternative for static false";
+ } else {
+ /* Correct */
+ }
+
+ /* Dynamic */
+ if exists "to" {
+ /* Correct */
+ } else {
+ test_fail "executed wrong alternative for dynamic true";
+ }
+
+ if exists "flierp" {
+ test_fail "executed wrong alternative for dynamic false";
+ } else {
+ /* Correct */
+ }
+}
+
+/*
+ * TEST: Basic functionality: if not true/false
+ */
+
+test "Basic functionality: if not true/false" {
+ /* Static */
+ if not true {
+ test_fail "executed wrong alternative for static not true";
+ } else {
+ /* Correct */
+ }
+
+ if not false {
+ /* Correct */
+ } else {
+ test_fail "executed wrong alternative for static not false";
+ }
+
+ /* Dynamic */
+ if not exists "to" {
+ test_fail "executed wrong alternative for dynamic not true";
+ } else {
+ /* Correct */
+ }
+
+ if not exists "flierp" {
+ /* Correct */
+ } else {
+ test_fail "executed wrong alternative for dynamic not false";
+ }
+}
+
+/*
+ * TEST: Basic functionality: elseif true/false
+ */
+
+test "Basic functionality: elseif true/false" {
+ /* Static */
+ if true {
+ /* Correct */
+ } elsif true {
+ test_fail "executed wrong alternative for static true-true (elsif)";
+ } else {
+ test_fail "executed wrong alternative for static true-true (else)";
+ }
+
+ if true {
+ /* Correct */
+ } elsif false {
+ test_fail "executed wrong alternative for static true-false (elsif)";
+ } else {
+ test_fail "executed wrong alternative for static true-false (else)";
+ }
+
+ if false {
+ test_fail "executed wrong alternative for static false-true (if)";
+ } elsif true {
+ /* Correct */
+ } else {
+ test_fail "executed wrong alternative for static false-false (else)";
+ }
+
+ if false {
+ test_fail "executed wrong alternative for static false-false (if)";
+ } elsif false {
+ test_fail "executed wrong alternative for static false-false (elsif)";
+ } else {
+ /* Correct */
+ }
+
+ /* Dynamic */
+ if address :is "from" "stephan@example.org" {
+ /* Correct */
+ } elsif address :contains "from" "stephan" {
+ test_fail "executed wrong alternative for dynamic true-true (elsif)";
+ } else {
+ test_fail "executed wrong alternative for dynamic true-true (else)";
+ }
+
+ if address :is "from" "stephan@example.org" {
+ /* Correct */
+ } elsif address :is "from" "frop@example.com" {
+ test_fail "executed wrong alternative for dynamic true-false (elsif)";
+ } else {
+ test_fail "executed wrong alternative for dynamic true-false (else)";
+ }
+
+ if address :is "from" "tss@example.net" {
+ test_fail "executed wrong alternative for dynamic false-true (if)";
+ } elsif address :is "from" "stephan@example.org" {
+ /* Correct */
+ } else {
+ test_fail "executed wrong alternative for dynamic false-true(else)";
+ }
+
+ if address :is "from" "tss@example.net" {
+ test_fail "executed wrong alternative for dynamic false-false (if)";
+ } elsif address :is "to" "stephan@example.org" {
+ test_fail "executed wrong alternative for dynamic false-false (elsif)";
+ } else {
+ /* Correct */
+ }
+
+ /* Static/Dynamic */
+
+ if true {
+ /* Correct */
+ } elsif address :contains "from" "stephan" {
+ test_fail "executed wrong alternative for first-static true-true (elsif)";
+ } else {
+ test_fail "executed wrong alternative for first-static true-true (else)";
+ }
+
+ if address :is "from" "stephan@example.org" {
+ /* Correct */
+ } elsif true {
+ test_fail "executed wrong alternative for second-static true-true (elsif)";
+ } else {
+ test_fail "executed wrong alternative for second-static true-true (else)";
+ }
+
+ if true {
+ /* Correct */
+ } elsif address :is "from" "frop@example.com" {
+ test_fail "executed wrong alternative for first-static true-false (elsif)";
+ } else {
+ test_fail "executed wrong alternative for first-static true-false (else)";
+ }
+
+ if address :is "from" "stephan@example.org" {
+ /* Correct */
+ } elsif false {
+ test_fail "executed wrong alternative for second-static true-false (elsif)";
+ } else {
+ test_fail "executed wrong alternative for second-static true-false (else)";
+ }
+
+ if false {
+ test_fail "executed wrong alternative for first-static false-true (if)";
+ } elsif address :is "from" "stephan@example.org" {
+ /* Correct */
+ } else {
+ test_fail "executed wrong alternative for first-static false-true(else)";
+ }
+
+ if address :is "from" "tss@example.net" {
+ test_fail "executed wrong alternative for second-static false-true (if)";
+ } elsif true {
+ /* Correct */
+ } else {
+ test_fail "executed wrong alternative for second-static false-true(else)";
+ }
+
+ if false {
+ test_fail "executed wrong alternative for first-static false-false (if)";
+ } elsif address :is "to" "stephan@example.org" {
+ test_fail "executed wrong alternative for first-static false-false (elsif)";
+ } else {
+ /* Correct */
+ }
+
+ if address :is "from" "tss@example.net" {
+ test_fail "executed wrong alternative for second-static false-false (if)";
+ } elsif false {
+ test_fail "executed wrong alternative for second-static false-false (elsif)";
+ } else {
+ /* Correct */
+ }
+}
+
+/*
+ * TEST: Basic functionality: nesting
+ */
+
+test "Basic functionality: nesting" {
+ /* Static */
+ if true {
+ if true {
+ if false {
+ test_fail "chose wrong static outcome: true->true->false";
+ } else {
+ /* Correct */
+ }
+ } else {
+ test_fail "chose wrong static outcome: true->false";
+ }
+ } elsif true {
+ if false {
+ test_fail "chose wrong static outcome: false->true->false";
+ } elsif true {
+ test_fail "chose wrong static outcome: false->true->true";
+ }
+ } else {
+ test_fail "chose wrong static outcome: false->false";
+ }
+
+ /* Dynamic */
+
+ if exists "to" {
+ if exists "from" {
+ if exists "friep" {
+ test_fail "chose wrong dynamic outcome: true->true->false";
+ } else {
+ /* Correct */
+ }
+ } else {
+ test_fail "chose wrong dynamic outcome: true->false";
+ }
+ } elsif exists "cc" {
+ if exists "frop" {
+ test_fail "chose wrong dynamic outcome: false->true->false";
+ } elsif exists "from" {
+ test_fail "chose wrong dynamic outcome: false->true->true";
+ }
+ } else {
+ test_fail "chose wrong dynamic outcome: false->false";
+ }
+}
+
+
+