summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-21 16:40:19 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-21 16:40:19 +0000
commit9c3e1b3c55c677206e6f70919f81484a7f0fe0c5 (patch)
treece63b0e071c2a7067e516de22585f3a29409ab5c /tests
parenta1efe2cdde2237083ffff825f5b2dbb7442aa419 (diff)
Fix for #79
Diffstat (limited to 'tests')
-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");
+}