-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathdec_capture_test.go
108 lines (101 loc) · 2.03 KB
/
dec_capture_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
package jx
import (
"bytes"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestIterator_Capture(t *testing.T) {
const input = `{
"objects": [
{
"type": "foo",
"foo": "string"
},
{
"type": "bar",
"bar": 1000
}
]
}`
i := GetDecoder()
i.ResetBytes([]byte(input))
err := i.Obj(func(i *Decoder, key string) error {
return i.Arr(func(i *Decoder) error {
// Reading "type" field value first.
var typ string
if err := i.Capture(func(i *Decoder) error {
return i.Obj(func(i *Decoder, key string) error {
switch key {
case "type":
s, err := i.Str()
if err != nil {
return err
}
typ = s
default:
return i.Skip()
}
return nil
})
}); err != nil {
return err
}
// Reading objects depending on type.
return i.Obj(func(i *Decoder, key string) error {
if key == "type" {
s, err := i.Str()
if err != nil {
return err
}
assert.Equal(t, typ, s)
return nil
}
switch typ {
case "foo":
_, _ = i.Str()
case "bar":
_, err := i.Int()
return err
}
return nil
})
})
})
require.NoError(t, err)
}
func BenchmarkIterator_Skip(b *testing.B) {
var input = []byte(`{"type": "foo", "foo": "string"}`)
it := GetDecoder()
b.ReportAllocs()
for i := 0; i < b.N; i++ {
it.ResetBytes(input)
if err := it.Capture(func(i *Decoder) error {
return i.Skip()
}); err != nil {
b.Fatal(err)
}
}
}
func TestDecoder_Capture(t *testing.T) {
i := DecodeStr(`["foo", "bar", "baz"]`)
var elems int
if err := i.Capture(func(i *Decoder) error {
return i.Arr(func(i *Decoder) error {
elems++
return i.Skip()
})
}); err != nil {
t.Fatal(err)
}
require.Equal(t, Array, i.Next())
require.Equal(t, 3, elems)
t.Run("Nil", func(t *testing.T) {
require.NoError(t, i.Capture(nil))
require.Equal(t, Array, i.Next())
})
}
func TestDecoder_Capture_reader(t *testing.T) {
i := Decode(new(bytes.Buffer), 0)
require.Error(t, i.Capture(nil))
}