this post was submitted on 08 Jul 2023
5 points (100.0% liked)

Ziglang

64 readers
1 users here now

founded 2 years ago
MODERATORS
hur
 

Is this the best way to use expectEqual?

fn add(a: i64, b: i64) i64 {
    return a + b;
}

test "basic test" {
    try std.testing.expectEqual(@as(i64, 10), add(3, 7));
}

Without the @as the test doesn't even compile:

./src/main.zig:12:40: error: expected type 'comptime_int', found 'i64'
    try std.testing.expectEqual(10, add(3, 7));

Having to use @as seems makes the test less readable. It seems to me inferring the type of expected from the type of actual would make more sense.

top 4 comments
sorted by: hot top controversial new old
[–] huntrss 2 points 1 year ago

I am not sure if there is already an issue for this. But I usually just switch expected with actual in the arguments. As you mentioned, reading the failing test output is then harder obviously.

[–] [email protected] 1 points 1 year ago (1 children)

Should work if "10" is also declared as a variable with type "i64" I think?

[–] aion 1 points 1 year ago (1 children)

Sure, you could do:

    const ten: i64 = 10;
    try std.testing.expectEqual(ten, add(3, 7));

Is there a way to write an i64 literal?

[–] xzqtlmn 2 points 1 year ago

If we look at the signature expectEqual(expected: anytype, actual: @TypeOf(expected)) !void, notice that the second arg's type depends on the first arg's type.

To avoid using @as coercion, we can just swap the passing arguments. comptime_int can be inferred as i64, not the other way around. And that makes sense because literal values are unsized.