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 }