gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/jsonmap/jsonmap_test.go (about) 1 package jsonmap 2 3 import ( 4 "fmt" 5 "gitee.com/zhongguo168a/gocodes/datax" 6 "gitee.com/zhongguo168a/gocodes/datax/mapx" 7 "github.com/jinzhu/copier" 8 "github.com/stretchr/testify/assert" 9 "testing" 10 "unsafe" 11 ) 12 13 type Enum1 int 14 15 const ( 16 Enum1_A Enum1 = iota 17 Enum1_B 18 Enum1_C 19 ) 20 21 type Enum2 string 22 23 const ( 24 Enum2_A Enum2 = "A" 25 Enum2_B Enum2 = "B" 26 Enum2_C Enum2 = "C" 27 ) 28 29 type Class1 struct { 30 *ClassParent 31 32 Enum Enum1 33 EnumString Enum2 34 Int8 int8 35 Class2 *Class2 36 Map map[string]interface{} 37 MapEnum map[Enum1]interface{} 38 ArrayAny []interface{} 39 ArrayBasic []string 40 ArrayClass []*Class2 41 Any interface{} 42 } 43 44 type Class2 struct { 45 String string 46 Int int 47 } 48 49 type ClassParent struct { 50 ParentInt8 int8 51 } 52 53 func TestStructToMap2(t *testing.T) { 54 m := map[string]interface{}{ 55 "b": 2, 56 } 57 copier.Copy(&m, map[string]interface{}{ 58 "a": 1, 59 }) 60 61 fmt.Println("m", m) 62 } 63 64 func TestJustifyByStruct(t *testing.T) { 65 m := datax.M{ 66 "Enum": 2, 67 "Int8": 9, 68 "Class2": datax.M{ 69 "String": "modify", 70 }, 71 "Map": datax.M{ 72 "a": 2, 73 "b": "b", 74 }, 75 "MapEnum": datax.M{ 76 "1": 2, 77 "2": 4, 78 }, 79 "ArrayAny": []interface{}{"2", "3", 4}, 80 "ArrayBasic": []interface{}{"5"}, 81 "ArrayClass": []interface{}{datax.M{ 82 "String": "ArrayClass2", 83 }}, 84 } 85 JustifyByStruct(m, &Class1{}) 86 } 87 88 func TestStructToMap(t *testing.T) { 89 c1 := &Class1{ 90 Enum: Enum1_B, 91 EnumString: Enum2_B, 92 Int8: 8, 93 Class2: &Class2{ 94 String: "Class2", 95 }, 96 Map: map[string]interface{}{ 97 "a": 1, 98 }, 99 MapEnum: map[Enum1]interface{}{ 100 Enum1_B: 1, 101 }, 102 ArrayAny: []interface{}{"1", "2", 3, datax.M{"1": 1}}, 103 ArrayBasic: []string{"1", "2"}, 104 ArrayClass: []*Class2{ 105 {String: "ArrayClass"}, 106 }, 107 } 108 109 c1map := map[string]interface{}{} 110 err := StructToMap(c1, c1map) 111 assert.Equal(t, nil, err) 112 assert.Equal(t, 1, mapx.Int(c1map, "Enum")) 113 assert.Equal(t, 8, mapx.Int(c1map, "Int8")) 114 assert.Equal(t, "Class2", mapx.Map(c1map, "Class2")["String"]) 115 assert.Equal(t, 1, mapx.Map(c1map, "Map")["a"]) 116 assert.Equal(t, 1, mapx.Map(c1map, "MapEnum")["1"]) 117 assert.Equal(t, []interface{}{"1", "2", 3, datax.M{"1": 1}}, mapx.Array(c1map, "ArrayAny")) 118 assert.Equal(t, []interface{}{"1", "2"}, mapx.Array(c1map, "ArrayBasic")) 119 assert.Equal(t, map[string]interface{}{"Int": float64(0), "String": "ArrayClass"}, mapx.Array(c1map, "ArrayClass")[0]) 120 } 121 122 func TestMapToStruct(t *testing.T) { 123 c1 := &Class1{ 124 Enum: Enum1_B, 125 EnumString: Enum2_B, 126 Int8: 8, 127 Class2: &Class2{ 128 String: "Class2", 129 }, 130 Map: map[string]interface{}{ 131 "a": 1, 132 }, 133 MapEnum: map[Enum1]interface{}{ 134 Enum1_B: 1, 135 }, 136 ArrayAny: []interface{}{"1", "2", 3}, 137 ArrayBasic: []string{"1", "2"}, 138 ArrayClass: []*Class2{ 139 {String: "ArrayClass"}, 140 }, 141 } 142 143 err := MapToStruct(map[string]interface{}{ 144 "Enum": "2", 145 }, c1) 146 assert.Equal(t, true, err != nil) 147 148 err = MapToStruct(datax.M{ 149 "Enum": 2, 150 "EnumString": "C", 151 "Int8": 9, 152 "Class2": datax.M{ 153 "String": "modify", 154 }, 155 "Map": datax.M{ 156 "a": 2, 157 "b": "b", 158 }, 159 "MapEnum": datax.M{ 160 "1": 2, 161 "2": 4, 162 }, 163 "ArrayAny": []interface{}{"2", "3", 4}, 164 "ArrayBasic": []interface{}{"5"}, 165 "ArrayClass": []interface{}{datax.M{ 166 "String": "ArrayClass2", 167 }}, 168 "Any": map[string]interface{}{"a": 1}, 169 }, c1) 170 assert.Equal(t, Enum1_C, c1.Enum) 171 assert.Equal(t, Enum2_C, c1.EnumString) 172 assert.Equal(t, int8(9), c1.Int8) 173 assert.Equal(t, "modify", c1.Class2.String) 174 assert.Equal(t, 2, c1.Map["a"]) 175 assert.Equal(t, "b", c1.Map["b"]) 176 assert.Equal(t, 2, c1.MapEnum[Enum1_B]) 177 assert.Equal(t, 4, c1.MapEnum[Enum1_C]) 178 assert.Equal(t, []interface{}{"2", "3", 4}, c1.ArrayAny) 179 assert.Equal(t, []string{"5"}, c1.ArrayBasic) 180 assert.Equal(t, "ArrayClass2", c1.ArrayClass[0].String) 181 assert.Equal(t, map[string]interface{}{"a": 1}, c1.Any) 182 } 183 184 type People struct { 185 Age int 186 Name string 187 Test1 string 188 Test2 string 189 } 190 191 type emptyInterface struct { 192 typ *struct{} 193 word unsafe.Pointer 194 } 195 196 func TestStruct(t *testing.T) { 197 var in interface{} = map[string]interface{}{ 198 "a": 1, 199 } 200 201 t2 := uintptr(((*emptyInterface)(unsafe.Pointer(&in))).word) 202 *(*int)(unsafe.Pointer(t2)) = 111 203 fmt.Println(in) 204 } 205 206 func TestAnyToAny(t *testing.T) { 207 208 }