-
-
Notifications
You must be signed in to change notification settings - Fork 20
/
deepobject_test.go
86 lines (77 loc) · 1.77 KB
/
deepobject_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
package runtime
import (
"net/url"
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
type InnerObject struct {
Name string
ID int
}
// These are all possible field types, mandatory and optional.
type AllFields struct {
I int `json:"i"`
Oi *int `json:"oi,omitempty"`
F float32 `json:"f"`
Of *float32 `json:"of,omitempty"`
B bool `json:"b"`
Ob *bool `json:"ob,omitempty"`
As []string `json:"as"`
Oas *[]string `json:"oas,omitempty"`
O InnerObject `json:"o"`
Oo *InnerObject `json:"oo,omitempty"`
D MockBinder `json:"d"`
Od *MockBinder `json:"od,omitempty"`
M map[string]int `json:"m"`
Om *map[string]int `json:"om,omitempty"`
}
func TestDeepObject(t *testing.T) {
oi := int(5)
of := float32(3.7)
ob := true
oas := []string{"foo", "bar"}
oo := InnerObject{
Name: "Marcin Romaszewicz",
ID: 123,
}
om := map[string]int{
"additional": 1,
}
d := MockBinder{Time: time.Date(2020, 2, 1, 0, 0, 0, 0, time.UTC)}
srcObj := AllFields{
I: 12,
Oi: &oi,
F: 4.2,
Of: &of,
B: true,
Ob: &ob,
As: []string{"hello", "world"},
Oas: &oas,
O: InnerObject{
Name: "Joe Schmoe",
ID: 456,
},
Oo: &oo,
D: d,
Od: &d,
M: om,
Om: &om,
}
marshaled, err := MarshalDeepObject(srcObj, "p")
require.NoError(t, err)
t.Log(marshaled)
params := make(url.Values)
marshaledParts := strings.Split(marshaled, "&")
for _, p := range marshaledParts {
parts := strings.Split(p, "=")
require.Equal(t, 2, len(parts))
params.Set(parts[0], parts[1])
}
var dstObj AllFields
err = UnmarshalDeepObject(&dstObj, "p", params)
require.NoError(t, err)
assert.EqualValues(t, srcObj, dstObj)
}