75 lines
1.4 KiB
Zig
75 lines
1.4 KiB
Zig
|
const expect = @import("std").testing.expect;
|
||
|
|
||
|
const FileOpenError = error{
|
||
|
AccessDenied,
|
||
|
OutOfMemory,
|
||
|
FileNotFound,
|
||
|
};
|
||
|
|
||
|
const AllocationError = error{OutOfMemory};
|
||
|
|
||
|
test "coerce error from a subset to a superset" {
|
||
|
const err: FileOpenError = AllocationError.OutOfMemory;
|
||
|
try expect(err == FileOpenError.OutOfMemory);
|
||
|
}
|
||
|
|
||
|
test "error union" {
|
||
|
const maybe_error: AllocationError!u16 = 10;
|
||
|
const no_error = maybe_error catch 0;
|
||
|
|
||
|
try expect(@TypeOf(no_error) == u16);
|
||
|
try expect(no_error == 10);
|
||
|
}
|
||
|
|
||
|
fn failingFunction() error{Oops}!void {
|
||
|
return error.Oops;
|
||
|
}
|
||
|
|
||
|
test "returning an error" {
|
||
|
failingFunction() catch |err| {
|
||
|
try expect(err == error.Oops);
|
||
|
return;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
fn failFn() error{Oops}!i32 {
|
||
|
try failingFunction();
|
||
|
return 12;
|
||
|
}
|
||
|
|
||
|
test "try" {
|
||
|
const v = failFn() catch |err| {
|
||
|
try expect(err == error.Oops);
|
||
|
return;
|
||
|
};
|
||
|
try expect(v == 12);
|
||
|
}
|
||
|
|
||
|
var problems: u32 = 98;
|
||
|
|
||
|
fn failFnCounter() error{Oops}!void {
|
||
|
errdefer problems += 1;
|
||
|
try failingFunction();
|
||
|
}
|
||
|
|
||
|
test "errdefer" {
|
||
|
failFnCounter() catch |err| {
|
||
|
try expect(err == error.Oops);
|
||
|
try expect(problems == 99);
|
||
|
return;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
fn createFile() !void {
|
||
|
return error.AccessDenied;
|
||
|
}
|
||
|
|
||
|
test "inferred error set" {
|
||
|
const x: error{AccessDenied}!void = createFile();
|
||
|
_ = x catch {};
|
||
|
}
|
||
|
|
||
|
const A = error{ NotDir, PathNotFound };
|
||
|
const B = error{ OutOfMemory, PathNotFound };
|
||
|
const C = A || B;
|