mirror of
https://github.com/ziglang/zig.git
synced 2025-12-24 15:13:08 +00:00
Companion commit to 61a53a587558ff1fe1b0ec98bb424022885edccf. This commit also moves over a bunch of behavior test cases to the passing-for-stage2 section.
114 lines
2.2 KiB
Zig
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();
|
|
}
|