| ... | ... | @@ -5,10 +5,13 @@ const ArrayHashMap = @import("hashmap.zig").ArrayHashMap; |
| 5 | 5 | |
| 6 | 6 | const parseFromSlice = @import("static.zig").parseFromSlice; |
| 7 | 7 | const parseFromSliceLeaky = @import("static.zig").parseFromSliceLeaky; |
| 8 | const parseFromTokenSource = @import("static.zig").parseFromTokenSource; |
| 8 | 9 | const parseFromValue = @import("static.zig").parseFromValue; |
| 9 | 10 | const stringifyAlloc = @import("stringify.zig").stringifyAlloc; |
| 10 | 11 | const Value = @import("dynamic.zig").Value; |
| 11 | 12 | |
| 13 | const jsonReader = @import("./scanner.zig").reader; |
| 14 | |
| 12 | 15 | const T = struct { |
| 13 | 16 | i: i32, |
| 14 | 17 | s: []const u8, |
| ... | ... | @@ -29,6 +32,31 @@ test "parse json hashmap" { |
| 29 | 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 | 60 | test "parse json hashmap duplicate fields" { |
| 33 | 61 | var arena = std.heap.ArenaAllocator.init(std.testing.allocator); |
| 34 | 62 | defer arena.deinit(); |