Add util.testing.expectDeepEqual

This commit is contained in:
jaina heartles 2022-11-27 00:21:50 -08:00
parent d0e08e4b04
commit f7f84f0516
1 changed files with 41 additions and 0 deletions

View File

@ -194,3 +194,44 @@ pub fn seedThreadPrng() !void {
prng = std.rand.DefaultPrng.init(@bitCast(u64, buf));
}
pub const testing = struct {
pub fn expectDeepEqual(expected: anytype, actual: @TypeOf(expected)) !void {
const T = @TypeOf(expected);
switch (@typeInfo(T)) {
.Null, .Void => return,
.Int, .Float, .Bool, .Enum => try std.testing.expectEqual(expected, actual),
.Struct => {
inline for (comptime std.meta.fieldNames(T)) |f| {
try expectDeepEqual(@field(expected, f), @field(actual, f));
}
},
.Union => {
inline for (comptime std.meta.fieldNames(T)) |f| {
if (std.meta.isTag(expected, f)) {
try std.testing.expect(std.std.meta.isTag(actual, f));
try expectDeepEqual(@field(expected, f), @field(actual, f));
}
}
},
.Pointer, .Array => {
if (comptime std.meta.trait.isIndexable(T)) {
try std.testing.expectEqual(expected.len, actual.len);
for (expected) |_, i| {
try expectDeepEqual(expected[i], actual[i]);
}
} else if (comptime std.meta.trait.isSingleItemPtr(T)) {
try expectDeepEqual(expected.*, actual.*);
}
},
.Optional => {
if (expected) |e| {
try expectDeepEqual(e, actual orelse return error.TestExpectedEqual);
} else {
try std.testing.expect(actual == null);
}
},
else => @compileError("Unsupported Type " ++ @typeName(T)),
}
}
};