github.com/lingyao2333/mo-zero@v1.4.1/core/mapping/marshaler_test.go (about) 1 package mapping 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 ) 8 9 func TestMarshal(t *testing.T) { 10 v := struct { 11 Name string `path:"name"` 12 Address string `json:"address,options=[beijing,shanghai]"` 13 Age int `json:"age"` 14 Anonymous bool 15 }{ 16 Name: "kevin", 17 Address: "shanghai", 18 Age: 20, 19 Anonymous: true, 20 } 21 22 m, err := Marshal(v) 23 assert.Nil(t, err) 24 assert.Equal(t, "kevin", m["path"]["name"]) 25 assert.Equal(t, "shanghai", m["json"]["address"]) 26 assert.Equal(t, 20, m["json"]["age"].(int)) 27 assert.True(t, m[emptyTag]["Anonymous"].(bool)) 28 } 29 30 func TestMarshal_Ptr(t *testing.T) { 31 v := &struct { 32 Name string `path:"name"` 33 Address string `json:"address,options=[beijing,shanghai]"` 34 Age int `json:"age"` 35 Anonymous bool 36 }{ 37 Name: "kevin", 38 Address: "shanghai", 39 Age: 20, 40 Anonymous: true, 41 } 42 43 m, err := Marshal(v) 44 assert.Nil(t, err) 45 assert.Equal(t, "kevin", m["path"]["name"]) 46 assert.Equal(t, "shanghai", m["json"]["address"]) 47 assert.Equal(t, 20, m["json"]["age"].(int)) 48 assert.True(t, m[emptyTag]["Anonymous"].(bool)) 49 } 50 51 func TestMarshal_OptionalPtr(t *testing.T) { 52 var val = 1 53 v := struct { 54 Age *int `json:"age"` 55 }{ 56 Age: &val, 57 } 58 59 m, err := Marshal(v) 60 assert.Nil(t, err) 61 assert.Equal(t, 1, *m["json"]["age"].(*int)) 62 } 63 64 func TestMarshal_OptionalPtrNil(t *testing.T) { 65 v := struct { 66 Age *int `json:"age"` 67 }{} 68 69 _, err := Marshal(v) 70 assert.NotNil(t, err) 71 } 72 73 func TestMarshal_BadOptions(t *testing.T) { 74 v := struct { 75 Name string `json:"name,options"` 76 }{ 77 Name: "kevin", 78 } 79 80 _, err := Marshal(v) 81 assert.NotNil(t, err) 82 } 83 84 func TestMarshal_NotInOptions(t *testing.T) { 85 v := struct { 86 Name string `json:"name,options=[a,b]"` 87 }{ 88 Name: "kevin", 89 } 90 91 _, err := Marshal(v) 92 assert.NotNil(t, err) 93 } 94 95 func TestMarshal_NotInOptionsOptional(t *testing.T) { 96 v := struct { 97 Name string `json:"name,options=[a,b],optional"` 98 }{} 99 100 _, err := Marshal(v) 101 assert.Nil(t, err) 102 } 103 104 func TestMarshal_NotInOptionsOptionalWrongValue(t *testing.T) { 105 v := struct { 106 Name string `json:"name,options=[a,b],optional"` 107 }{ 108 Name: "kevin", 109 } 110 111 _, err := Marshal(v) 112 assert.NotNil(t, err) 113 } 114 115 func TestMarshal_Nested(t *testing.T) { 116 type address struct { 117 Country string `json:"country"` 118 City string `json:"city"` 119 } 120 v := struct { 121 Name string `json:"name,options=[kevin,wan]"` 122 Address address `json:"address"` 123 }{ 124 Name: "kevin", 125 Address: address{ 126 Country: "China", 127 City: "Shanghai", 128 }, 129 } 130 131 m, err := Marshal(v) 132 assert.Nil(t, err) 133 assert.Equal(t, "kevin", m["json"]["name"]) 134 assert.Equal(t, "China", m["json"]["address"].(address).Country) 135 assert.Equal(t, "Shanghai", m["json"]["address"].(address).City) 136 } 137 138 func TestMarshal_NestedPtr(t *testing.T) { 139 type address struct { 140 Country string `json:"country"` 141 City string `json:"city"` 142 } 143 v := struct { 144 Name string `json:"name,options=[kevin,wan]"` 145 Address *address `json:"address"` 146 }{ 147 Name: "kevin", 148 Address: &address{ 149 Country: "China", 150 City: "Shanghai", 151 }, 152 } 153 154 m, err := Marshal(v) 155 assert.Nil(t, err) 156 assert.Equal(t, "kevin", m["json"]["name"]) 157 assert.Equal(t, "China", m["json"]["address"].(*address).Country) 158 assert.Equal(t, "Shanghai", m["json"]["address"].(*address).City) 159 } 160 161 func TestMarshal_Slice(t *testing.T) { 162 v := struct { 163 Name []string `json:"name"` 164 }{ 165 Name: []string{"kevin", "wan"}, 166 } 167 168 m, err := Marshal(v) 169 assert.Nil(t, err) 170 assert.ElementsMatch(t, []string{"kevin", "wan"}, m["json"]["name"].([]string)) 171 } 172 173 func TestMarshal_SliceNil(t *testing.T) { 174 v := struct { 175 Name []string `json:"name"` 176 }{ 177 Name: nil, 178 } 179 180 _, err := Marshal(v) 181 assert.NotNil(t, err) 182 } 183 184 func TestMarshal_Range(t *testing.T) { 185 v := struct { 186 Int int `json:"int,range=[1:3]"` 187 Int8 int8 `json:"int8,range=[1:3)"` 188 Int16 int16 `json:"int16,range=(1:3]"` 189 Int32 int32 `json:"int32,range=(1:3)"` 190 Int64 int64 `json:"int64,range=(1:3)"` 191 Uint uint `json:"uint,range=[1:3]"` 192 Uint8 uint8 `json:"uint8,range=[1:3)"` 193 Uint16 uint16 `json:"uint16,range=(1:3]"` 194 Uint32 uint32 `json:"uint32,range=(1:3)"` 195 Uint64 uint64 `json:"uint64,range=(1:3)"` 196 Float32 float32 `json:"float32,range=(1:3)"` 197 Float64 float64 `json:"float64,range=(1:3)"` 198 }{ 199 Int: 1, 200 Int8: 1, 201 Int16: 2, 202 Int32: 2, 203 Int64: 2, 204 Uint: 1, 205 Uint8: 1, 206 Uint16: 2, 207 Uint32: 2, 208 Uint64: 2, 209 Float32: 2, 210 Float64: 2, 211 } 212 213 m, err := Marshal(v) 214 assert.Nil(t, err) 215 assert.Equal(t, 1, m["json"]["int"].(int)) 216 assert.Equal(t, int8(1), m["json"]["int8"].(int8)) 217 assert.Equal(t, int16(2), m["json"]["int16"].(int16)) 218 assert.Equal(t, int32(2), m["json"]["int32"].(int32)) 219 assert.Equal(t, int64(2), m["json"]["int64"].(int64)) 220 assert.Equal(t, uint(1), m["json"]["uint"].(uint)) 221 assert.Equal(t, uint8(1), m["json"]["uint8"].(uint8)) 222 assert.Equal(t, uint16(2), m["json"]["uint16"].(uint16)) 223 assert.Equal(t, uint32(2), m["json"]["uint32"].(uint32)) 224 assert.Equal(t, uint64(2), m["json"]["uint64"].(uint64)) 225 assert.Equal(t, float32(2), m["json"]["float32"].(float32)) 226 assert.Equal(t, float64(2), m["json"]["float64"].(float64)) 227 } 228 229 func TestMarshal_RangeOut(t *testing.T) { 230 tests := []interface{}{ 231 struct { 232 Int int `json:"int,range=[1:3]"` 233 }{ 234 Int: 4, 235 }, 236 struct { 237 Int int `json:"int,range=(1:3]"` 238 }{ 239 Int: 1, 240 }, 241 struct { 242 Int int `json:"int,range=[1:3)"` 243 }{ 244 Int: 3, 245 }, 246 struct { 247 Int int `json:"int,range=(1:3)"` 248 }{ 249 Int: 3, 250 }, 251 struct { 252 Bool bool `json:"bool,range=(1:3)"` 253 }{ 254 Bool: true, 255 }, 256 } 257 258 for _, test := range tests { 259 _, err := Marshal(test) 260 assert.NotNil(t, err) 261 } 262 } 263 264 func TestMarshal_RangeIllegal(t *testing.T) { 265 tests := []interface{}{ 266 struct { 267 Int int `json:"int,range=[3:1]"` 268 }{ 269 Int: 2, 270 }, 271 struct { 272 Int int `json:"int,range=(3:1]"` 273 }{ 274 Int: 2, 275 }, 276 } 277 278 for _, test := range tests { 279 _, err := Marshal(test) 280 assert.Equal(t, err, errNumberRange) 281 } 282 } 283 284 func TestMarshal_RangeLeftEqualsToRight(t *testing.T) { 285 tests := []struct { 286 name string 287 value interface{} 288 err error 289 }{ 290 { 291 name: "left inclusive, right inclusive", 292 value: struct { 293 Int int `json:"int,range=[2:2]"` 294 }{ 295 Int: 2, 296 }, 297 }, 298 { 299 name: "left inclusive, right exclusive", 300 value: struct { 301 Int int `json:"int,range=[2:2)"` 302 }{ 303 Int: 2, 304 }, 305 err: errNumberRange, 306 }, 307 { 308 name: "left exclusive, right inclusive", 309 value: struct { 310 Int int `json:"int,range=(2:2]"` 311 }{ 312 Int: 2, 313 }, 314 err: errNumberRange, 315 }, 316 { 317 name: "left exclusive, right exclusive", 318 value: struct { 319 Int int `json:"int,range=(2:2)"` 320 }{ 321 Int: 2, 322 }, 323 err: errNumberRange, 324 }, 325 } 326 327 for _, test := range tests { 328 test := test 329 t.Run(test.name, func(t *testing.T) { 330 _, err := Marshal(test.value) 331 assert.Equal(t, test.err, err) 332 }) 333 } 334 } 335 336 func TestMarshal_FromString(t *testing.T) { 337 v := struct { 338 Age int `json:"age,string"` 339 }{ 340 Age: 10, 341 } 342 343 m, err := Marshal(v) 344 assert.Nil(t, err) 345 assert.Equal(t, "10", m["json"]["age"].(string)) 346 }