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  }