summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-02-18 17:55:32 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-18 22:20:22 -0700
commitc4c88aa65cfac511fcc830a7807da6ac9bde4d0a (patch)
treeaff3745e2569653531c377f06131bdd08f6dd384
parent113aa7184e1d2f3858e68301dd1c2a6de51e6c1a (diff)
decode_scan: Add a bunch of tests
-rw-r--r--decode_scan_test.go92
1 files changed, 79 insertions, 13 deletions
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
}