aboutsummaryrefslogtreecommitdiff
path: root/test/behavior/while.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-10-14 22:16:26 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-10-14 22:16:26 -0700
commitcacd5366a6707cb030e212ea3cc46052168d4006 (patch)
tree8e6d5d7c40bb763acd180040af8396d4198cbe92 /test/behavior/while.zig
parent55eea3b045c86c78eb8d9cc862122d260352a631 (diff)
downloadzig-cacd5366a6707cb030e212ea3cc46052168d4006.tar.gz
zig-cacd5366a6707cb030e212ea3cc46052168d4006.zip
stage2: LLVM backend: implement `wrap_optional` AIR
and move over some passing tests
Diffstat (limited to 'test/behavior/while.zig')
-rw-r--r--test/behavior/while.zig88
1 files changed, 88 insertions, 0 deletions
diff --git a/test/behavior/while.zig b/test/behavior/while.zig
index a2f34d54c0..9e9ac5dc01 100644
--- a/test/behavior/while.zig
+++ b/test/behavior/while.zig
@@ -111,3 +111,91 @@ test "while copies its payload" {
try S.doTheTest();
comptime try S.doTheTest();
}
+
+test "continue and break" {
+ try runContinueAndBreakTest();
+ try expect(continue_and_break_counter == 8);
+}
+var continue_and_break_counter: i32 = 0;
+fn runContinueAndBreakTest() !void {
+ var i: i32 = 0;
+ while (true) {
+ continue_and_break_counter += 2;
+ i += 1;
+ if (i < 4) {
+ continue;
+ }
+ break;
+ }
+ try expect(i == 4);
+}
+
+test "while with optional as condition" {
+ numbers_left = 10;
+ var sum: i32 = 0;
+ while (getNumberOrNull()) |value| {
+ sum += value;
+ }
+ try expect(sum == 45);
+}
+
+test "while with optional as condition with else" {
+ numbers_left = 10;
+ var sum: i32 = 0;
+ var got_else: i32 = 0;
+ while (getNumberOrNull()) |value| {
+ sum += value;
+ try expect(got_else == 0);
+ } else {
+ got_else += 1;
+ }
+ try expect(sum == 45);
+ try expect(got_else == 1);
+}
+
+test "while on bool with else result follow else prong" {
+ const result = while (returnFalse()) {
+ break @as(i32, 10);
+ } else @as(i32, 2);
+ try expect(result == 2);
+}
+
+test "while on bool with else result follow break prong" {
+ const result = while (returnTrue()) {
+ break @as(i32, 10);
+ } else @as(i32, 2);
+ try expect(result == 10);
+}
+
+test "while on optional with else result follow else prong" {
+ const result = while (returnNull()) |value| {
+ break value;
+ } else @as(i32, 2);
+ try expect(result == 2);
+}
+
+test "while on optional with else result follow break prong" {
+ const result = while (returnOptional(10)) |value| {
+ break value;
+ } else @as(i32, 2);
+ try expect(result == 10);
+}
+
+fn returnNull() ?i32 {
+ return null;
+}
+fn returnOptional(x: i32) ?i32 {
+ return x;
+}
+fn returnError() anyerror!i32 {
+ return error.YouWantedAnError;
+}
+fn returnSuccess(x: i32) anyerror!i32 {
+ return x;
+}
+fn returnFalse() bool {
+ return false;
+}
+fn returnTrue() bool {
+ return true;
+}