github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/jsoni/extra/fuzzy_decoder_test.go (about)

     1  package extra
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/bingoohuang/gg/pkg/jsoni"
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func init() {
    11  	RegisterFuzzyDecoders()
    12  }
    13  
    14  func Test_any_to_string(t *testing.T) {
    15  	should := require.New(t)
    16  	var val string
    17  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
    18  	should.Equal("100", val)
    19  	should.Nil(jsoni.UnmarshalFromString("10", &val))
    20  	should.Equal("10", val)
    21  	should.Nil(jsoni.UnmarshalFromString("10.1", &val))
    22  	should.Equal("10.1", val)
    23  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
    24  	should.Equal("10.1", val)
    25  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
    26  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
    27  }
    28  
    29  func Test_any_to_int64(t *testing.T) {
    30  	should := require.New(t)
    31  	var val int64
    32  
    33  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
    34  	should.Equal(int64(100), val)
    35  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
    36  	should.Equal(int64(10), val)
    37  	should.Nil(jsoni.UnmarshalFromString(`10.1`, &val))
    38  	should.Equal(int64(10), val)
    39  	should.Nil(jsoni.UnmarshalFromString(`10`, &val))
    40  	should.Equal(int64(10), val)
    41  	should.Nil(jsoni.UnmarshalFromString(`""`, &val))
    42  	should.Equal(int64(0), val)
    43  
    44  	// bool part
    45  	should.Nil(jsoni.UnmarshalFromString(`false`, &val))
    46  	should.Equal(int64(0), val)
    47  	should.Nil(jsoni.UnmarshalFromString(`true`, &val))
    48  	should.Equal(int64(1), val)
    49  
    50  	should.Nil(jsoni.UnmarshalFromString(`-10`, &val))
    51  	should.Equal(int64(-10), val)
    52  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
    53  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
    54  	// large float to int
    55  	should.NotNil(jsoni.UnmarshalFromString(`1234512345123451234512345.0`, &val))
    56  }
    57  
    58  func Test_any_to_int(t *testing.T) {
    59  	should := require.New(t)
    60  	var val int
    61  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
    62  	should.Equal(100, val)
    63  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
    64  	should.Equal(10, val)
    65  	should.Nil(jsoni.UnmarshalFromString(`10.1`, &val))
    66  	should.Equal(10, val)
    67  	should.Nil(jsoni.UnmarshalFromString(`10`, &val))
    68  	should.Equal(10, val)
    69  
    70  	// bool part
    71  	should.Nil(jsoni.UnmarshalFromString(`false`, &val))
    72  	should.Equal(0, val)
    73  	should.Nil(jsoni.UnmarshalFromString(`true`, &val))
    74  	should.Equal(1, val)
    75  
    76  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
    77  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
    78  	// large float to int
    79  	should.NotNil(jsoni.UnmarshalFromString(`1234512345123451234512345.0`, &val))
    80  }
    81  
    82  func Test_any_to_int16(t *testing.T) {
    83  	should := require.New(t)
    84  	var val int16
    85  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
    86  	should.Equal(int16(100), val)
    87  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
    88  	should.Equal(int16(10), val)
    89  	should.Nil(jsoni.UnmarshalFromString(`10.1`, &val))
    90  	should.Equal(int16(10), val)
    91  	should.Nil(jsoni.UnmarshalFromString(`10`, &val))
    92  	should.Equal(int16(10), val)
    93  
    94  	// bool part
    95  	should.Nil(jsoni.UnmarshalFromString(`false`, &val))
    96  	should.Equal(int16(0), val)
    97  	should.Nil(jsoni.UnmarshalFromString(`true`, &val))
    98  	should.Equal(int16(1), val)
    99  
   100  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
   101  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
   102  	// large float to int
   103  	should.NotNil(jsoni.UnmarshalFromString(`1234512345123451234512345.0`, &val))
   104  }
   105  
   106  func Test_any_to_int32(t *testing.T) {
   107  	should := require.New(t)
   108  	var val int32
   109  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
   110  	should.Equal(int32(100), val)
   111  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
   112  	should.Equal(int32(10), val)
   113  	should.Nil(jsoni.UnmarshalFromString(`10.1`, &val))
   114  	should.Equal(int32(10), val)
   115  	should.Nil(jsoni.UnmarshalFromString(`10`, &val))
   116  	should.Equal(int32(10), val)
   117  
   118  	// bool part
   119  	should.Nil(jsoni.UnmarshalFromString(`false`, &val))
   120  	should.Equal(int32(0), val)
   121  	should.Nil(jsoni.UnmarshalFromString(`true`, &val))
   122  	should.Equal(int32(1), val)
   123  
   124  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
   125  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
   126  	// large float to int
   127  	should.NotNil(jsoni.UnmarshalFromString(`1234512345123451234512345.0`, &val))
   128  }
   129  
   130  func Test_any_to_int8(t *testing.T) {
   131  	should := require.New(t)
   132  	var val int8
   133  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
   134  	should.Equal(int8(100), val)
   135  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
   136  	should.Equal(int8(10), val)
   137  	should.Nil(jsoni.UnmarshalFromString(`10.1`, &val))
   138  	should.Equal(int8(10), val)
   139  	should.Nil(jsoni.UnmarshalFromString(`10`, &val))
   140  	should.Equal(int8(10), val)
   141  
   142  	// bool part
   143  	should.Nil(jsoni.UnmarshalFromString(`false`, &val))
   144  	should.Equal(int8(0), val)
   145  	should.Nil(jsoni.UnmarshalFromString(`true`, &val))
   146  	should.Equal(int8(1), val)
   147  
   148  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
   149  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
   150  	// large float to int
   151  	should.NotNil(jsoni.UnmarshalFromString(`1234512345123451234512345.0`, &val))
   152  }
   153  
   154  func Test_any_to_uint8(t *testing.T) {
   155  	should := require.New(t)
   156  	var val uint8
   157  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
   158  	should.Equal(uint8(100), val)
   159  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
   160  	should.Equal(uint8(10), val)
   161  	should.Nil(jsoni.UnmarshalFromString(`10.1`, &val))
   162  	should.Equal(uint8(10), val)
   163  	should.Nil(jsoni.UnmarshalFromString(`10`, &val))
   164  	should.Equal(uint8(10), val)
   165  
   166  	// bool part
   167  	should.Nil(jsoni.UnmarshalFromString(`false`, &val))
   168  	should.Equal(uint8(0), val)
   169  	should.Nil(jsoni.UnmarshalFromString(`true`, &val))
   170  	should.Equal(uint8(1), val)
   171  
   172  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
   173  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
   174  	// large float to int
   175  	should.NotNil(jsoni.UnmarshalFromString(`1234512345123451234512345.0`, &val))
   176  }
   177  
   178  func Test_any_to_uint64(t *testing.T) {
   179  	should := require.New(t)
   180  	var val uint64
   181  
   182  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
   183  	should.Equal(uint64(100), val)
   184  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
   185  	should.Equal(uint64(10), val)
   186  	should.Nil(jsoni.UnmarshalFromString(`10.1`, &val))
   187  	should.Equal(uint64(10), val)
   188  	should.Nil(jsoni.UnmarshalFromString(`10`, &val))
   189  	should.Equal(uint64(10), val)
   190  
   191  	// bool part
   192  	should.Nil(jsoni.UnmarshalFromString(`false`, &val))
   193  	should.Equal(uint64(0), val)
   194  	should.Nil(jsoni.UnmarshalFromString(`true`, &val))
   195  	should.Equal(uint64(1), val)
   196  
   197  	// TODO fix?
   198  	should.NotNil(jsoni.UnmarshalFromString(`-10`, &val))
   199  	should.Equal(uint64(0), val)
   200  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
   201  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
   202  	// large float to int
   203  	should.NotNil(jsoni.UnmarshalFromString(`1234512345123451234512345.0`, &val))
   204  }
   205  
   206  func Test_any_to_uint32(t *testing.T) {
   207  	should := require.New(t)
   208  	var val uint32
   209  
   210  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
   211  	should.Equal(uint32(100), val)
   212  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
   213  	should.Equal(uint32(10), val)
   214  	should.Nil(jsoni.UnmarshalFromString(`10.1`, &val))
   215  	should.Equal(uint32(10), val)
   216  	should.Nil(jsoni.UnmarshalFromString(`10`, &val))
   217  	should.Equal(uint32(10), val)
   218  
   219  	// bool part
   220  	should.Nil(jsoni.UnmarshalFromString(`false`, &val))
   221  	should.Equal(uint32(0), val)
   222  	should.Nil(jsoni.UnmarshalFromString(`true`, &val))
   223  	should.Equal(uint32(1), val)
   224  
   225  	// TODO fix?
   226  	should.NotNil(jsoni.UnmarshalFromString(`-10`, &val))
   227  	should.Equal(uint32(0), val)
   228  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
   229  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
   230  	// large float to int
   231  	should.NotNil(jsoni.UnmarshalFromString(`1234512345123451234512345.0`, &val))
   232  }
   233  
   234  func Test_any_to_uint16(t *testing.T) {
   235  	should := require.New(t)
   236  	var val uint16
   237  
   238  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
   239  	should.Equal(uint16(100), val)
   240  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
   241  	should.Equal(uint16(10), val)
   242  	should.Nil(jsoni.UnmarshalFromString(`10.1`, &val))
   243  	should.Equal(uint16(10), val)
   244  	should.Nil(jsoni.UnmarshalFromString(`10`, &val))
   245  	should.Equal(uint16(10), val)
   246  
   247  	// bool part
   248  	should.Nil(jsoni.UnmarshalFromString(`false`, &val))
   249  	should.Equal(uint16(0), val)
   250  	should.Nil(jsoni.UnmarshalFromString(`true`, &val))
   251  	should.Equal(uint16(1), val)
   252  
   253  	// TODO fix?
   254  	should.NotNil(jsoni.UnmarshalFromString(`-10`, &val))
   255  	should.Equal(uint16(0), val)
   256  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
   257  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
   258  	// large float to int
   259  	should.NotNil(jsoni.UnmarshalFromString(`1234512345123451234512345.0`, &val))
   260  }
   261  
   262  func Test_any_to_uint(t *testing.T) {
   263  	should := require.New(t)
   264  	var val uint
   265  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
   266  	should.Equal(uint(100), val)
   267  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
   268  	should.Equal(uint(10), val)
   269  	should.Nil(jsoni.UnmarshalFromString(`10.1`, &val))
   270  	should.Equal(uint(10), val)
   271  	should.Nil(jsoni.UnmarshalFromString(`10`, &val))
   272  	should.Equal(uint(10), val)
   273  
   274  	should.Nil(jsoni.UnmarshalFromString(`false`, &val))
   275  	should.Equal(uint(0), val)
   276  	should.Nil(jsoni.UnmarshalFromString(`true`, &val))
   277  	should.Equal(uint(1), val)
   278  
   279  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
   280  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
   281  	// large float to int
   282  	should.NotNil(jsoni.UnmarshalFromString(`1234512345123451234512345.0`, &val))
   283  }
   284  
   285  func Test_any_to_float32(t *testing.T) {
   286  	should := require.New(t)
   287  	var val float32
   288  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
   289  	should.Equal(float32(100), val)
   290  
   291  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
   292  	should.Equal(float32(10.1), val)
   293  	should.Nil(jsoni.UnmarshalFromString(`10.1`, &val))
   294  	should.Equal(float32(10.1), val)
   295  	should.Nil(jsoni.UnmarshalFromString(`10`, &val))
   296  	should.Equal(float32(10), val)
   297  
   298  	// bool part
   299  	should.Nil(jsoni.UnmarshalFromString(`false`, &val))
   300  	should.Equal(float32(0), val)
   301  	should.Nil(jsoni.UnmarshalFromString(`true`, &val))
   302  	should.Equal(float32(1), val)
   303  
   304  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
   305  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
   306  }
   307  
   308  func Test_any_to_float64(t *testing.T) {
   309  	should := require.New(t)
   310  	var val float64
   311  
   312  	should.Nil(jsoni.UnmarshalFromString(`"100"`, &val))
   313  	should.Equal(float64(100), val)
   314  
   315  	should.Nil(jsoni.UnmarshalFromString(`"10.1"`, &val))
   316  	should.Equal(float64(10.1), val)
   317  	should.Nil(jsoni.UnmarshalFromString(`10.1`, &val))
   318  	should.Equal(float64(10.1), val)
   319  	should.Nil(jsoni.UnmarshalFromString(`10`, &val))
   320  	should.Equal(float64(10), val)
   321  
   322  	// bool part
   323  	should.Nil(jsoni.UnmarshalFromString(`false`, &val))
   324  	should.Equal(float64(0), val)
   325  	should.Nil(jsoni.UnmarshalFromString(`true`, &val))
   326  	should.Equal(float64(1), val)
   327  
   328  	should.NotNil(jsoni.UnmarshalFromString("{}", &val))
   329  	should.NotNil(jsoni.UnmarshalFromString("[]", &val))
   330  }
   331  
   332  func Test_empty_array_as_map(t *testing.T) {
   333  	should := require.New(t)
   334  	var val map[string]interface{}
   335  	should.Nil(jsoni.UnmarshalFromString(`[]`, &val))
   336  	should.Equal(map[string]interface{}{}, val)
   337  }
   338  
   339  func Test_empty_array_as_object(t *testing.T) {
   340  	should := require.New(t)
   341  	var val struct{}
   342  	should.Nil(jsoni.UnmarshalFromString(`[]`, &val))
   343  	should.Equal(struct{}{}, val)
   344  }
   345  
   346  func Test_bad_case(t *testing.T) {
   347  	jsonstr := `
   348  {
   349      "extra_type": 181760,
   350      "combo_type": 0,
   351      "trigger_time_ms": 1498800398000,
   352      "_create_time": "2017-06-16 11:21:39",
   353      "_msg_type": 41000
   354  }
   355  `
   356  
   357  	type OrderEventRequestParams struct {
   358  		ExtraType uint64 `json:"extra_type"`
   359  	}
   360  
   361  	var a OrderEventRequestParams
   362  	err := jsoni.UnmarshalFromString(jsonstr, &a)
   363  	should := require.New(t)
   364  	should.Nil(err)
   365  }
   366  
   367  func Test_null_to_string(t *testing.T) {
   368  	should := require.New(t)
   369  	body := []byte(`null`)
   370  	var message string
   371  	err := jsoni.Unmarshal(body, &message)
   372  	should.NoError(err)
   373  }
   374  
   375  func Test_null_to_int(t *testing.T) {
   376  	should := require.New(t)
   377  	body := []byte(`null`)
   378  	var message int
   379  	err := jsoni.Unmarshal(body, &message)
   380  	should.NoError(err)
   381  }
   382  
   383  func Test_null_to_float32(t *testing.T) {
   384  	should := require.New(t)
   385  	body := []byte(`null`)
   386  	var message float32
   387  	err := jsoni.Unmarshal(body, &message)
   388  	should.NoError(err)
   389  }
   390  
   391  func Test_null_to_float64(t *testing.T) {
   392  	should := require.New(t)
   393  	body := []byte(`null`)
   394  	var message float64
   395  	err := jsoni.Unmarshal(body, &message)
   396  	should.NoError(err)
   397  }