zig/test/cases/null.zig

125 lines
2.2 KiB
Zig
Raw Normal View History

2017-01-05 00:57:48 -08:00
const assert = @import("std").debug.assert;
test "nullableType" {
2017-01-08 19:25:38 -08:00
const x : ?bool = @generatedCode(true);
2016-12-21 22:20:08 -08:00
test (x) |y| {
2016-12-21 22:20:08 -08:00
if (y) {
// OK
} else {
unreachable;
2016-12-21 22:20:08 -08:00
}
} else {
unreachable;
2016-12-21 22:20:08 -08:00
}
2017-01-08 19:25:38 -08:00
const next_x : ?i32 = @generatedCode(null);
2016-12-21 22:20:08 -08:00
const z = next_x ?? 1234;
assert(z == 1234);
2017-01-08 19:25:38 -08:00
const final_x : ?i32 = @generatedCode(13);
2016-12-21 22:20:08 -08:00
const num = final_x ?? unreachable;
2016-12-21 22:20:08 -08:00
assert(num == 13);
}
test "test maybe object and get a pointer to the inner value" {
2016-12-21 22:42:30 -08:00
var maybe_bool: ?bool = true;
test (maybe_bool) |*b| {
2016-12-21 22:42:30 -08:00
*b = false;
}
assert(??maybe_bool == false);
}
test "rhsMaybeUnwrapReturn" {
2017-01-08 19:25:38 -08:00
const x: ?bool = @generatedCode(true);
2016-12-22 07:09:53 -08:00
const y = x ?? return;
}
test "maybe return" {
maybeReturnImpl();
comptime maybeReturnImpl();
}
fn maybeReturnImpl() {
2016-12-22 07:09:53 -08:00
assert(??foo(1235));
test (foo(null))
unreachable;
2016-12-22 07:09:53 -08:00
assert(!??foo(1234));
}
fn foo(x: ?i32) -> ?bool {
const value = x ?? return null;
return value > 1234;
}
2016-12-26 00:44:59 -08:00
test "ifVarMaybePointer" {
2016-12-26 00:44:59 -08:00
assert(shouldBeAPlus1(Particle {.a = 14, .b = 1, .c = 1, .d = 1}) == 15);
}
2017-03-26 00:39:18 -07:00
fn shouldBeAPlus1(p: &const Particle) -> u64 {
var maybe_particle: ?Particle = *p;
test (maybe_particle) |*particle| {
2016-12-26 00:44:59 -08:00
particle.a += 1;
}
test (maybe_particle) |particle| {
2016-12-26 00:44:59 -08:00
return particle.a;
}
return 0;
}
const Particle = struct {
a: u64,
b: u64,
c: u64,
d: u64,
};
test "nullLiteralOutsideFunction" {
const is_null = here_is_a_null_literal.context == null;
2016-12-26 00:44:59 -08:00
assert(is_null);
const is_non_null = here_is_a_null_literal.context != null;
assert(!is_non_null);
2016-12-26 00:44:59 -08:00
}
const SillyStruct = struct {
context: ?i32,
};
const here_is_a_null_literal = SillyStruct {
.context = null,
};
test "testNullRuntime" {
testTestNullRuntime(null);
}
fn testTestNullRuntime(x: ?i32) {
assert(x == null);
assert(!(x != null));
}
test "nullableVoid" {
nullableVoidImpl();
comptime nullableVoidImpl();
}
fn nullableVoidImpl() {
assert(bar(null) == null);
assert(bar({}) != null);
}
fn bar(x: ?void) -> ?void {
test (x) {
return {};
} else {
return null;
}
}