1
2
3 package jsoniter
4
5 import (
6 "github.com/stretchr/testify/require"
7 "io"
8 "testing"
9 )
10
11 func Test_string_end(t *testing.T) {
12 end, escaped := ParseString(ConfigDefault, `abc"`).findStringEnd()
13 if end != 4 {
14 t.Fatal(end)
15 }
16 if escaped != false {
17 t.Fatal(escaped)
18 }
19 end, escaped = ParseString(ConfigDefault, `abc\\"`).findStringEnd()
20 if end != 6 {
21 t.Fatal(end)
22 }
23 if escaped != true {
24 t.Fatal(escaped)
25 }
26 end, escaped = ParseString(ConfigDefault, `abc\\\\"`).findStringEnd()
27 if end != 8 {
28 t.Fatal(end)
29 }
30 if escaped != true {
31 t.Fatal(escaped)
32 }
33 end, escaped = ParseString(ConfigDefault, `abc\"`).findStringEnd()
34 if end != -1 {
35 t.Fatal(end)
36 }
37 if escaped != false {
38 t.Fatal(escaped)
39 }
40 end, escaped = ParseString(ConfigDefault, `abc\`).findStringEnd()
41 if end != -1 {
42 t.Fatal(end)
43 }
44 if escaped != true {
45 t.Fatal(escaped)
46 }
47 end, escaped = ParseString(ConfigDefault, `abc\\`).findStringEnd()
48 if end != -1 {
49 t.Fatal(end)
50 }
51 if escaped != false {
52 t.Fatal(escaped)
53 }
54 end, escaped = ParseString(ConfigDefault, `\\`).findStringEnd()
55 if end != -1 {
56 t.Fatal(end)
57 }
58 if escaped != false {
59 t.Fatal(escaped)
60 }
61 end, escaped = ParseString(ConfigDefault, `\`).findStringEnd()
62 if end != -1 {
63 t.Fatal(end)
64 }
65 if escaped != true {
66 t.Fatal(escaped)
67 }
68 }
69
70 type StagedReader struct {
71 r1 string
72 r2 string
73 r3 string
74 r int
75 }
76
77 func (reader *StagedReader) Read(p []byte) (n int, err error) {
78 reader.r++
79 switch reader.r {
80 case 1:
81 copy(p, []byte(reader.r1))
82 return len(reader.r1), nil
83 case 2:
84 copy(p, []byte(reader.r2))
85 return len(reader.r2), nil
86 case 3:
87 copy(p, []byte(reader.r3))
88 return len(reader.r3), nil
89 default:
90 return 0, io.EOF
91 }
92 }
93
94 func Test_skip_string(t *testing.T) {
95 should := require.New(t)
96 iter := ParseString(ConfigDefault, `"abc`)
97 iter.skipString()
98 should.Equal(1, iter.head)
99 iter = ParseString(ConfigDefault, `\""abc`)
100 iter.skipString()
101 should.Equal(3, iter.head)
102 reader := &StagedReader{
103 r1: `abc`,
104 r2: `"`,
105 }
106 iter = Parse(ConfigDefault, reader, 4096)
107 iter.skipString()
108 should.Equal(1, iter.head)
109 reader = &StagedReader{
110 r1: `abc`,
111 r2: `1"`,
112 }
113 iter = Parse(ConfigDefault, reader, 4096)
114 iter.skipString()
115 should.Equal(2, iter.head)
116 reader = &StagedReader{
117 r1: `abc\`,
118 r2: `"`,
119 }
120 iter = Parse(ConfigDefault, reader, 4096)
121 iter.skipString()
122 should.NotNil(iter.Error)
123 reader = &StagedReader{
124 r1: `abc\`,
125 r2: `""`,
126 }
127 iter = Parse(ConfigDefault, reader, 4096)
128 iter.skipString()
129 should.Equal(2, iter.head)
130 }
131
132 func Test_skip_object(t *testing.T) {
133 iter := ParseString(ConfigDefault, `}`)
134 iter.skipObject()
135 if iter.head != 1 {
136 t.Fatal(iter.head)
137 }
138 iter = ParseString(ConfigDefault, `a}`)
139 iter.skipObject()
140 if iter.head != 2 {
141 t.Fatal(iter.head)
142 }
143 iter = ParseString(ConfigDefault, `{}}a`)
144 iter.skipObject()
145 if iter.head != 3 {
146 t.Fatal(iter.head)
147 }
148 reader := &StagedReader{
149 r1: `{`,
150 r2: `}}a`,
151 }
152 iter = Parse(ConfigDefault, reader, 4096)
153 iter.skipObject()
154 if iter.head != 2 {
155 t.Fatal(iter.head)
156 }
157 iter = ParseString(ConfigDefault, `"}"}a`)
158 iter.skipObject()
159 if iter.head != 4 {
160 t.Fatal(iter.head)
161 }
162 }
163
View as plain text