| ... | @@ -5,10 +5,13 @@ const ArrayHashMap = @import("hashmap.zig").ArrayHashMap; | ... | @@ -5,10 +5,13 @@ const ArrayHashMap = @import("hashmap.zig").ArrayHashMap; |
| 5 | | 5 | |
| 6 | const parseFromSlice = @import("static.zig").parseFromSlice; | 6 | const parseFromSlice = @import("static.zig").parseFromSlice; |
| 7 | const parseFromSliceLeaky = @import("static.zig").parseFromSliceLeaky; | 7 | const parseFromSliceLeaky = @import("static.zig").parseFromSliceLeaky; |
| | 8 | const parseFromTokenSource = @import("static.zig").parseFromTokenSource; |
| 8 | const parseFromValue = @import("static.zig").parseFromValue; | 9 | const parseFromValue = @import("static.zig").parseFromValue; |
| 9 | const stringifyAlloc = @import("stringify.zig").stringifyAlloc; | 10 | const stringifyAlloc = @import("stringify.zig").stringifyAlloc; |
| 10 | const Value = @import("dynamic.zig").Value; | 11 | const Value = @import("dynamic.zig").Value; |
| 11 | | 12 | |
| | 13 | const jsonReader = @import("./scanner.zig").reader; |
| | 14 | |
| 12 | const T = struct { | 15 | const T = struct { |
| 13 | i: i32, | 16 | i: i32, |
| 14 | s: []const u8, | 17 | s: []const u8, |
| ... | @@ -29,6 +32,31 @@ test "parse json hashmap" { | ... | @@ -29,6 +32,31 @@ test "parse json hashmap" { |
| 29 | try testing.expectEqual(@as(i32, 1), parsed.value.map.get("xyz").?.i); | 32 | try testing.expectEqual(@as(i32, 1), parsed.value.map.get("xyz").?.i); |
| 30 | } | 33 | } |
| 31 | | 34 | |
| | 35 | test "parse json hashmap while streaming" { |
| | 36 | const doc = |
| | 37 | \\{ |
| | 38 | \\ "abc": {"i": 0, "s": "d"}, |
| | 39 | \\ "xyz": {"i": 1, "s": "w"} |
| | 40 | \\} |
| | 41 | ; |
| | 42 | var stream = std.io.fixedBufferStream(doc); |
| | 43 | var json_reader = jsonReader(testing.allocator, stream.reader()); |
| | 44 | |
| | 45 | var parsed = try parseFromTokenSource( |
| | 46 | ArrayHashMap(T), |
| | 47 | testing.allocator, |
| | 48 | &json_reader, |
| | 49 | .{}, |
| | 50 | ); |
| | 51 | defer parsed.deinit(); |
| | 52 | // Deinit our reader to invalidate its buffer |
| | 53 | json_reader.deinit(); |
| | 54 | |
| | 55 | try testing.expectEqual(@as(usize, 2), parsed.value.map.count()); |
| | 56 | try testing.expectEqualStrings("d", parsed.value.map.get("abc").?.s); |
| | 57 | try testing.expectEqual(@as(i32, 1), parsed.value.map.get("xyz").?.i); |
| | 58 | } |
| | 59 | |
| 32 | test "parse json hashmap duplicate fields" { | 60 | test "parse json hashmap duplicate fields" { |
| 33 | var arena = std.heap.ArenaAllocator.init(std.testing.allocator); | 61 | var arena = std.heap.ArenaAllocator.init(std.testing.allocator); |
| 34 | defer arena.deinit(); | 62 | defer arena.deinit(); |