zig/test/cases/error.zig
Andrew Kelley 8a859afd58 std.io supports printing integers as hex values
remove "unnecessary if statement" error
this "depends on compile variable" code is too hard to validate,
and has false negatives. not worth it right now.

std.str removed, instead use std.mem.

std.mem.eql and std.mem.sliceEql merged and do not require explicit
type argument.
2017-02-07 17:23:50 -05:00

103 lines
1.7 KiB
Zig

const assert = @import("std").debug.assert;
const mem = @import("std").mem;
pub fn foo() -> %i32 {
const x = %return bar();
return x + 1
}
pub fn bar() -> %i32 {
return 13;
}
pub fn baz() -> %i32 {
const y = foo() %% 1234;
return y + 1;
}
fn errorWrapping() {
@setFnTest(this);
assert(%%baz() == 15);
}
error ItBroke;
fn gimmeItBroke() -> []const u8 {
@errorName(error.ItBroke)
}
fn errorName() {
@setFnTest(this);
assert(mem.eql(@errorName(error.AnError), "AnError"));
assert(mem.eql(@errorName(error.ALongerErrorName), "ALongerErrorName"));
}
error AnError;
error ALongerErrorName;
fn errorValues() {
@setFnTest(this);
const a = i32(error.err1);
const b = i32(error.err2);
assert(a != b);
}
error err1;
error err2;
fn redefinitionOfErrorValuesAllowed() {
@setFnTest(this);
shouldBeNotEqual(error.AnError, error.SecondError);
}
error AnError;
error AnError;
error SecondError;
fn shouldBeNotEqual(a: error, b: error) {
if (a == b) @unreachable()
}
fn errBinaryOperator() {
@setFnTest(this);
const a = errBinaryOperatorG(true) %% 3;
const b = errBinaryOperatorG(false) %% 3;
assert(a == 3);
assert(b == 10);
}
error ItBroke;
fn errBinaryOperatorG(x: bool) -> %isize {
if (x) {
error.ItBroke
} else {
isize(10)
}
}
fn unwrapSimpleValueFromError() {
@setFnTest(this);
const i = %%unwrapSimpleValueFromErrorDo();
assert(i == 13);
}
fn unwrapSimpleValueFromErrorDo() -> %isize { 13 }
fn errReturnInAssignment() {
@setFnTest(this);
%%doErrReturnInAssignment();
}
fn doErrReturnInAssignment() -> %void {
var x : i32 = undefined;
x = %return makeANonErr();
}
fn makeANonErr() -> %i32 {
return 1;
}