zig/test/cases/fn.zig
2017-01-05 03:57:48 -05:00

103 lines
1.6 KiB
Zig

const assert = @import("std").debug.assert;
fn params() {
@setFnTest(this);
assert(testParamsAdd(22, 11) == 33);
}
fn testParamsAdd(a: i32, b: i32) -> i32 {
a + b
}
fn localVariables() {
@setFnTest(this);
testLocVars(2);
}
fn testLocVars(b: i32) {
const a: i32 = 1;
if (a + b != 3) @unreachable();
}
fn voidParameters() {
@setFnTest(this);
voidFun(1, void{}, 2, {});
}
fn voidFun(a: i32, b: void, c: i32, d: void) {
const v = b;
const vv: void = if (a == 1) {v} else {};
assert(a + c == 3);
return vv;
}
fn mutableLocalVariables() {
@setFnTest(this);
var zero : i32 = 0;
assert(zero == 0);
var i = i32(0);
while (i != 3) {
i += 1;
}
assert(i == 3);
}
fn separateBlockScopes() {
@setFnTest(this);
{
const no_conflict : i32 = 5;
assert(no_conflict == 5);
}
const c = {
const no_conflict = i32(10);
no_conflict
};
assert(c == 10);
}
fn callFnWithEmptyString() {
@setFnTest(this);
acceptsString("");
}
fn acceptsString(foo: []u8) { }
fn @"weird function name"() {
@setFnTest(this);
}
fn implicitCastFnUnreachableReturn() {
@setFnTest(this);
wantsFnWithVoid(fnWithUnreachable);
}
fn wantsFnWithVoid(f: fn()) { }
fn fnWithUnreachable() -> unreachable {
@unreachable()
}
fn functionPointers() {
@setFnTest(this);
const fns = []@typeOf(fn1) { fn1, fn2, fn3, fn4, };
for (fns) |f, i| {
assert(f() == u32(i) + 5);
}
}
fn fn1() -> u32 {5}
fn fn2() -> u32 {6}
fn fn3() -> u32 {7}
fn fn4() -> u32 {8}