From cacd5366a6707cb030e212ea3cc46052168d4006 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 14 Oct 2021 22:16:26 -0700 Subject: stage2: LLVM backend: implement `wrap_optional` AIR and move over some passing tests --- test/behavior/while.zig | 88 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) (limited to 'test/behavior/while.zig') 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; +} -- cgit v1.2.3