summaryrefslogtreecommitdiff
path: root/decode_scan_test.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-02-18 22:45:30 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-18 22:45:30 -0700
commitcf75ff06887d7bbb5bbbd682587b9d3f5e474670 (patch)
tree7f8999f73fa4e4c5759a174cebed7c8919fa05e1 /decode_scan_test.go
parent1b773c966cdb6b38cc4bc73e218793db3a9442ba (diff)
parentec0482f598f4b7b05c21b1d19fe8183665e3fe93 (diff)
Merge branch 'lukeshu/scan-tidy'
Diffstat (limited to 'decode_scan_test.go')
-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
}