-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser_test.go
136 lines (126 loc) · 2.98 KB
/
parser_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package jsontools_test
import (
"bytes"
"errors"
"testing"
"github.com/WqyJh/jsontools"
"github.com/stretchr/testify/require"
)
func TestParser(t *testing.T) {
var buf bytes.Buffer
parser := jsontools.NewJsonParser([]byte(expected1), func(ctx jsontools.HandlerContext) error {
t.Logf("token: %v\tkind: %v\t\t'%s'", ctx.Token, ctx.Kind, string(ctx.Value))
buf.Write(ctx.Value)
return nil
})
require.NoError(t, parser.Parse())
t.Logf("buf: '%s'", buf.String())
require.JSONEq(t, expected1, buf.String())
// stopped by error
called := 0
err := errors.New("stopped")
parser = jsontools.NewJsonParser([]byte(expected1), func(ctx jsontools.HandlerContext) error {
called++
return err
})
require.ErrorIs(t, err, parser.Parse())
require.Equal(t, 1, called)
// with whitespace prefix/suffix
expected := " \t\n" + expected1 + " \t\n"
buf.Reset()
parser = jsontools.NewJsonParser([]byte(expected), func(ctx jsontools.HandlerContext) error {
t.Logf("token: %v\tkind: %v\t\t'%s'", ctx.Token, ctx.Kind, string(ctx.Value))
buf.Write(ctx.Value)
return nil
})
require.NoError(t, parser.Parse())
t.Logf("buf: '%s'", buf.String())
require.JSONEq(t, expected, buf.String())
}
func TestParser2(t *testing.T) {
src := `[1, 2.3, true, false, null, "12345"]`
expected := `[1,2.3,true,false,null,"12345"]`
var buf bytes.Buffer
parser := jsontools.NewJsonParser([]byte(src), func(ctx jsontools.HandlerContext) error {
buf.Write(ctx.Value)
return nil
})
require.NoError(t, parser.Parse())
require.Equal(t, expected, buf.String())
}
func TestParserError(t *testing.T) {
cases := []struct {
src string
expected string
}{
{
src: ` `,
expected: "invalid EOF1",
},
{
src: `{"hello"{`,
expected: `invalid '{'`,
},
{
src: `"hello"`,
expected: `invalid string '"hello"'`,
},
{
src: `12345`,
expected: `invalid int '12345'`,
},
{
src: `{"key":"value" 1.23}`,
expected: "invalid float '1.23'",
},
{
src: `{"key":"value", true}`,
expected: "invalid bool 'true'",
},
{
src: `[]false`,
expected: "invalid bool 'false'",
},
{
src: `{"key":"value"}null}`,
expected: "invalid null 'null'",
},
{
src: `{"key":"value"},null}`,
expected: "invalid ','",
},
{
src: `{"key"::"value"}}`,
expected: "invalid ':'",
},
{
src: `{"key":"value"]}`,
expected: "invalid ']'",
},
{
src: `[1,2}`,
expected: "invalid '}'",
},
{
src: `{{`,
expected: "invalid EOF2",
},
}
for _, c := range cases {
parser := jsontools.NewJsonParser([]byte(c.src), func(ctx jsontools.HandlerContext) error {
return nil
})
err := parser.Parse()
require.Error(t, err)
require.Equal(t, c.expected, err.Error())
}
}
func BenchmarkParser(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
parser := jsontools.NewJsonParser([]byte(expected1), func(ctx jsontools.HandlerContext) error {
return nil
})
require.NoError(b, parser.Parse())
}
}