-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpath_test.go
118 lines (106 loc) · 3.56 KB
/
path_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
package maps
import (
"encoding/json"
"testing"
)
func TestPathSetArgs(t *testing.T) {
examples := []struct {
given interface{}
errMessage string
}{
{
nil,
"nil obj",
},
{
map[interface{}]interface{}{},
"non-pointer obj: map[interface {}]interface {}",
},
{
&struct{}{},
"non-map obj: *struct {}",
},
}
for _, x := range examples {
err := PathSet(x.given, "A", 10)
if x.errMessage == "" && err != nil {
t.Errorf("expected no error, got %v", err)
}
if x.errMessage != "" {
if err == nil {
t.Errorf("expected err %q, got no error", x.errMessage)
} else if x.errMessage != err.Error() {
t.Errorf("expected err %q, got %v", x.errMessage, err)
}
}
}
}
func TestSet(t *testing.T) {
examples := []struct {
given string
path string
value interface{}
expected string
errMessage string
}{
{`{}`, "", 0, `{}`, "invalid path"},
{`{}`, "[0]", 1, "{}", "invalid path"},
{`{}`, "0", 2, "{}", "invalid path"},
{`{}`, "0.a", 3, "{}", "invalid path"},
{`{}`, "[0].a", 4, "{}", "invalid path"},
{`{}`, "a", 10, `{"a":10}`, ""},
{`{}`, "a.b", 100, `{"a":{"b":100}}`, ""},
{`{}`, "a.b.c.d", true, `{"a":{"b":{"c":{"d":true}}}}`, ""},
{`{}`, "a[0]", 5, `{"a":[5]}`, ""},
{`{}`, "a.0", 5, `{"a":[5]}`, ""},
{`{}`, "a[0].b", 10, `{"a":[{"b":10}]}`, ""},
{`{}`, "a.0.b", 10, `{"a":[{"b":10}]}`, ""},
{`{}`, "a[3].c", "test", `{"a":[null,null,null,{"c":"test"}]}`, ""},
{`{}`, "a.3.c", "test", `{"a":[null,null,null,{"c":"test"}]}`, ""},
{`{}`, "a[2].b[1]", 1, `{"a":[null,null,{"b":[null,1]}]}`, ""},
{`{}`, "a[2].b[1].c[0]", 1, `{"a":[null,null,{"b":[null,{"c":[1]}]}]}`, ""},
{`{}`, "a[0].b[0].c", 2, `{"a":[{"b":[{"c":2}]}]}`, ""},
{`{}`, "a[0].b.c[0]", 3, `{"a":[{"b":{"c":[3]}}]}`, ""},
{`{}`, "a[0].b.c[0].d", 4, `{"a":[{"b":{"c":[{"d":4}]}}]}`, ""},
{`{}`, "a[0].b[1].c[2].d[3]", 5, `{"a":[{"b":[null,{"c":[null,null,{"d":[null,null,null,5]}]}]}]}`, ""},
{`{}`, "a[0].b[1].c[2].d[3].e", 6, `{"a":[{"b":[null,{"c":[null,null,{"d":[null,null,null,{"e":6}]}]}]}]}`, ""},
{`{}`, "a.b.c", struct{}{}, `{"a":{"b":{"c":{}}}}`, ""},
{`{}`, "a.b.c", []struct{}{}, `{"a":{"b":{"c":[]}}}`, ""},
{`{}`, "a.0.0.0.b", 10, `{"a":[[[{"b":10}]]]}`, ""},
{`{}`, "a.0.b.1.c.2.d", 5, `{"a":[{"b":[null,{"c":[null,null,{"d":5}]}]}]}`, ""},
{`{"a":1,"b":2}`, "a", 10, `{"a":10,"b":2}`, ""},
{`{"a":1,"b":2}`, "c", 10, `{"a":1,"b":2,"c":10}`, ""},
{`{"a":1,"b":2}`, "a.c", 10, `{"a":{"c":10},"b":2}`, ""},
{`{"a":{"b":{"d":5}}}`, "a.b.c", 10, `{"a":{"b":{"c":10,"d":5}}}`, ""},
{`{"a":[{"b":2}]}`, "a.1.c", 10, `{"a":[{"b":2},{"c":10}]}`, ""},
{`{"a":[{"b":2}]}`, "a.2.c", 10, `{"a":[{"b":2},null,{"c":10}]}`, ""},
// hacks
{`{}`, " ", 0, `{" ":0}`, ""},
{`{}`, "a. 0 ", 5, `{"a":{" 0 ":5}}`, ""},
{`{}`, " 0. 1. 2. 3", 5, `{" 0":{" 1":{" 2":{" 3":5}}}}`, ""},
}
for i, x := range examples {
var obj map[string]interface{}
if err := json.Unmarshal([]byte(x.given), &obj); err != nil {
t.Fatal(err)
}
err := PathSet(&obj, x.path, x.value)
if x.errMessage == "" && err != nil {
t.Errorf("example %d: expected no error, got %v", i, err)
}
if x.errMessage != "" {
if err == nil {
t.Errorf("example %d: expected err %q, got no error", i, x.errMessage)
} else if x.errMessage != err.Error() {
t.Errorf("example %d: expected err %q, got %v", i, x.errMessage, err)
}
}
res, err := json.Marshal(obj)
if err != nil {
t.Fatal(err)
}
if string(res) != x.expected {
t.Errorf("example %d: expected result %s, got %s", i, x.expected, string(res))
}
}
}