gojay

high performance JSON encoder/decoder with stream API for Golang
git clone git://git.lair.cx/gojay
Log | Files | Refs | README | LICENSE

decode_slice_test.go (3543B)


      1 package gojay
      2 
      3 import (
      4 	"strings"
      5 	"testing"
      6 
      7 	"github.com/stretchr/testify/require"
      8 )
      9 
     10 type slicesTestObject struct {
     11 	sliceString  []string
     12 	sliceInt     []int
     13 	sliceFloat64 []float64
     14 	sliceBool    []bool
     15 }
     16 
     17 func (s *slicesTestObject) UnmarshalJSONObject(dec *Decoder, k string) error {
     18 	switch k {
     19 	case "sliceString":
     20 		return dec.AddSliceString(&s.sliceString)
     21 	case "sliceInt":
     22 		return dec.AddSliceInt(&s.sliceInt)
     23 	case "sliceFloat64":
     24 		return dec.AddSliceFloat64(&s.sliceFloat64)
     25 	case "sliceBool":
     26 		return dec.AddSliceBool(&s.sliceBool)
     27 	}
     28 	return nil
     29 }
     30 
     31 func (s *slicesTestObject) NKeys() int {
     32 	return 4
     33 }
     34 
     35 func TestUnmarshalerJSONObjectArray(t *testing.T) {
     36 	testCases := []struct {
     37 		name           string
     38 		json           string
     39 		expectedResult []*slicesTestObject
     40 		err            bool
     41 	}{
     42 		{
     43 			name: "basic string array",
     44 			json: `[{
     45 				"sliceString": ["foo","bar"]
     46 			}]`,
     47 			expectedResult: []*slicesTestObject{{
     48 				sliceString: []string{"foo", "bar"},
     49 			}},
     50 		},
     51 		{
     52 			name: "many string array",
     53 			json: `[{
     54 				"sliceString": ["foo1","bar"]
     55 			},{
     56 				"sliceString": ["foo2","bar"]
     57 			},{
     58 				"sliceString": ["foo3","bar"]
     59 			}]`,
     60 			expectedResult: []*slicesTestObject{{
     61 				sliceString: []string{"foo1", "bar"},
     62 			}, {
     63 				sliceString: []string{"foo2", "bar"},
     64 			}, {
     65 				sliceString: []string{"foo3", "bar"},
     66 			}},
     67 		},
     68 	}
     69 	for _, testCase := range testCases {
     70 		t.Run(
     71 			testCase.name,
     72 			func(t *testing.T) {
     73 				dec := BorrowDecoder(strings.NewReader(testCase.json))
     74 				var slice []*slicesTestObject
     75 				err := dec.Decode(UnmarshalerJSONObjectArray(
     76 					&slice,
     77 					func() *slicesTestObject {
     78 						return &slicesTestObject{}
     79 					},
     80 				))
     81 
     82 				if testCase.err {
     83 					require.NotNil(t, err, "err should not be nil")
     84 					return
     85 				}
     86 				require.Nil(t, err, "err should be nil")
     87 				require.Equal(t, testCase.expectedResult, slice)
     88 			},
     89 		)
     90 	}
     91 }
     92 
     93 func TestDecodeSlices(t *testing.T) {
     94 	testCases := []struct {
     95 		name           string
     96 		json           string
     97 		expectedResult slicesTestObject
     98 		err            bool
     99 	}{
    100 		{
    101 			name: "basic slice string",
    102 			json: `{
    103 				"sliceString": ["foo","bar"]
    104 			}`,
    105 			expectedResult: slicesTestObject{
    106 				sliceString: []string{"foo", "bar"},
    107 			},
    108 		},
    109 		{
    110 			name: "basic slice bool",
    111 			json: `{
    112 				"sliceBool": [true,false]
    113 			}`,
    114 			expectedResult: slicesTestObject{
    115 				sliceBool: []bool{true, false},
    116 			},
    117 		},
    118 		{
    119 			name: "basic slice int",
    120 			json: `{
    121 				"sliceInt": [1,2,3]
    122 			}`,
    123 			expectedResult: slicesTestObject{
    124 				sliceInt: []int{1, 2, 3},
    125 			},
    126 		},
    127 		{
    128 			name: "basic slice float64",
    129 			json: `{
    130 				"sliceFloat64": [1.3,2.4,3.1]
    131 			}`,
    132 			expectedResult: slicesTestObject{
    133 				sliceFloat64: []float64{1.3, 2.4, 3.1},
    134 			},
    135 		},
    136 		{
    137 			name: "err slice float64",
    138 			json: `{
    139 				"sliceFloat64": [1.3",2.4,3.1]
    140 			}`,
    141 			err: true,
    142 		},
    143 		{
    144 			name: "err slice str",
    145 			json: `{
    146 				"sliceString": [",""]
    147 			}`,
    148 			err: true,
    149 		},
    150 		{
    151 			name: "err slice int",
    152 			json: `{
    153 				"sliceInt": [1t,2,3]
    154 			}`,
    155 			err: true,
    156 		},
    157 		{
    158 			name: "err slice bool",
    159 			json: `{
    160 				"sliceBool": [truo,false]
    161 			}`,
    162 			err: true,
    163 		},
    164 	}
    165 
    166 	for _, testCase := range testCases {
    167 		t.Run(
    168 			testCase.name,
    169 			func(t *testing.T) {
    170 				dec := BorrowDecoder(strings.NewReader(testCase.json))
    171 				var o slicesTestObject
    172 				err := dec.Decode(&o)
    173 
    174 				if testCase.err {
    175 					require.NotNil(t, err, "err should not be nil")
    176 					return
    177 				}
    178 				require.Nil(t, err, "err should be nil")
    179 				require.Equal(t, testCase.expectedResult, o)
    180 			},
    181 		)
    182 	}
    183 }