| ... | @@ -387,14 +387,17 @@ pub const StreamingParser = struct { | ... | @@ -387,14 +387,17 @@ pub const StreamingParser = struct { |
| 387 | token.* = Token.initMarker(Token.Id.ArrayBegin); | 387 | token.* = Token.initMarker(Token.Id.ArrayBegin); |
| 388 | }, | 388 | }, |
| 389 | '-' => { | 389 | '-' => { |
| | 390 | p.number_is_integer = true; |
| 390 | p.state = State.Number; | 391 | p.state = State.Number; |
| 391 | p.count = 0; | 392 | p.count = 0; |
| 392 | }, | 393 | }, |
| 393 | '0' => { | 394 | '0' => { |
| | 395 | p.number_is_integer = true; |
| 394 | p.state = State.NumberMaybeDotOrExponent; | 396 | p.state = State.NumberMaybeDotOrExponent; |
| 395 | p.count = 0; | 397 | p.count = 0; |
| 396 | }, | 398 | }, |
| 397 | '1'...'9' => { | 399 | '1'...'9' => { |
| | 400 | p.number_is_integer = true; |
| 398 | p.state = State.NumberMaybeDigitOrDotOrExponent; | 401 | p.state = State.NumberMaybeDigitOrDotOrExponent; |
| 399 | p.count = 0; | 402 | p.count = 0; |
| 400 | }, | 403 | }, |
| ... | @@ -453,14 +456,17 @@ pub const StreamingParser = struct { | ... | @@ -453,14 +456,17 @@ pub const StreamingParser = struct { |
| 453 | token.* = Token.initMarker(Token.Id.ArrayBegin); | 456 | token.* = Token.initMarker(Token.Id.ArrayBegin); |
| 454 | }, | 457 | }, |
| 455 | '-' => { | 458 | '-' => { |
| | 459 | p.number_is_integer = true; |
| 456 | p.state = State.Number; | 460 | p.state = State.Number; |
| 457 | p.count = 0; | 461 | p.count = 0; |
| 458 | }, | 462 | }, |
| 459 | '0' => { | 463 | '0' => { |
| | 464 | p.number_is_integer = true; |
| 460 | p.state = State.NumberMaybeDotOrExponent; | 465 | p.state = State.NumberMaybeDotOrExponent; |
| 461 | p.count = 0; | 466 | p.count = 0; |
| 462 | }, | 467 | }, |
| 463 | '1'...'9' => { | 468 | '1'...'9' => { |
| | 469 | p.number_is_integer = true; |
| 464 | p.state = State.NumberMaybeDigitOrDotOrExponent; | 470 | p.state = State.NumberMaybeDigitOrDotOrExponent; |
| 465 | p.count = 0; | 471 | p.count = 0; |
| 466 | }, | 472 | }, |
| ... | @@ -1374,8 +1380,21 @@ test "write json then parse it" { | ... | @@ -1374,8 +1380,21 @@ test "write json then parse it" { |
| 1374 | testing.expect(mem.eql(u8, tree.root.Object.get("str").?.value.String, "hello")); | 1380 | testing.expect(mem.eql(u8, tree.root.Object.get("str").?.value.String, "hello")); |
| 1375 | } | 1381 | } |
| 1376 | | 1382 | |
| 1377 | test "parsing empty string gives appropriate error" { | 1383 | fn test_parse(json_str: []const u8) !Value { |
| 1378 | var p = Parser.init(debug.global_allocator, false); | 1384 | var p = Parser.init(debug.global_allocator, false); |
| 1379 | defer p.deinit(); | 1385 | return (try p.parse(json_str)).root; |
| 1380 | testing.expectError(error.UnexpectedEndOfJson, p.parse("")); | 1386 | } |
| | 1387 | |
| | 1388 | test "parsing empty string gives appropriate error" { |
| | 1389 | testing.expectError(error.UnexpectedEndOfJson, test_parse("")); |
| | 1390 | } |
| | 1391 | |
| | 1392 | test "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); |
| 1381 | } | 1400 | } |