Fix deserializer tests

This commit is contained in:
jaina heartles 2022-12-18 05:43:36 -08:00
parent 67855b57c9
commit 4ec3a61bb6
1 changed files with 43 additions and 19 deletions

View File

@ -407,7 +407,8 @@ test "Deserializer" {
{ {
const T = struct { foo: []const u8, bar: bool }; const T = struct { foo: []const u8, bar: bool };
var ds = Deserializer(T){}; var ds = Deserializer(T){ .arena = std.heap.ArenaAllocator.init(std.testing.allocator) };
defer ds.deinit();
try ds.setSerializedField("foo", "123"); try ds.setSerializedField("foo", "123");
try ds.setSerializedField("bar", "true"); try ds.setSerializedField("bar", "true");
@ -420,7 +421,8 @@ test "Deserializer" {
{ {
const T = struct { foo: []const u8, bar: bool }; const T = struct { foo: []const u8, bar: bool };
var ds = Deserializer(T){}; var ds = Deserializer(T){ .arena = std.heap.ArenaAllocator.init(std.testing.allocator) };
defer ds.deinit();
try std.testing.expectError(error.UnknownField, ds.setSerializedField("baz", "123")); try std.testing.expectError(error.UnknownField, ds.setSerializedField("baz", "123"));
} }
@ -430,7 +432,8 @@ test "Deserializer" {
foo: struct { bar: bool, baz: bool }, foo: struct { bar: bool, baz: bool },
}; };
var ds = Deserializer(T){}; var ds = Deserializer(T){ .arena = std.heap.ArenaAllocator.init(std.testing.allocator) };
defer ds.deinit();
try ds.setSerializedField("foo.bar", "true"); try ds.setSerializedField("foo.bar", "true");
try ds.setSerializedField("foo.baz", "true"); try ds.setSerializedField("foo.baz", "true");
@ -439,29 +442,45 @@ test "Deserializer" {
try util.testing.expectDeepEqual(T{ .foo = .{ .bar = true, .baz = true } }, val); try util.testing.expectDeepEqual(T{ .foo = .{ .bar = true, .baz = true } }, val);
} }
// Union embedding // Union behavior
{ {
const T = struct { const T = struct {
foo: union(enum) { bar: bool, baz: bool }, foo: union(enum) {
bar: struct {
bar: bool,
},
baz: struct {
baz: bool,
},
},
}; };
var ds = Deserializer(T){}; var ds = Deserializer(T){ .arena = std.heap.ArenaAllocator.init(std.testing.allocator) };
try ds.setSerializedField("bar", "true"); defer ds.deinit();
try ds.setSerializedField("foo.bar", "true");
const val = try ds.finish(std.testing.allocator); const val = try ds.finish(std.testing.allocator);
defer ds.finishFree(std.testing.allocator, val); defer ds.finishFree(std.testing.allocator, val);
try util.testing.expectDeepEqual(T{ .foo = .{ .bar = true } }, val); try util.testing.expectDeepEqual(T{ .foo = .{ .bar = .{ .bar = true } } }, val);
} }
// Returns error if multiple union fields specified // Returns error if multiple union fields specified
{ {
const T = struct { const T = struct {
foo: union(enum) { bar: bool, baz: bool }, foo: union(enum) {
bar: struct {
bar: bool,
},
baz: struct {
baz: bool,
},
},
}; };
var ds = Deserializer(T){}; var ds = Deserializer(T){ .arena = std.heap.ArenaAllocator.init(std.testing.allocator) };
try ds.setSerializedField("bar", "true"); defer ds.deinit();
try ds.setSerializedField("baz", "true"); try ds.setSerializedField("foo.bar", "true");
try ds.setSerializedField("foo.baz", "true");
try std.testing.expectError(error.DuplicateUnionMember, ds.finish(std.testing.allocator)); try std.testing.expectError(error.DuplicateUnionMember, ds.finish(std.testing.allocator));
} }
@ -470,7 +489,8 @@ test "Deserializer" {
{ {
const T = struct { foo: []const u8 = "123", bar: bool = true }; const T = struct { foo: []const u8 = "123", bar: bool = true };
var ds = Deserializer(T){}; var ds = Deserializer(T){ .arena = std.heap.ArenaAllocator.init(std.testing.allocator) };
defer ds.deinit();
const val = try ds.finish(std.testing.allocator); const val = try ds.finish(std.testing.allocator);
defer ds.finishFree(std.testing.allocator, val); defer ds.finishFree(std.testing.allocator, val);
@ -481,7 +501,8 @@ test "Deserializer" {
{ {
const T = struct { foo: []const u8, bar: bool }; const T = struct { foo: []const u8, bar: bool };
var ds = Deserializer(T){}; var ds = Deserializer(T){ .arena = std.heap.ArenaAllocator.init(std.testing.allocator) };
defer ds.deinit();
try ds.setSerializedField("foo", "123"); try ds.setSerializedField("foo", "123");
try std.testing.expectError(error.MissingField, ds.finish(std.testing.allocator)); try std.testing.expectError(error.MissingField, ds.finish(std.testing.allocator));
@ -494,7 +515,8 @@ test "Deserializer" {
qux: ?union(enum) { quux: usize } = null, qux: ?union(enum) { quux: usize } = null,
}; };
var ds = Deserializer(T){}; var ds = Deserializer(T){ .arena = std.heap.ArenaAllocator.init(std.testing.allocator) };
defer ds.deinit();
const val = try ds.finish(std.testing.allocator); const val = try ds.finish(std.testing.allocator);
defer ds.finishFree(std.testing.allocator, val); defer ds.finishFree(std.testing.allocator, val);
@ -507,9 +529,10 @@ test "Deserializer" {
qux: ?union(enum) { quux: usize } = null, qux: ?union(enum) { quux: usize } = null,
}; };
var ds = Deserializer(T){}; var ds = Deserializer(T){ .arena = std.heap.ArenaAllocator.init(std.testing.allocator) };
defer ds.deinit();
try ds.setSerializedField("foo.baz", "3"); try ds.setSerializedField("foo.baz", "3");
try ds.setSerializedField("quux", "3"); try ds.setSerializedField("qux", "3");
const val = try ds.finish(std.testing.allocator); const val = try ds.finish(std.testing.allocator);
defer ds.finishFree(std.testing.allocator, val); defer ds.finishFree(std.testing.allocator, val);
@ -522,9 +545,10 @@ test "Deserializer" {
qux: ?union(enum) { quux: usize } = null, qux: ?union(enum) { quux: usize } = null,
}; };
var ds = Deserializer(T){}; var ds = Deserializer(T){ .arena = std.heap.ArenaAllocator.init(std.testing.allocator) };
defer ds.deinit();
try ds.setSerializedField("foo.bar", "3"); try ds.setSerializedField("foo.bar", "3");
try ds.setSerializedField("quux", "3"); try ds.setSerializedField("qux", "3");
try std.testing.expectError(error.MissingField, ds.finish(std.testing.allocator)); try std.testing.expectError(error.MissingField, ds.finish(std.testing.allocator));
} }