summaryrefslogtreecommitdiff
path: root/internal/parse_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/parse_test.go')
-rw-r--r--internal/parse_test.go78
1 files changed, 78 insertions, 0 deletions
diff --git a/internal/parse_test.go b/internal/parse_test.go
new file mode 100644
index 0000000..34977fb
--- /dev/null
+++ b/internal/parse_test.go
@@ -0,0 +1,78 @@
+// Copyright (C) 2023 Luke Shumaker <lukeshu@lukeshu.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+package internal
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestParserHandleRune(t *testing.T) {
+ t.Parallel()
+ type testcase struct {
+ Input string
+ ExpStack []string
+ }
+ testcases := map[string]testcase{
+ // Keep these test-cases in-sync with the examples in parse.go.
+ "object": {
+ Input: `{"x":"y","a":"b"}`,
+ ExpStack: []string{
+ // st,// processed
+ `?`,
+ `{`, // {
+ `»"`, // {"
+ `»"`, // {"x
+ `»`, // {"x"
+ `o?`, // {"x":
+ `o"`, // {"x":"
+ `o"`, // {"x":"y
+ `o`, // {"x":"y"
+ `{`, // {"x":"y",
+ `»"`, // {"x":"y","
+ `»"`, // {"x":"y","a
+ `»`, // {"x":"y","a"
+ `o?`, // {"x":"y","a":
+ `o"`, // {"x":"y","a":"
+ `o"`, // {"x":"y","a":"b
+ `o`, // {"x":"y","a":"b"
+ ``, // {"x":"y","a":"b"}
+ },
+ },
+ "array": {
+ Input: `["x","y"]`,
+ ExpStack: []string{
+ // st,// processed
+ `?`,
+ `[`, // [
+ `a"`, // ["
+ `a"`, // ["x
+ `a`, // ["x"
+ `a?`, // ["x",
+ `a"`, // ["x","
+ `a"`, // ["x","y
+ `a`, // ["x","y"
+ ``, // ["x","y"]
+ },
+ },
+ }
+ for tcName, tc := range testcases {
+ tc := tc
+ t.Run(tcName, func(t *testing.T) {
+ t.Parallel()
+ var par Parser
+ if !assert.Equal(t, len(tc.Input)+1, len(tc.ExpStack)) {
+ return
+ }
+ for i, r := range tc.Input {
+ assert.Equal(t, tc.ExpStack[i], par.stackString())
+ _, err := par.HandleRune(r)
+ assert.NoError(t, err)
+ assert.Equal(t, tc.ExpStack[i+1], par.stackString())
+ }
+ })
+ }
+}