1 package pgtype_test
2
3 import (
4 "reflect"
5 "testing"
6
7 "github.com/jackc/pgtype"
8 "github.com/jackc/pgtype/testutil"
9 )
10
11 func TestInt2ArrayTranscode(t *testing.T) {
12 testutil.TestSuccessfulTranscode(t, "int2[]", []interface{}{
13 &pgtype.Int2Array{
14 Elements: nil,
15 Dimensions: nil,
16 Status: pgtype.Present,
17 },
18 &pgtype.Int2Array{
19 Elements: []pgtype.Int2{
20 {Int: 1, Status: pgtype.Present},
21 {Status: pgtype.Null},
22 },
23 Dimensions: []pgtype.ArrayDimension{{Length: 2, LowerBound: 1}},
24 Status: pgtype.Present,
25 },
26 &pgtype.Int2Array{Status: pgtype.Null},
27 &pgtype.Int2Array{
28 Elements: []pgtype.Int2{
29 {Int: 1, Status: pgtype.Present},
30 {Int: 2, Status: pgtype.Present},
31 {Int: 3, Status: pgtype.Present},
32 {Int: 4, Status: pgtype.Present},
33 {Status: pgtype.Null},
34 {Int: 6, Status: pgtype.Present},
35 },
36 Dimensions: []pgtype.ArrayDimension{{Length: 3, LowerBound: 1}, {Length: 2, LowerBound: 1}},
37 Status: pgtype.Present,
38 },
39 &pgtype.Int2Array{
40 Elements: []pgtype.Int2{
41 {Int: 1, Status: pgtype.Present},
42 {Int: 2, Status: pgtype.Present},
43 {Int: 3, Status: pgtype.Present},
44 {Int: 4, Status: pgtype.Present},
45 },
46 Dimensions: []pgtype.ArrayDimension{
47 {Length: 2, LowerBound: 4},
48 {Length: 2, LowerBound: 2},
49 },
50 Status: pgtype.Present,
51 },
52 })
53 }
54
55 func TestInt2ArraySet(t *testing.T) {
56 successfulTests := []struct {
57 source interface{}
58 result pgtype.Int2Array
59 }{
60 {
61 source: []int64{1},
62 result: pgtype.Int2Array{
63 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
64 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
65 Status: pgtype.Present},
66 },
67 {
68 source: []int32{1},
69 result: pgtype.Int2Array{
70 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
71 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
72 Status: pgtype.Present},
73 },
74 {
75 source: []int16{1},
76 result: pgtype.Int2Array{
77 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
78 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
79 Status: pgtype.Present},
80 },
81 {
82 source: []int{1},
83 result: pgtype.Int2Array{
84 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
85 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
86 Status: pgtype.Present},
87 },
88 {
89 source: []uint64{1},
90 result: pgtype.Int2Array{
91 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
92 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
93 Status: pgtype.Present},
94 },
95 {
96 source: []uint32{1},
97 result: pgtype.Int2Array{
98 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
99 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
100 Status: pgtype.Present},
101 },
102 {
103 source: []uint16{1},
104 result: pgtype.Int2Array{
105 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
106 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
107 Status: pgtype.Present},
108 },
109 {
110 source: (([]int16)(nil)),
111 result: pgtype.Int2Array{Status: pgtype.Null},
112 },
113 {
114 source: [][]int16{{1}, {2}},
115 result: pgtype.Int2Array{
116 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
117 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
118 Status: pgtype.Present},
119 },
120 {
121 source: [][][][]int16{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
122 result: pgtype.Int2Array{
123 Elements: []pgtype.Int2{
124 {Int: 1, Status: pgtype.Present},
125 {Int: 2, Status: pgtype.Present},
126 {Int: 3, Status: pgtype.Present},
127 {Int: 4, Status: pgtype.Present},
128 {Int: 5, Status: pgtype.Present},
129 {Int: 6, Status: pgtype.Present}},
130 Dimensions: []pgtype.ArrayDimension{
131 {LowerBound: 1, Length: 2},
132 {LowerBound: 1, Length: 1},
133 {LowerBound: 1, Length: 1},
134 {LowerBound: 1, Length: 3}},
135 Status: pgtype.Present},
136 },
137 {
138 source: [2][1]int16{{1}, {2}},
139 result: pgtype.Int2Array{
140 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
141 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
142 Status: pgtype.Present},
143 },
144 {
145 source: [2][1][1][3]int16{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
146 result: pgtype.Int2Array{
147 Elements: []pgtype.Int2{
148 {Int: 1, Status: pgtype.Present},
149 {Int: 2, Status: pgtype.Present},
150 {Int: 3, Status: pgtype.Present},
151 {Int: 4, Status: pgtype.Present},
152 {Int: 5, Status: pgtype.Present},
153 {Int: 6, Status: pgtype.Present}},
154 Dimensions: []pgtype.ArrayDimension{
155 {LowerBound: 1, Length: 2},
156 {LowerBound: 1, Length: 1},
157 {LowerBound: 1, Length: 1},
158 {LowerBound: 1, Length: 3}},
159 Status: pgtype.Present},
160 },
161 }
162
163 for i, tt := range successfulTests {
164 var r pgtype.Int2Array
165 err := r.Set(tt.source)
166 if err != nil {
167 t.Errorf("%d: %v", i, err)
168 }
169
170 if !reflect.DeepEqual(r, tt.result) {
171 t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, r)
172 }
173 }
174 }
175
176 func TestInt2ArrayAssignTo(t *testing.T) {
177 var int16Slice []int16
178 var uint16Slice []uint16
179 var namedInt16Slice _int16Slice
180 var int16SliceDim2 [][]int16
181 var int16SliceDim4 [][][][]int16
182 var int16ArrayDim2 [2][1]int16
183 var int16ArrayDim4 [2][1][1][3]int16
184
185 simpleTests := []struct {
186 src pgtype.Int2Array
187 dst interface{}
188 expected interface{}
189 }{
190 {
191 src: pgtype.Int2Array{
192 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
193 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
194 Status: pgtype.Present,
195 },
196 dst: &int16Slice,
197 expected: []int16{1},
198 },
199 {
200 src: pgtype.Int2Array{
201 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
202 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
203 Status: pgtype.Present,
204 },
205 dst: &uint16Slice,
206 expected: []uint16{1},
207 },
208 {
209 src: pgtype.Int2Array{
210 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}},
211 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
212 Status: pgtype.Present,
213 },
214 dst: &namedInt16Slice,
215 expected: _int16Slice{1},
216 },
217 {
218 src: pgtype.Int2Array{Status: pgtype.Null},
219 dst: &int16Slice,
220 expected: (([]int16)(nil)),
221 },
222 {
223 src: pgtype.Int2Array{Status: pgtype.Present},
224 dst: &int16Slice,
225 expected: []int16{},
226 },
227 {
228 src: pgtype.Int2Array{
229 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
230 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
231 Status: pgtype.Present},
232 expected: [][]int16{{1}, {2}},
233 dst: &int16SliceDim2,
234 },
235 {
236 src: pgtype.Int2Array{
237 Elements: []pgtype.Int2{
238 {Int: 1, Status: pgtype.Present},
239 {Int: 2, Status: pgtype.Present},
240 {Int: 3, Status: pgtype.Present},
241 {Int: 4, Status: pgtype.Present},
242 {Int: 5, Status: pgtype.Present},
243 {Int: 6, Status: pgtype.Present}},
244 Dimensions: []pgtype.ArrayDimension{
245 {LowerBound: 1, Length: 2},
246 {LowerBound: 1, Length: 1},
247 {LowerBound: 1, Length: 1},
248 {LowerBound: 1, Length: 3}},
249 Status: pgtype.Present},
250 expected: [][][][]int16{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
251 dst: &int16SliceDim4,
252 },
253 {
254 src: pgtype.Int2Array{
255 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
256 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
257 Status: pgtype.Present},
258 expected: [2][1]int16{{1}, {2}},
259 dst: &int16ArrayDim2,
260 },
261 {
262 src: pgtype.Int2Array{
263 Elements: []pgtype.Int2{
264 {Int: 1, Status: pgtype.Present},
265 {Int: 2, Status: pgtype.Present},
266 {Int: 3, Status: pgtype.Present},
267 {Int: 4, Status: pgtype.Present},
268 {Int: 5, Status: pgtype.Present},
269 {Int: 6, Status: pgtype.Present}},
270 Dimensions: []pgtype.ArrayDimension{
271 {LowerBound: 1, Length: 2},
272 {LowerBound: 1, Length: 1},
273 {LowerBound: 1, Length: 1},
274 {LowerBound: 1, Length: 3}},
275 Status: pgtype.Present},
276 expected: [2][1][1][3]int16{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
277 dst: &int16ArrayDim4,
278 },
279 }
280
281 for i, tt := range simpleTests {
282 err := tt.src.AssignTo(tt.dst)
283 if err != nil {
284 t.Errorf("%d: %v", i, err)
285 }
286
287 if dst := reflect.ValueOf(tt.dst).Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) {
288 t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
289 }
290 }
291
292 errorTests := []struct {
293 src pgtype.Int2Array
294 dst interface{}
295 }{
296 {
297 src: pgtype.Int2Array{
298 Elements: []pgtype.Int2{{Status: pgtype.Null}},
299 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
300 Status: pgtype.Present,
301 },
302 dst: &int16Slice,
303 },
304 {
305 src: pgtype.Int2Array{
306 Elements: []pgtype.Int2{{Int: -1, Status: pgtype.Present}},
307 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
308 Status: pgtype.Present,
309 },
310 dst: &uint16Slice,
311 },
312 {
313 src: pgtype.Int2Array{
314 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
315 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
316 Status: pgtype.Present},
317 dst: &int16ArrayDim2,
318 },
319 {
320 src: pgtype.Int2Array{
321 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
322 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
323 Status: pgtype.Present},
324 dst: &int16Slice,
325 },
326 {
327 src: pgtype.Int2Array{
328 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
329 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
330 Status: pgtype.Present},
331 dst: &int16ArrayDim4,
332 },
333 }
334
335 for i, tt := range errorTests {
336 err := tt.src.AssignTo(tt.dst)
337 if err == nil {
338 t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
339 }
340 }
341
342 }
343
View as plain text