blob: cb072d15eacb92e79667422ddc693c1fd9f806ff [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package filter_impl
import (
"reflect"
"testing"
"time"
)
import (
"github.com/stretchr/testify/assert"
)
type testPlainObj struct {
AaAa string `m:"aaAa"`
BaBa string
CaCa struct {
AaAa string
BaBa string `m:"baBa"`
XxYy struct {
xxXx string `m:"xxXx"`
Xx string `m:"xx"`
} `m:"xxYy"`
} `m:"caCa"`
DaDa time.Time
EeEe int
}
func TestObjToMap(t *testing.T) {
obj := &testPlainObj{}
obj.AaAa = "1"
obj.BaBa = "1"
obj.CaCa.BaBa = "2"
obj.CaCa.AaAa = "2"
obj.CaCa.XxYy.xxXx = "3"
obj.CaCa.XxYy.Xx = "3"
obj.DaDa = time.Date(2020, 10, 29, 2, 34, 0, 0, time.Local)
obj.EeEe = 100
m := objToMap(obj).(map[string]interface{})
assert.Equal(t, "1", m["aaAa"].(string))
assert.Equal(t, "1", m["baBa"].(string))
assert.Equal(t, "2", m["caCa"].(map[string]interface{})["aaAa"].(string))
assert.Equal(t, "3", m["caCa"].(map[string]interface{})["xxYy"].(map[string]interface{})["xx"].(string))
assert.Equal(t, reflect.Map, reflect.TypeOf(m["caCa"]).Kind())
assert.Equal(t, reflect.Map, reflect.TypeOf(m["caCa"].(map[string]interface{})["xxYy"]).Kind())
assert.Equal(t, "2020-10-29 02:34:00", m["daDa"].(time.Time).Format("2006-01-02 15:04:05"))
assert.Equal(t, 100, m["eeEe"].(int))
}
type testStruct struct {
AaAa string
BaBa string `m:"baBa"`
XxYy struct {
xxXx string `m:"xxXx"`
Xx string `m:"xx"`
} `m:"xxYy"`
}
func TestObjToMap_Slice(t *testing.T) {
var testData struct {
AaAa string `m:"aaAa"`
BaBa string
CaCa []testStruct `m:"caCa"`
}
testData.AaAa = "1"
testData.BaBa = "1"
var tmp testStruct
tmp.BaBa = "2"
tmp.AaAa = "2"
tmp.XxYy.xxXx = "3"
tmp.XxYy.Xx = "3"
testData.CaCa = append(testData.CaCa, tmp)
m := objToMap(testData).(map[string]interface{})
assert.Equal(t, "1", m["aaAa"].(string))
assert.Equal(t, "1", m["baBa"].(string))
assert.Equal(t, "2", m["caCa"].([]interface{})[0].(map[string]interface{})["aaAa"].(string))
assert.Equal(t, "3", m["caCa"].([]interface{})[0].(map[string]interface{})["xxYy"].(map[string]interface{})["xx"].(string))
assert.Equal(t, reflect.Slice, reflect.TypeOf(m["caCa"]).Kind())
assert.Equal(t, reflect.Map, reflect.TypeOf(m["caCa"].([]interface{})[0].(map[string]interface{})["xxYy"]).Kind())
}
func TestObjToMap_Map(t *testing.T) {
var testData struct {
AaAa string
Baba map[string]interface{}
CaCa map[string]string
DdDd map[string]interface{}
IntMap map[int]interface{}
}
testData.AaAa = "aaaa"
testData.Baba = make(map[string]interface{})
testData.CaCa = make(map[string]string)
testData.DdDd = nil
testData.IntMap = make(map[int]interface{})
testData.Baba["kk"] = 1
var structData struct {
Str string
}
structData.Str = "str"
testData.Baba["struct"] = structData
testData.Baba["nil"] = nil
testData.CaCa["k1"] = "v1"
testData.CaCa["kv2"] = "v2"
testData.IntMap[1] = 1
m := objToMap(testData)
assert.Equal(t, reflect.Map, reflect.TypeOf(m).Kind())
mappedStruct := m.(map[string]interface{})
assert.Equal(t, reflect.String, reflect.TypeOf(mappedStruct["aaAa"]).Kind())
assert.Equal(t, reflect.Map, reflect.TypeOf(mappedStruct["baba"]).Kind())
assert.Equal(t, reflect.Map, reflect.TypeOf(mappedStruct["baba"].(map[interface{}]interface{})["struct"]).Kind())
assert.Equal(t, "str", mappedStruct["baba"].(map[interface{}]interface{})["struct"].(map[string]interface{})["str"])
assert.Equal(t, nil, mappedStruct["baba"].(map[interface{}]interface{})["nil"])
assert.Equal(t, reflect.Map, reflect.TypeOf(mappedStruct["caCa"]).Kind())
assert.Equal(t, reflect.Map, reflect.TypeOf(mappedStruct["ddDd"]).Kind())
intMap := mappedStruct["intMap"]
assert.Equal(t, reflect.Map, reflect.TypeOf(intMap).Kind())
assert.Equal(t, 1, intMap.(map[interface{}]interface{})[1])
}
var mockMapGeneralizer = GetMapGeneralizer()
type mockParent struct {
Gender, Email, Name string
Age int
Child *mockChild
}
func (p mockParent) JavaClassName() string {
return "org.apache.dubbo.mockParent"
}
type mockChild struct {
Gender, Email, Name string
Age int
}
func (c *mockChild) JavaClassName() string {
return "org.apache.dubbo.mockChild"
}
func TestPOJOClassName(t *testing.T) {
c := &mockChild{
Age: 20,
Gender: "male",
Email: "lmc@example.com",
Name: "lmc",
}
p := mockParent{
Age: 30,
Gender: "male",
Email: "xavierniu@example.com",
Name: "xavierniu",
Child: c,
}
m, err := mockMapGeneralizer.Generalize(p)
assert.Nil(t, err)
// parent
assert.Equal(t, "xavierniu", m.(map[string]interface{})["name"].(string))
assert.Equal(t, 30, m.(map[string]interface{})["age"].(int))
assert.Equal(t, "org.apache.dubbo.mockParent", m.(map[string]interface{})["class"].(string))
// child
assert.Equal(t, 20, m.(map[string]interface{})["child"].(map[string]interface{})["age"].(int))
assert.Equal(t, "lmc", m.(map[string]interface{})["child"].(map[string]interface{})["name"].(string))
assert.Equal(t, "org.apache.dubbo.mockChild", m.(map[string]interface{})["child"].(map[string]interface{})["class"].(string))
r, err := mockMapGeneralizer.Realize(m, reflect.TypeOf(p))
assert.Nil(t, err)
rMockParent, ok := r.(mockParent)
assert.True(t, ok)
// parent
assert.Equal(t, "xavierniu", rMockParent.Name)
assert.Equal(t, 30, rMockParent.Age)
// child
assert.Equal(t, "lmc", rMockParent.Child.Name)
assert.Equal(t, 20, rMockParent.Child.Age)
}
func TestPOJOArray(t *testing.T) {
c1 := &mockChild{
Age: 20,
Gender: "male",
Email: "lmc@example.com",
Name: "lmc",
}
c2 := &mockChild{
Age: 21,
Gender: "male",
Email: "lmc1@example.com",
Name: "lmc1",
}
pojoArr := []*mockChild{c1, c2}
m, err := mockMapGeneralizer.Generalize(pojoArr)
assert.Nil(t, err)
assert.Equal(t, "lmc", m.([]interface{})[0].(map[string]interface{})["name"].(string))
assert.Equal(t, 20, m.([]interface{})[0].(map[string]interface{})["age"].(int))
assert.Equal(t, "lmc1", m.([]interface{})[1].(map[string]interface{})["name"].(string))
assert.Equal(t, 21, m.([]interface{})[1].(map[string]interface{})["age"].(int))
r, err := mockMapGeneralizer.Realize(m, reflect.TypeOf(pojoArr))
assert.Nil(t, err)
rPojoArr, ok := r.([]*mockChild)
assert.True(t, ok)
assert.Equal(t, "lmc", rPojoArr[0].Name)
assert.Equal(t, 20, rPojoArr[0].Age)
assert.Equal(t, "lmc1", rPojoArr[1].Name)
assert.Equal(t, 21, rPojoArr[1].Age)
}
func TestNullField(t *testing.T) {
p := mockParent{
Age: 30,
Gender: "male",
Email: "xavierniu@example.com",
Name: "xavierniu",
}
m, _ := mockMapGeneralizer.Generalize(p)
assert.Nil(t, m.(map[string]interface{})["child"])
r, err := mockMapGeneralizer.Realize(m, reflect.TypeOf(p))
assert.Nil(t, err)
rMockParent, ok := r.(mockParent)
assert.True(t, ok)
assert.Nil(t, rMockParent.Child)
}