authorgravatar for 14938807+xackus@users.noreply.github.comxackus <14938807+xackus@users.noreply.github.com> 2019-12-09 22:29:45+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-10 10:30:41-05:00
logc27d06596bf1b92d668fa6e28edadf153bc9a818
tree4346e90b7abd158209a707e673eec94f24e1a73b
parent3388c777fae8b76d1e325b71813361083244ce5d

fix integers parsed as floats


1 files changed, 22 insertions(+), 3 deletions(-)

lib/std/json.zig+22-3
......@@ -387,14 +387,17 @@ pub const StreamingParser = struct {
387387 token.* = Token.initMarker(Token.Id.ArrayBegin);
388388 },
389389 '-' => {
390 p.number_is_integer = true;
390391 p.state = State.Number;
391392 p.count = 0;
392393 },
393394 '0' => {
395 p.number_is_integer = true;
394396 p.state = State.NumberMaybeDotOrExponent;
395397 p.count = 0;
396398 },
397399 '1'...'9' => {
400 p.number_is_integer = true;
398401 p.state = State.NumberMaybeDigitOrDotOrExponent;
399402 p.count = 0;
400403 },
......@@ -453,14 +456,17 @@ pub const StreamingParser = struct {
453456 token.* = Token.initMarker(Token.Id.ArrayBegin);
454457 },
455458 '-' => {
459 p.number_is_integer = true;
456460 p.state = State.Number;
457461 p.count = 0;
458462 },
459463 '0' => {
464 p.number_is_integer = true;
460465 p.state = State.NumberMaybeDotOrExponent;
461466 p.count = 0;
462467 },
463468 '1'...'9' => {
469 p.number_is_integer = true;
464470 p.state = State.NumberMaybeDigitOrDotOrExponent;
465471 p.count = 0;
466472 },
......@@ -1374,8 +1380,21 @@ test "write json then parse it" {
13741380 testing.expect(mem.eql(u8, tree.root.Object.get("str").?.value.String, "hello"));
13751381}
13761382
1377test "parsing empty string gives appropriate error" {
1383fn test_parse(json_str: []const u8) !Value {
13781384 var p = Parser.init(debug.global_allocator, false);
1379 defer p.deinit();
1380 testing.expectError(error.UnexpectedEndOfJson, p.parse(""));
1385 return (try p.parse(json_str)).root;
1386}
1387
1388test "parsing empty string gives appropriate error" {
1389 testing.expectError(error.UnexpectedEndOfJson, test_parse(""));
1390}
1391
1392test "integer after float has proper type" {
1393 const json = try test_parse(
1394 \\{
1395 \\ "float": 3.14,
1396 \\ "ints": [1, 2, 3]
1397 \\}
1398 );
1399 std.testing.expect(json.Object.getValue("ints").?.Array.at(0) == .Integer);
13811400}