Skip to content
Snippets Groups Projects
control-if.svtest 7.14 KiB
Newer Older
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)";	
	}

		test_fail "executed wrong alternative for static false-true (if)";
	} elsif true {
		/* Correct */
	} else {
		test_fail "executed wrong alternative for static false-false (else)";	
		test_fail "executed wrong alternative for static false-false (if)";
		test_fail "executed wrong alternative for static false-false (elsif)";	
	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";
	}
}


Consent

On this website, we use the web analytics service Matomo to analyze and review the use of our website. Through the collected statistics, we can improve our offerings and make them more appealing for you. Here, you can decide whether to allow us to process your data and set corresponding cookies for these purposes, in addition to technically necessary cookies. Further information on data protection—especially regarding "cookies" and "Matomo"—can be found in our privacy policy. You can withdraw your consent at any time.