summaryrefslogtreecommitdiff
path: root/tests/features
diff options
context:
space:
mode:
Diffstat (limited to 'tests/features')
-rw-r--r--tests/features/test_defer_control_flow.zc79
1 files changed, 79 insertions, 0 deletions
diff --git a/tests/features/test_defer_control_flow.zc b/tests/features/test_defer_control_flow.zc
new file mode 100644
index 0000000..40c7f37
--- /dev/null
+++ b/tests/features/test_defer_control_flow.zc
@@ -0,0 +1,79 @@
+
+test "defer_runs_on_break" {
+ var result = 0;
+
+ for i in 0..5 {
+ defer { result = result + 1; }
+
+ if i == 2 {
+ break;
+ }
+ }
+
+ assert(result == 3, "defer should run on break");
+}
+
+test "defer_runs_on_continue" {
+ var result = 0;
+
+ for i in 0..5 {
+ defer { result = result + 1; }
+
+ if i == 2 {
+ continue;
+ }
+ }
+
+ assert(result == 5, "defer should run on continue");
+}
+
+fn early_return(x: int) -> int {
+ var side_effect = 0;
+ defer { side_effect = 42; }
+
+ if x > 0 {
+ return x + side_effect;
+ }
+
+ return 0;
+}
+
+test "defer_runs_on_return" {
+ var result = early_return(10);
+ assert(result == 10, "early return should work with defer");
+}
+
+test "defer_lifo_order" {
+ var result = 0;
+
+ for i in 0..2 {
+ defer { result = result * 10 + 1; }
+ defer { result = result * 10 + 2; }
+
+ if i == 0 {
+ break;
+ }
+ }
+
+ assert(result == 21, "defers should run in LIFO order");
+}
+
+test "nested_loops_defer" {
+ var outer_count = 0;
+ var inner_count = 0;
+
+ for i in 0..3 {
+ defer { outer_count = outer_count + 1; }
+
+ for j in 0..4 {
+ defer { inner_count = inner_count + 1; }
+
+ if j == 2 {
+ break;
+ }
+ }
+ }
+
+ assert(inner_count == 9, "inner loop defer should run correctly");
+ assert(outer_count == 3, "outer loop defer should run correctly");
+}