1
2
3 package ldvalue
4
5 import (
6 "encoding/json"
7 "fmt"
8 "testing"
9
10 "github.com/mailru/easyjson"
11 "github.com/stretchr/testify/assert"
12 )
13
14 func TestValueEasyJsonMarshalUnmarshal(t *testing.T) {
15 items := []struct {
16 value Value
17 json string
18 }{
19 {Null(), nullAsJSON},
20 {Bool(true), "true"},
21 {Bool(false), "false"},
22 {Int(1), "1"},
23 {Float64(1), "1"},
24 {Float64(2.5), "2.5"},
25 {String("x"), `"x"`},
26 {ArrayOf(), `[]`},
27 {ArrayBuild().Add(Bool(true)).Add(String("x")).Build(), `[true,"x"]`},
28 {ObjectBuild().Build(), `{}`},
29 {ObjectBuild().Set("a", Bool(true)).Build(), `{"a":true}`},
30 }
31 for _, item := range items {
32 t.Run(fmt.Sprintf("type %s, json %v", item.value.Type(), item.json), func(t *testing.T) {
33 j, err := easyjson.Marshal(item.value)
34 assert.NoError(t, err)
35 assert.Equal(t, item.json, string(j))
36
37 assert.Equal(t, item.json, item.value.String())
38 assert.Equal(t, item.json, item.value.JSONString())
39 assert.Equal(t, json.RawMessage(item.json), item.value.AsRaw())
40
41 var v Value
42 err = easyjson.Unmarshal([]byte(item.json), &v)
43 assert.NoError(t, err)
44 assert.Equal(t, item.value, v)
45 })
46 }
47 }
48
49 func TestEasyJsonUnmarshalErrorConditions(t *testing.T) {
50 var v Value
51 for _, data := range [][]byte{
52 nil,
53 {},
54 []byte("what"),
55 []byte("["),
56 []byte("[what"),
57 []byte("{"),
58 []byte("{what"),
59 []byte(`{"no":what`),
60 } {
61 t.Run(string(data), func(t *testing.T) {
62 assert.Error(t, easyjson.Unmarshal(data, &v))
63 })
64 }
65 }
66
67 func TestEasyJsonMarshalRaw(t *testing.T) {
68
69 for _, params := range []struct {
70 desc string
71 input json.RawMessage
72 output string
73 }{
74 {"valid JSON", json.RawMessage(`{"a":1}`), `{"a":1}`},
75 {"zero-length", json.RawMessage{}, `null`},
76 {"nil", json.RawMessage(nil), `null`},
77 } {
78 t.Run(params.desc, func(t *testing.T) {
79 value := Raw(params.input)
80
81 j, err := easyjson.Marshal(value)
82 assert.NoError(t, err)
83 assert.Equal(t, params.output, string(j))
84 })
85 }
86 }
87
88 func TestValueArrayEasyJsonMarshalUnmarshal(t *testing.T) {
89 items := []struct {
90 valueArray ValueArray
91 json string
92 }{
93 {ValueArray{}, nullAsJSON},
94 {ValueArrayOf(), `[]`},
95 {ValueArrayOf(String("a"), String("b")), `["a", "b"]`},
96 }
97 for _, item := range items {
98 t.Run(fmt.Sprintf("json %v", item.json), func(t *testing.T) {
99 j, err := easyjson.Marshal(item.valueArray)
100 assert.NoError(t, err)
101 assert.JSONEq(t, item.json, string(j))
102
103 assert.JSONEq(t, item.json, item.valueArray.String())
104 assert.JSONEq(t, item.json, item.valueArray.JSONString())
105
106 var a ValueArray
107 err = easyjson.Unmarshal([]byte(item.json), &a)
108 assert.NoError(t, err)
109 assert.Equal(t, item.valueArray, a)
110 })
111 }
112 }
113
114 func TestValueMapEasyJsonMarshalUnmarshal(t *testing.T) {
115 items := []struct {
116 valueMap ValueMap
117 json string
118 }{
119 {ValueMap{}, nullAsJSON},
120 {ValueMapBuild().Build(), `{}`},
121 {ValueMapBuild().Set("a", Int(1)).Set("b", Int(2)).Build(), `{"a": 1, "b": 2}`},
122 }
123 for _, item := range items {
124 t.Run(fmt.Sprintf("json %v", item.json), func(t *testing.T) {
125 j, err := easyjson.Marshal(item.valueMap)
126 assert.NoError(t, err)
127 assert.JSONEq(t, item.json, string(j))
128
129 assert.JSONEq(t, item.json, item.valueMap.String())
130 assert.JSONEq(t, item.json, item.valueMap.JSONString())
131
132 var m ValueMap
133 err = easyjson.Unmarshal([]byte(item.json), &m)
134 assert.NoError(t, err)
135 assert.Equal(t, item.valueMap, m)
136 })
137 }
138 }
139
View as plain text