From c4c88aa65cfac511fcc830a7807da6ac9bde4d0a Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 18 Feb 2023 17:55:32 -0700 Subject: decode_scan: Add a bunch of tests --- decode_scan_test.go | 92 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 79 insertions(+), 13 deletions(-) (limited to 'decode_scan_test.go') diff --git a/decode_scan_test.go b/decode_scan_test.go index 1d61157..eaf2f37 100644 --- a/decode_scan_test.go +++ b/decode_scan_test.go @@ -106,19 +106,16 @@ func TestRuneTypeScanner(t *testing.T) { {0, 0, jsonparse.RuneTypeEOF, nil}, {0, 0, jsonparse.RuneTypeEOF, nil}, }}, - "unread-eof": {`{"foo": 12.0}`, ``, []ReadRuneTypeResult{ - {'{', 1, jsonparse.RuneTypeObjectBeg, nil}, - {'"', 1, jsonparse.RuneTypeStringBeg, nil}, - {'f', 1, jsonparse.RuneTypeStringChar, nil}, - {'o', 1, jsonparse.RuneTypeStringChar, nil}, - {'o', 1, jsonparse.RuneTypeStringChar, nil}, - {'"', 1, jsonparse.RuneTypeStringEnd, nil}, - {':', 1, jsonparse.RuneTypeObjectColon, nil}, + "unread-eof": {`[1,2]`, ``, []ReadRuneTypeResult{ + {'[', 1, jsonparse.RuneTypeArrayBeg, nil}, {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {',', 1, jsonparse.RuneTypeArrayComma, nil}, + {0, pushReadBarrier, 0, nil}, {'2', 1, jsonparse.RuneTypeNumberIntDig, nil}, - {'.', 1, jsonparse.RuneTypeNumberFracDot, nil}, - {'0', 1, jsonparse.RuneTypeNumberFracDig, nil}, - {'}', 1, jsonparse.RuneTypeObjectEnd, nil}, + {']', 1, jsonparse.RuneTypeEOF, nil}, + {0, unreadRune, 0, nil}, + {0, popReadBarrier, 0, nil}, + {']', 1, jsonparse.RuneTypeArrayEnd, nil}, {0, 0, jsonparse.RuneTypeEOF, nil}, {0, unreadRune, 0, ErrInvalidUnreadRune}, {0, 0, jsonparse.RuneTypeEOF, nil}, @@ -149,11 +146,32 @@ func TestRuneTypeScanner(t *testing.T) { {']', 1, jsonparse.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}}, {']', 1, jsonparse.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}}, }}, - "multi-value": {`1{}`, `}`, []ReadRuneTypeResult{ + "multi-value1": {`1{}`, `{}`, []ReadRuneTypeResult{ + {0, pushReadBarrier, 0, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'{', 1, jsonparse.RuneTypeEOF, nil}, + {'{', 1, jsonparse.RuneTypeEOF, nil}, + {'{', 1, jsonparse.RuneTypeEOF, nil}, + {0, popReadBarrier, 0, nil}, + }}, + "multi-value2": {`1{}`, ``, []ReadRuneTypeResult{ + {0, pushReadBarrier, 0, nil}, {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, {'{', 1, jsonparse.RuneTypeEOF, nil}, {'{', 1, jsonparse.RuneTypeEOF, nil}, {'{', 1, jsonparse.RuneTypeEOF, nil}, + {0, popReadBarrier, 0, nil}, + {0, reset, 0, nil}, + {0, pushReadBarrier, 0, nil}, + {'{', 1, jsonparse.RuneTypeObjectBeg, nil}, + {'}', 1, jsonparse.RuneTypeObjectEnd, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, popReadBarrier, 0, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, }}, "early-eof": {` {`, ``, []ReadRuneTypeResult{ {'{', 1, jsonparse.RuneTypeObjectBeg, nil}, @@ -173,6 +191,22 @@ func TestRuneTypeScanner(t *testing.T) { {0, 0, jsonparse.RuneTypeEOF, nil}, }}, "fragment": {`1,`, ``, []ReadRuneTypeResult{ + // Disable auto-child. + {0, pushReadBarrier, 0, nil}, + {0, popReadBarrier, 0, nil}, + // Test main. + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {',', 1, jsonparse.RuneTypeEOF, nil}, + {',', 1, jsonparse.RuneTypeEOF, nil}, + {',', 1, jsonparse.RuneTypeEOF, nil}, + }}, + "child-fragment": {`[1,` + `1,`, ``, []ReadRuneTypeResult{ + // Child prefix. + {'[', 1, jsonparse.RuneTypeArrayBeg, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {',', 1, jsonparse.RuneTypeArrayComma, nil}, + {0, pushReadBarrier, 0, nil}, + // Test main. {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, {',', 1, jsonparse.RuneTypeEOF, nil}, {',', 1, jsonparse.RuneTypeEOF, nil}, @@ -198,13 +232,45 @@ func TestRuneTypeScanner(t *testing.T) { {0, 0, jsonparse.RuneTypeEOF, nil}, {0, 0, jsonparse.RuneTypeEOF, nil}, }}, + "invalid-number": {`1.2.3`, `.3`, []ReadRuneTypeResult{ + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'.', 1, jsonparse.RuneTypeNumberFracDot, nil}, + {'2', 1, jsonparse.RuneTypeNumberFracDig, nil}, + {'.', 1, jsonparse.RuneTypeEOF, nil}, + {0, reset, 0, nil}, + {'.', 1, jsonparse.RuneTypeError, &DecodeSyntaxError{Offset: 3, Err: fmt.Errorf("invalid character %q looking for beginning of value", '.')}}, + }}, + "trailing-garbage": {" 42 x", `x`, []ReadRuneTypeResult{ + {0, pushReadBarrier, 0, nil}, + {'4', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {0, unreadRune, 0, nil}, + {'4', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {0, unreadRune, 0, nil}, + {0, pushReadBarrier, 0, nil}, + {'4', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'2', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'x', 1, jsonparse.RuneTypeEOF, nil}, + {0, popReadBarrier, 0, nil}, + {0, popReadBarrier, 0, nil}, + {'x', 1, jsonparse.RuneTypeEOF, nil}, + }}, + "unread-reset": {`{}`, ``, []ReadRuneTypeResult{ + {'{', 1, jsonparse.RuneTypeObjectBeg, nil}, + {0, unreadRune, 0, nil}, + {0, reset, 0, nil}, + {'{', 1, jsonparse.RuneTypeObjectBeg, nil}, + {'}', 1, jsonparse.RuneTypeObjectEnd, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + }}, } func() { childTestcases := make(map[string]runeTypeScannerTestcase) for tcName, tc := range testcases { canChild := true for _, res := range tc.Exp { - if res.s == pushReadBarrier { + if res.s == pushReadBarrier || res.s == reset { canChild = false break } -- cgit v1.2.3-2-g168b