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 TestVarcharArrayTranscode(t *testing.T) {
12 testutil.TestSuccessfulTranscode(t, "varchar[]", []interface{}{
13 &pgtype.VarcharArray{
14 Elements: nil,
15 Dimensions: nil,
16 Status: pgtype.Present,
17 },
18 &pgtype.VarcharArray{
19 Elements: []pgtype.Varchar{
20 {String: "foo", Status: pgtype.Present},
21 {Status: pgtype.Null},
22 },
23 Dimensions: []pgtype.ArrayDimension{{Length: 2, LowerBound: 1}},
24 Status: pgtype.Present,
25 },
26 &pgtype.VarcharArray{Status: pgtype.Null},
27 &pgtype.VarcharArray{
28 Elements: []pgtype.Varchar{
29 {String: "bar ", Status: pgtype.Present},
30 {String: "NuLL", Status: pgtype.Present},
31 {String: `wow"quz\`, Status: pgtype.Present},
32 {String: "", Status: pgtype.Present},
33 {Status: pgtype.Null},
34 {String: "null", Status: pgtype.Present},
35 },
36 Dimensions: []pgtype.ArrayDimension{{Length: 3, LowerBound: 1}, {Length: 2, LowerBound: 1}},
37 Status: pgtype.Present,
38 },
39 &pgtype.VarcharArray{
40 Elements: []pgtype.Varchar{
41 {String: "bar", Status: pgtype.Present},
42 {String: "baz", Status: pgtype.Present},
43 {String: "quz", Status: pgtype.Present},
44 {String: "foo", 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 TestVarcharArraySet(t *testing.T) {
56 successfulTests := []struct {
57 source interface{}
58 result pgtype.VarcharArray
59 }{
60 {
61 source: []string{"foo"},
62 result: pgtype.VarcharArray{
63 Elements: []pgtype.Varchar{{String: "foo", Status: pgtype.Present}},
64 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
65 Status: pgtype.Present},
66 },
67 {
68 source: (([]string)(nil)),
69 result: pgtype.VarcharArray{Status: pgtype.Null},
70 },
71 {
72 source: [][]string{{"foo"}, {"bar"}},
73 result: pgtype.VarcharArray{
74 Elements: []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
75 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
76 Status: pgtype.Present},
77 },
78 {
79 source: [][][][]string{{{{"foo", "bar", "baz"}}}, {{{"wibble", "wobble", "wubble"}}}},
80 result: pgtype.VarcharArray{
81 Elements: []pgtype.Varchar{
82 {String: "foo", Status: pgtype.Present},
83 {String: "bar", Status: pgtype.Present},
84 {String: "baz", Status: pgtype.Present},
85 {String: "wibble", Status: pgtype.Present},
86 {String: "wobble", Status: pgtype.Present},
87 {String: "wubble", Status: pgtype.Present}},
88 Dimensions: []pgtype.ArrayDimension{
89 {LowerBound: 1, Length: 2},
90 {LowerBound: 1, Length: 1},
91 {LowerBound: 1, Length: 1},
92 {LowerBound: 1, Length: 3}},
93 Status: pgtype.Present},
94 },
95 {
96 source: [2][1]string{{"foo"}, {"bar"}},
97 result: pgtype.VarcharArray{
98 Elements: []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
99 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
100 Status: pgtype.Present},
101 },
102 {
103 source: [2][1][1][3]string{{{{"foo", "bar", "baz"}}}, {{{"wibble", "wobble", "wubble"}}}},
104 result: pgtype.VarcharArray{
105 Elements: []pgtype.Varchar{
106 {String: "foo", Status: pgtype.Present},
107 {String: "bar", Status: pgtype.Present},
108 {String: "baz", Status: pgtype.Present},
109 {String: "wibble", Status: pgtype.Present},
110 {String: "wobble", Status: pgtype.Present},
111 {String: "wubble", Status: pgtype.Present}},
112 Dimensions: []pgtype.ArrayDimension{
113 {LowerBound: 1, Length: 2},
114 {LowerBound: 1, Length: 1},
115 {LowerBound: 1, Length: 1},
116 {LowerBound: 1, Length: 3}},
117 Status: pgtype.Present},
118 },
119 }
120
121 for i, tt := range successfulTests {
122 var r pgtype.VarcharArray
123 err := r.Set(tt.source)
124 if err != nil {
125 t.Errorf("%d: %v", i, err)
126 }
127
128 if !reflect.DeepEqual(r, tt.result) {
129 t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, r)
130 }
131 }
132 }
133
134 func TestVarcharArrayAssignTo(t *testing.T) {
135 var stringSlice []string
136 type _stringSlice []string
137 var namedStringSlice _stringSlice
138 var stringSliceDim2 [][]string
139 var stringSliceDim4 [][][][]string
140 var stringArrayDim2 [2][1]string
141 var stringArrayDim4 [2][1][1][3]string
142
143 simpleTests := []struct {
144 src pgtype.VarcharArray
145 dst interface{}
146 expected interface{}
147 }{
148 {
149 src: pgtype.VarcharArray{
150 Elements: []pgtype.Varchar{{String: "foo", Status: pgtype.Present}},
151 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
152 Status: pgtype.Present,
153 },
154 dst: &stringSlice,
155 expected: []string{"foo"},
156 },
157 {
158 src: pgtype.VarcharArray{
159 Elements: []pgtype.Varchar{{String: "bar", Status: pgtype.Present}},
160 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
161 Status: pgtype.Present,
162 },
163 dst: &namedStringSlice,
164 expected: _stringSlice{"bar"},
165 },
166 {
167 src: pgtype.VarcharArray{Status: pgtype.Null},
168 dst: &stringSlice,
169 expected: (([]string)(nil)),
170 },
171 {
172 src: pgtype.VarcharArray{Status: pgtype.Present},
173 dst: &stringSlice,
174 expected: []string{},
175 },
176 {
177 src: pgtype.VarcharArray{
178 Elements: []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
179 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
180 Status: pgtype.Present},
181 dst: &stringSliceDim2,
182 expected: [][]string{{"foo"}, {"bar"}},
183 },
184 {
185 src: pgtype.VarcharArray{
186 Elements: []pgtype.Varchar{
187 {String: "foo", Status: pgtype.Present},
188 {String: "bar", Status: pgtype.Present},
189 {String: "baz", Status: pgtype.Present},
190 {String: "wibble", Status: pgtype.Present},
191 {String: "wobble", Status: pgtype.Present},
192 {String: "wubble", Status: pgtype.Present}},
193 Dimensions: []pgtype.ArrayDimension{
194 {LowerBound: 1, Length: 2},
195 {LowerBound: 1, Length: 1},
196 {LowerBound: 1, Length: 1},
197 {LowerBound: 1, Length: 3}},
198 Status: pgtype.Present},
199 dst: &stringSliceDim4,
200 expected: [][][][]string{{{{"foo", "bar", "baz"}}}, {{{"wibble", "wobble", "wubble"}}}},
201 },
202 {
203 src: pgtype.VarcharArray{
204 Elements: []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
205 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
206 Status: pgtype.Present},
207 dst: &stringArrayDim2,
208 expected: [2][1]string{{"foo"}, {"bar"}},
209 },
210 {
211 src: pgtype.VarcharArray{
212 Elements: []pgtype.Varchar{
213 {String: "foo", Status: pgtype.Present},
214 {String: "bar", Status: pgtype.Present},
215 {String: "baz", Status: pgtype.Present},
216 {String: "wibble", Status: pgtype.Present},
217 {String: "wobble", Status: pgtype.Present},
218 {String: "wubble", Status: pgtype.Present}},
219 Dimensions: []pgtype.ArrayDimension{
220 {LowerBound: 1, Length: 2},
221 {LowerBound: 1, Length: 1},
222 {LowerBound: 1, Length: 1},
223 {LowerBound: 1, Length: 3}},
224 Status: pgtype.Present},
225 dst: &stringArrayDim4,
226 expected: [2][1][1][3]string{{{{"foo", "bar", "baz"}}}, {{{"wibble", "wobble", "wubble"}}}},
227 },
228 }
229
230 for i, tt := range simpleTests {
231 err := tt.src.AssignTo(tt.dst)
232 if err != nil {
233 t.Errorf("%d: %v", i, err)
234 }
235
236 if dst := reflect.ValueOf(tt.dst).Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) {
237 t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
238 }
239 }
240
241 errorTests := []struct {
242 src pgtype.VarcharArray
243 dst interface{}
244 }{
245 {
246 src: pgtype.VarcharArray{
247 Elements: []pgtype.Varchar{{Status: pgtype.Null}},
248 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
249 Status: pgtype.Present,
250 },
251 dst: &stringSlice,
252 },
253 {
254 src: pgtype.VarcharArray{
255 Elements: []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
256 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
257 Status: pgtype.Present},
258 dst: &stringArrayDim2,
259 },
260 {
261 src: pgtype.VarcharArray{
262 Elements: []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
263 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
264 Status: pgtype.Present},
265 dst: &stringSlice,
266 },
267 {
268 src: pgtype.VarcharArray{
269 Elements: []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
270 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
271 Status: pgtype.Present},
272 dst: &stringArrayDim4,
273 },
274 }
275
276 for i, tt := range errorTests {
277 err := tt.src.AssignTo(tt.dst)
278 if err == nil {
279 t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
280 }
281 }
282 }
283
View as plain text