-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathscanner_test.go
More file actions
131 lines (111 loc) · 3.19 KB
/
scanner_test.go
File metadata and controls
131 lines (111 loc) · 3.19 KB
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
package iterjson_test
import (
"bytes"
"encoding/json"
"fmt"
"testing"
. "ezpkg.io/conveyz"
. "ezpkg.io/iter.json"
jtest "ezpkg.io/iter.json/test"
"ezpkg.io/testingz"
)
func TestNextToken(t *testing.T) {
Convey("NextToken", t, func() {
run := func(tcase jtest.Testcase) {
Convey(tcase.Name, func() {
buf := make([]byte, 0, len(tcase.Data))
w := bytes.NewBuffer(buf)
last := tcase.Data
for {
token, remain, err := NextToken(last)
if err != nil {
t.Errorf("error: %v", err)
return
}
if len(remain) >= len(last) {
panicf("unexpected: remain[%v] >= last[%v]", len(remain), len(last))
}
must(w.Write(token.Bytes()))
if len(remain) == 0 {
break
}
last = remain
}
var v any
must(0, json.Unmarshal(w.Bytes(), &v))
})
}
run(jtest.GetTestcase("pass01.json"))
for _, test := range jtest.LargeSet {
run(test)
}
})
}
func TestScan(t *testing.T) {
Convey("Scan", t, func() {
run := func(tcase jtest.Testcase) {
Convey(tcase.Name, func() {
_number0, _number1, _string0 := false, false, false
buf := make([]byte, 0, len(tcase.Data))
w := bytes.NewBuffer(buf)
for token, err := range Scan(tcase.Data) {
if err != nil {
t.Errorf("error: %v", err)
return
}
must(fmt.Fprintln(w, token))
// verify a few tokens
x, err := token.GetValue()
switch token.String() {
case "null":
assert(t, err == nil && x == nil, "expected nil")
assert(t, token.Type() == TokenNull, "expected null")
case "true":
assert(t, err == nil && x == true, "expected true")
assert(t, token.Type() == TokenTrue, "expected true")
case "false":
assert(t, err == nil && x == false, "expected false")
assert(t, token.Type() == TokenFalse, "expected false")
case "1234567890":
_number0 = true
assert(t, token.Type() == TokenNumber, "expected number")
n, err := token.GetNumber()
assert(t, err == nil && n == float64(1234567890), "expected 1234567890")
case "1.234567890E+34":
_number1 = true
assert(t, token.Type() == TokenNumber, "expected number")
n, err := token.GetNumber()
assert(t, err == nil && n == float64(1.234567890e+34), "expected 1.234567890E+34")
case `"\u0123\u4567\u89AB\uCDEF\uabcd\uef4A"`:
_string0 = true
assert(t, token.Type() == TokenString, "expected string")
s, err := token.GetString()
assert(t, err == nil && s == "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", "expected \u0123\u4567\u89AB\uCDEF\uabcd\uef4A")
}
}
Ω(tcase.ExpectTokens).ToNot(BeEmpty())
testingz.ΩxNoDiffByLine(w.String(), tcase.ExpectTokens)
var v any
must(0, json.Unmarshal(w.Bytes(), &v))
if !(_number0 && _number1 && _string0) {
t.Errorf("expected number0(%v), number1(%v), string0(%v)", _number0, _number1, _string0)
}
})
}
run(jtest.GetTestcase("pass01.json"))
})
}
func must[T any](v T, err error) T {
if err != nil {
panic(err)
}
return v
}
func assert(t *testing.T, cond bool, msg string, args ...any) {
if !cond {
t.Errorf("❌ "+msg, args...)
}
}
func panicf(format string, args ...any) {
panic(fmt.Sprintf(format, args...))
}