github.com/goshafaq/sonic@v0.0.0-20231026082336-871835fb94c6/issue_test/issue113_test.go (about)

     1  /*
     2   * Copyright 2021 ByteDance Inc.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *     http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package issue_test
    18  
    19  import (
    20  	"testing"
    21  
    22  	"github.com/goshafaq/sonic/encoder"
    23  	"github.com/stretchr/testify/require"
    24  )
    25  
    26  type Issue113_OmitemptyOpt struct {
    27  	Bool      bool                `json:"bool,omitempty"`
    28  	Int       int                 `json:"int,omitempty"`
    29  	Int8      int8                `json:"int8,omitempty"`
    30  	Int16     int16               `json:"int16,omitempty"`
    31  	Int32     int32               `json:"int32,omitempty"`
    32  	Int64     int64               `json:"int64,omitempty"`
    33  	Uint      uint                `json:"uint,omitempty"`
    34  	Uint8     uint8               `json:"uint8,omitempty"`
    35  	Uint16    uint16              `json:"uint16,omitempty"`
    36  	Uint32    uint32              `json:"uint32,omitempty"`
    37  	Uint64    uint64              `json:"uint64,omitempty"`
    38  	Float32   float32             `json:"float32,omitempty"`
    39  	Float64   float64             `json:"float64,omitempty"`
    40  	Uintptr   uintptr             `json:"uintptr,omitempty"`
    41  	String    string              `json:"string,omitempty"`
    42  	Array0    [0]uint             `json:"array0,omitempty"`
    43  	Array     [2]int              `json:"array,omitempty"`
    44  	Interface interface{}         `json:"interface,omitempty"`
    45  	Map0      map[int]interface{} `json:"map0,omitempty"`
    46  	Map       map[string]float64  `json:"map,omitempty"`
    47  	Slice0    []int               `json:"slice0,omitempty"`
    48  	Slice     []byte              `json:"slice,omitempty"`
    49  	Ptr       *Issue113_Inner     `json:"ptr,omitempty"`
    50  	Struct1   Issue113_Inner      `json:"struct1,omitempty"`
    51  	Struct2   struct{}            `json:"struct2,omitempty"`
    52  }
    53  
    54  type Issue113_Inner struct {
    55  	S  string `json:"s,"`
    56  	So string `json:"so,omitempty"`
    57  }
    58  
    59  var issue13ExpectedEmptyOpt = `{
    60   "array": [
    61    0,
    62    0
    63   ],
    64   "struct1": {
    65    "s": ""
    66   },
    67   "struct2": {}
    68  }`
    69  
    70  var issue13ExpectedNonemptyOpt = `{
    71   "bool": true,
    72   "int": 1,
    73   "int8": -1,
    74   "int16": 1,
    75   "int32": 2,
    76   "int64": 64,
    77   "uint": 1,
    78   "uint8": 8,
    79   "uint16": 16,
    80   "uint32": 32,
    81   "uint64": 64,
    82   "float32": 1,
    83   "float64": -2.34e+64,
    84   "uintptr": 1,
    85   "string": "string",
    86   "array": [
    87    0,
    88    -1
    89   ],
    90   "interface": {
    91    "s": "not omit"
    92   },
    93   "map0": {
    94    "0": "zero"
    95   },
    96   "map": {
    97    "key": 0
    98   },
    99   "slice0": [
   100    0
   101   ],
   102   "slice": "Yg==",
   103   "ptr": {
   104    "s": "not omit"
   105   },
   106   "struct1": {
   107    "s": "not omit"
   108   },
   109   "struct2": {}
   110  }`
   111  
   112  func TestIssue113_MarshalEmptyFieldsWithOmitemptyOpt(t *testing.T) {
   113  	var obj Issue113_OmitemptyOpt
   114  	obj.Slice0 = make([]int, 0, 100)     // empty slice
   115  	obj.Map0 = make(map[int]interface{}) // empty map
   116  
   117  	got, err := encoder.EncodeIndented(&obj, "", " ", 0)
   118  
   119  	require.NoError(t, err)
   120  	require.Equal(t, issue13ExpectedEmptyOpt, string(got))
   121  }
   122  
   123  func TestIssue113_MarshalNonemptyFieldsWithOmitemptyOpt(t *testing.T) {
   124  	var inner = &Issue113_Inner{
   125  		S: "not omit",
   126  	}
   127  
   128  	var obj = &Issue113_OmitemptyOpt{
   129  		Bool:      true,
   130  		Int:       1,
   131  		Int8:      -1,
   132  		Int16:     1,
   133  		Int32:     2,
   134  		Int64:     64,
   135  		Uint:      1,
   136  		Uint8:     8,
   137  		Uint16:    16,
   138  		Uint32:    32,
   139  		Uint64:    64,
   140  		Float32:   1.0,
   141  		Float64:   -2.34e+64,
   142  		Uintptr:   uintptr(0x1),
   143  		String:    "string",
   144  		Array0:    [0]uint{},
   145  		Array:     [2]int{0, -1},
   146  		Interface: *inner,
   147  		Map0:      map[int]interface{}{0: "zero"},
   148  		Map:       map[string]float64{"key": 0.0},
   149  		Slice0:    make([]int, 1, 1),
   150  		Slice:     []byte("b"),
   151  		Ptr:       inner,
   152  		Struct1:   *inner,
   153  		Struct2:   struct{}{},
   154  	}
   155  
   156  	got, err := encoder.EncodeIndented(&obj, "", " ", 0)
   157  
   158  	require.NoError(t, err)
   159  	require.Equal(t, issue13ExpectedNonemptyOpt, string(got))
   160  }