zig/test/behavior/while.zig
Andrew Kelley c4df9bf56f AstGen: fix while and for with unreachable bodies
Companion commit to 61a53a587558ff1fe1b0ec98bb424022885edccf.

This commit also moves over a bunch of behavior test cases to the
passing-for-stage2 section.
2021-10-02 20:15:03 -07:00

114 lines
2.2 KiB
Zig

const std = @import("std");
const expect = std.testing.expect;
test "while loop" {
var i: i32 = 0;
while (i < 4) {
i += 1;
}
try expect(i == 4);
try expect(whileLoop1() == 1);
}
fn whileLoop1() i32 {
return whileLoop2();
}
fn whileLoop2() i32 {
while (true) {
return 1;
}
}
test "static eval while" {
try expect(static_eval_while_number == 1);
}
const static_eval_while_number = staticWhileLoop1();
fn staticWhileLoop1() i32 {
return staticWhileLoop2();
}
fn staticWhileLoop2() i32 {
while (true) {
return 1;
}
}
test "while with continue expression" {
var sum: i32 = 0;
{
var i: i32 = 0;
while (i < 10) : (i += 1) {
if (i == 5) continue;
sum += i;
}
}
try expect(sum == 40);
}
test "while with else" {
var sum: i32 = 0;
var i: i32 = 0;
var got_else: i32 = 0;
while (i < 10) : (i += 1) {
sum += 1;
} else {
got_else += 1;
}
try expect(sum == 10);
try expect(got_else == 1);
}
var numbers_left: i32 = undefined;
fn getNumberOrErr() anyerror!i32 {
return if (numbers_left == 0) error.OutOfNumbers else x: {
numbers_left -= 1;
break :x numbers_left;
};
}
fn getNumberOrNull() ?i32 {
return if (numbers_left == 0) null else x: {
numbers_left -= 1;
break :x numbers_left;
};
}
test "continue outer while loop" {
testContinueOuter();
comptime testContinueOuter();
}
fn testContinueOuter() void {
var i: usize = 0;
outer: while (i < 10) : (i += 1) {
while (true) {
continue :outer;
}
}
}
test "break from outer while loop" {
testBreakOuter();
comptime testBreakOuter();
}
fn testBreakOuter() void {
outer: while (true) {
while (true) {
break :outer;
}
}
}
test "while copies its payload" {
const S = struct {
fn doTheTest() !void {
var tmp: ?i32 = 10;
while (tmp) |value| {
// Modify the original variable
tmp = null;
try expect(value == 10);
}
}
};
try S.doTheTest();
comptime try S.doTheTest();
}