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  }