|
@@ -2,6 +2,7 @@ package mapping
|
|
|
|
|
|
import (
|
|
|
"encoding/json"
|
|
|
+ "fmt"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
"testing"
|
|
@@ -467,6 +468,85 @@ func TestUnmarshalIntSliceFromString(t *testing.T) {
|
|
|
ast.Equal(2, v.Values[1])
|
|
|
}
|
|
|
|
|
|
+func TestUnmarshalIntMapFromString(t *testing.T) {
|
|
|
+ var v struct {
|
|
|
+ Sort map[string]int `key:"sort"`
|
|
|
+ }
|
|
|
+ m := map[string]interface{}{
|
|
|
+ "sort": `{"value":12345,"zeroVal":0,"nullVal":null}`,
|
|
|
+ }
|
|
|
+
|
|
|
+ ast := assert.New(t)
|
|
|
+ ast.Nil(UnmarshalKey(m, &v))
|
|
|
+ ast.Equal(3, len(v.Sort))
|
|
|
+ ast.Equal(12345, v.Sort["value"])
|
|
|
+ ast.Equal(0, v.Sort["zeroVal"])
|
|
|
+ ast.Equal(0, v.Sort["nullVal"])
|
|
|
+}
|
|
|
+
|
|
|
+func TestUnmarshalBoolMapFromString(t *testing.T) {
|
|
|
+ var v struct {
|
|
|
+ Sort map[string]bool `key:"sort"`
|
|
|
+ }
|
|
|
+ m := map[string]interface{}{
|
|
|
+ "sort": `{"value":true,"zeroVal":false,"nullVal":null}`,
|
|
|
+ }
|
|
|
+
|
|
|
+ ast := assert.New(t)
|
|
|
+ ast.Nil(UnmarshalKey(m, &v))
|
|
|
+ ast.Equal(3, len(v.Sort))
|
|
|
+ ast.Equal(true, v.Sort["value"])
|
|
|
+ ast.Equal(false, v.Sort["zeroVal"])
|
|
|
+ ast.Equal(false, v.Sort["nullVal"])
|
|
|
+}
|
|
|
+
|
|
|
+type CustomStringer string
|
|
|
+
|
|
|
+type UnsupportedStringer string
|
|
|
+
|
|
|
+func (c CustomStringer) String() string {
|
|
|
+ return fmt.Sprintf("{%s}", string(c))
|
|
|
+}
|
|
|
+
|
|
|
+func TestUnmarshalStringMapFromStringer(t *testing.T) {
|
|
|
+ var v struct {
|
|
|
+ Sort map[string]string `key:"sort"`
|
|
|
+ }
|
|
|
+ m := map[string]interface{}{
|
|
|
+ "sort": CustomStringer(`"value":"ascend","emptyStr":""`),
|
|
|
+ }
|
|
|
+
|
|
|
+ ast := assert.New(t)
|
|
|
+ ast.Nil(UnmarshalKey(m, &v))
|
|
|
+ ast.Equal(2, len(v.Sort))
|
|
|
+ ast.Equal("ascend", v.Sort["value"])
|
|
|
+ ast.Equal("", v.Sort["emptyStr"])
|
|
|
+}
|
|
|
+
|
|
|
+func TestUnmarshalStringMapFromUnsupportedType(t *testing.T) {
|
|
|
+ var v struct {
|
|
|
+ Sort map[string]string `key:"sort"`
|
|
|
+ }
|
|
|
+ m := map[string]interface{}{
|
|
|
+ "sort": UnsupportedStringer(`{"value":"ascend","emptyStr":""}`),
|
|
|
+ }
|
|
|
+
|
|
|
+ ast := assert.New(t)
|
|
|
+ ast.NotNil(UnmarshalKey(m, &v))
|
|
|
+}
|
|
|
+
|
|
|
+func TestUnmarshalStringMapFromNotSettableValue(t *testing.T) {
|
|
|
+ var v struct {
|
|
|
+ sort map[string]string `key:"sort"`
|
|
|
+ }
|
|
|
+ m := map[string]interface{}{
|
|
|
+ "sort": `{"value":"ascend","emptyStr":""}`,
|
|
|
+ }
|
|
|
+
|
|
|
+ ast := assert.New(t)
|
|
|
+ ast.NotNil(UnmarshalKey(m, &v))
|
|
|
+}
|
|
|
+
|
|
|
func TestUnmarshalStringMapFromString(t *testing.T) {
|
|
|
var v struct {
|
|
|
Sort map[string]string `key:"sort"`
|
|
@@ -482,6 +562,32 @@ func TestUnmarshalStringMapFromString(t *testing.T) {
|
|
|
ast.Equal("", v.Sort["emptyStr"])
|
|
|
}
|
|
|
|
|
|
+func TestUnmarshalStructMapFromString(t *testing.T) {
|
|
|
+ var v struct {
|
|
|
+ Filter map[string]struct {
|
|
|
+ Field1 bool `json:"field1"`
|
|
|
+ Field2 int64 `json:"field2,string"`
|
|
|
+ Field3 string `json:"field3"`
|
|
|
+ Field4 *string `json:"field4"`
|
|
|
+ Field5 []string `json:"field5"`
|
|
|
+ } `key:"filter"`
|
|
|
+ }
|
|
|
+ m := map[string]interface{}{
|
|
|
+ "filter": `{"obj":{"field1":true,"field2":"1573570455447539712","field3":"this is a string",
|
|
|
+ "field4":"this is a string pointer","field5":["str1","str2"]}}`,
|
|
|
+ }
|
|
|
+
|
|
|
+ ast := assert.New(t)
|
|
|
+ ast.Nil(UnmarshalKey(m, &v))
|
|
|
+ ast.Equal(1, len(v.Filter))
|
|
|
+ ast.NotNil(v.Filter["obj"])
|
|
|
+ ast.Equal(true, v.Filter["obj"].Field1)
|
|
|
+ ast.Equal(int64(1573570455447539712), v.Filter["obj"].Field2)
|
|
|
+ ast.Equal("this is a string", v.Filter["obj"].Field3)
|
|
|
+ ast.Equal("this is a string pointer", *v.Filter["obj"].Field4)
|
|
|
+ ast.ElementsMatch([]string{"str1", "str2"}, v.Filter["obj"].Field5)
|
|
|
+}
|
|
|
+
|
|
|
func TestUnmarshalStringSliceMapFromString(t *testing.T) {
|
|
|
var v struct {
|
|
|
Filter map[string][]string `key:"filter"`
|