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 TestInt8ArrayTranscode(t *testing.T) {
12 testutil.TestSuccessfulTranscode(t, "int8[]", []interface{}{
13 &pgtype.Int8Array{
14 Elements: nil,
15 Dimensions: nil,
16 Status: pgtype.Present,
17 },
18 &pgtype.Int8Array{
19 Elements: []pgtype.Int8{
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.Int8Array{Status: pgtype.Null},
27 &pgtype.Int8Array{
28 Elements: []pgtype.Int8{
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.Int8Array{
40 Elements: []pgtype.Int8{
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 TestInt8ArraySet(t *testing.T) {
56 successfulTests := []struct {
57 source interface{}
58 result pgtype.Int8Array
59 }{
60 {
61 source: []int64{1},
62 result: pgtype.Int8Array{
63 Elements: []pgtype.Int8{{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.Int8Array{
70 Elements: []pgtype.Int8{{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.Int8Array{
77 Elements: []pgtype.Int8{{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.Int8Array{
84 Elements: []pgtype.Int8{{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.Int8Array{
91 Elements: []pgtype.Int8{{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.Int8Array{
98 Elements: []pgtype.Int8{{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.Int8Array{
105 Elements: []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
106 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
107 Status: pgtype.Present},
108 },
109 {
110 source: []uint{1},
111 result: pgtype.Int8Array{
112 Elements: []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
113 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
114 Status: pgtype.Present},
115 },
116 {
117 source: (([]int64)(nil)),
118 result: pgtype.Int8Array{Status: pgtype.Null},
119 },
120 {
121 source: [][]int64{{1}, {2}},
122 result: pgtype.Int8Array{
123 Elements: []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
124 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
125 Status: pgtype.Present},
126 },
127 {
128 source: [][][][]int64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
129 result: pgtype.Int8Array{
130 Elements: []pgtype.Int8{
131 {Int: 1, Status: pgtype.Present},
132 {Int: 2, Status: pgtype.Present},
133 {Int: 3, Status: pgtype.Present},
134 {Int: 4, Status: pgtype.Present},
135 {Int: 5, Status: pgtype.Present},
136 {Int: 6, Status: pgtype.Present}},
137 Dimensions: []pgtype.ArrayDimension{
138 {LowerBound: 1, Length: 2},
139 {LowerBound: 1, Length: 1},
140 {LowerBound: 1, Length: 1},
141 {LowerBound: 1, Length: 3}},
142 Status: pgtype.Present},
143 },
144 {
145 source: [2][1]int64{{1}, {2}},
146 result: pgtype.Int8Array{
147 Elements: []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
148 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
149 Status: pgtype.Present},
150 },
151 {
152 source: [2][1][1][3]int64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
153 result: pgtype.Int8Array{
154 Elements: []pgtype.Int8{
155 {Int: 1, Status: pgtype.Present},
156 {Int: 2, Status: pgtype.Present},
157 {Int: 3, Status: pgtype.Present},
158 {Int: 4, Status: pgtype.Present},
159 {Int: 5, Status: pgtype.Present},
160 {Int: 6, Status: pgtype.Present}},
161 Dimensions: []pgtype.ArrayDimension{
162 {LowerBound: 1, Length: 2},
163 {LowerBound: 1, Length: 1},
164 {LowerBound: 1, Length: 1},
165 {LowerBound: 1, Length: 3}},
166 Status: pgtype.Present},
167 },
168 }
169
170 for i, tt := range successfulTests {
171 var r pgtype.Int8Array
172 err := r.Set(tt.source)
173 if err != nil {
174 t.Errorf("%d: %v", i, err)
175 }
176
177 if !reflect.DeepEqual(r, tt.result) {
178 t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, r)
179 }
180 }
181 }
182
183 func TestInt8ArrayAssignTo(t *testing.T) {
184 var int64Slice []int64
185 var uint64Slice []uint64
186 var namedInt64Slice _int64Slice
187 var int64SliceDim2 [][]int64
188 var int64SliceDim4 [][][][]int64
189 var int64ArrayDim2 [2][1]int64
190 var int64ArrayDim4 [2][1][1][3]int64
191
192 simpleTests := []struct {
193 src pgtype.Int8Array
194 dst interface{}
195 expected interface{}
196 }{
197 {
198 src: pgtype.Int8Array{
199 Elements: []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
200 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
201 Status: pgtype.Present,
202 },
203 dst: &int64Slice,
204 expected: []int64{1},
205 },
206 {
207 src: pgtype.Int8Array{
208 Elements: []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
209 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
210 Status: pgtype.Present,
211 },
212 dst: &uint64Slice,
213 expected: []uint64{1},
214 },
215 {
216 src: pgtype.Int8Array{
217 Elements: []pgtype.Int8{{Int: 1, Status: pgtype.Present}},
218 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
219 Status: pgtype.Present,
220 },
221 dst: &namedInt64Slice,
222 expected: _int64Slice{1},
223 },
224 {
225 src: pgtype.Int8Array{Status: pgtype.Null},
226 dst: &int64Slice,
227 expected: (([]int64)(nil)),
228 },
229 {
230 src: pgtype.Int8Array{Status: pgtype.Present},
231 dst: &int64Slice,
232 expected: []int64{},
233 },
234 {
235 src: pgtype.Int8Array{
236 Elements: []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
237 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
238 Status: pgtype.Present},
239 expected: [][]int64{{1}, {2}},
240 dst: &int64SliceDim2,
241 },
242 {
243 src: pgtype.Int8Array{
244 Elements: []pgtype.Int8{
245 {Int: 1, Status: pgtype.Present},
246 {Int: 2, Status: pgtype.Present},
247 {Int: 3, Status: pgtype.Present},
248 {Int: 4, Status: pgtype.Present},
249 {Int: 5, Status: pgtype.Present},
250 {Int: 6, Status: pgtype.Present}},
251 Dimensions: []pgtype.ArrayDimension{
252 {LowerBound: 1, Length: 2},
253 {LowerBound: 1, Length: 1},
254 {LowerBound: 1, Length: 1},
255 {LowerBound: 1, Length: 3}},
256 Status: pgtype.Present},
257 expected: [][][][]int64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
258 dst: &int64SliceDim4,
259 },
260 {
261 src: pgtype.Int8Array{
262 Elements: []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
263 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
264 Status: pgtype.Present},
265 expected: [2][1]int64{{1}, {2}},
266 dst: &int64ArrayDim2,
267 },
268 {
269 src: pgtype.Int8Array{
270 Elements: []pgtype.Int8{
271 {Int: 1, Status: pgtype.Present},
272 {Int: 2, Status: pgtype.Present},
273 {Int: 3, Status: pgtype.Present},
274 {Int: 4, Status: pgtype.Present},
275 {Int: 5, Status: pgtype.Present},
276 {Int: 6, Status: pgtype.Present}},
277 Dimensions: []pgtype.ArrayDimension{
278 {LowerBound: 1, Length: 2},
279 {LowerBound: 1, Length: 1},
280 {LowerBound: 1, Length: 1},
281 {LowerBound: 1, Length: 3}},
282 Status: pgtype.Present},
283 expected: [2][1][1][3]int64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
284 dst: &int64ArrayDim4,
285 },
286 }
287
288 for i, tt := range simpleTests {
289 err := tt.src.AssignTo(tt.dst)
290 if err != nil {
291 t.Errorf("%d: %v", i, err)
292 }
293
294 if dst := reflect.ValueOf(tt.dst).Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) {
295 t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
296 }
297 }
298
299 errorTests := []struct {
300 src pgtype.Int8Array
301 dst interface{}
302 }{
303 {
304 src: pgtype.Int8Array{
305 Elements: []pgtype.Int8{{Status: pgtype.Null}},
306 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
307 Status: pgtype.Present,
308 },
309 dst: &int64Slice,
310 },
311 {
312 src: pgtype.Int8Array{
313 Elements: []pgtype.Int8{{Int: -1, Status: pgtype.Present}},
314 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
315 Status: pgtype.Present,
316 },
317 dst: &uint64Slice,
318 },
319 {
320 src: pgtype.Int8Array{
321 Elements: []pgtype.Int8{{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: &int64ArrayDim2,
325 },
326 {
327 src: pgtype.Int8Array{
328 Elements: []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
329 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
330 Status: pgtype.Present},
331 dst: &int64Slice,
332 },
333 {
334 src: pgtype.Int8Array{
335 Elements: []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
336 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
337 Status: pgtype.Present},
338 dst: &int64ArrayDim4,
339 },
340 }
341
342 for i, tt := range errorTests {
343 err := tt.src.AssignTo(tt.dst)
344 if err == nil {
345 t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
346 }
347 }
348
349 }
350
View as plain text