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 TestFloat4ArrayTranscode(t *testing.T) {
12 testutil.TestSuccessfulTranscode(t, "float4[]", []interface{}{
13 &pgtype.Float4Array{
14 Elements: nil,
15 Dimensions: nil,
16 Status: pgtype.Present,
17 },
18 &pgtype.Float4Array{
19 Elements: []pgtype.Float4{
20 {Float: 1, Status: pgtype.Present},
21 {Status: pgtype.Null},
22 },
23 Dimensions: []pgtype.ArrayDimension{{Length: 2, LowerBound: 1}},
24 Status: pgtype.Present,
25 },
26 &pgtype.Float4Array{Status: pgtype.Null},
27 &pgtype.Float4Array{
28 Elements: []pgtype.Float4{
29 {Float: 1, Status: pgtype.Present},
30 {Float: 2, Status: pgtype.Present},
31 {Float: 3, Status: pgtype.Present},
32 {Float: 4, Status: pgtype.Present},
33 {Status: pgtype.Null},
34 {Float: 6, Status: pgtype.Present},
35 },
36 Dimensions: []pgtype.ArrayDimension{{Length: 3, LowerBound: 1}, {Length: 2, LowerBound: 1}},
37 Status: pgtype.Present,
38 },
39 &pgtype.Float4Array{
40 Elements: []pgtype.Float4{
41 {Float: 1, Status: pgtype.Present},
42 {Float: 2, Status: pgtype.Present},
43 {Float: 3, Status: pgtype.Present},
44 {Float: 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 TestFloat4ArraySet(t *testing.T) {
56 successfulTests := []struct {
57 source interface{}
58 result pgtype.Float4Array
59 }{
60 {
61 source: []float32{1},
62 result: pgtype.Float4Array{
63 Elements: []pgtype.Float4{{Float: 1, Status: pgtype.Present}},
64 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
65 Status: pgtype.Present},
66 },
67 {
68 source: (([]float32)(nil)),
69 result: pgtype.Float4Array{Status: pgtype.Null},
70 },
71 {
72 source: [][]float32{{1}, {2}},
73 result: pgtype.Float4Array{
74 Elements: []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
75 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
76 Status: pgtype.Present},
77 },
78 {
79 source: [][][][]float32{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
80 result: pgtype.Float4Array{
81 Elements: []pgtype.Float4{
82 {Float: 1, Status: pgtype.Present},
83 {Float: 2, Status: pgtype.Present},
84 {Float: 3, Status: pgtype.Present},
85 {Float: 4, Status: pgtype.Present},
86 {Float: 5, Status: pgtype.Present},
87 {Float: 6, 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]float32{{1}, {2}},
97 result: pgtype.Float4Array{
98 Elements: []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, 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]float32{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
104 result: pgtype.Float4Array{
105 Elements: []pgtype.Float4{
106 {Float: 1, Status: pgtype.Present},
107 {Float: 2, Status: pgtype.Present},
108 {Float: 3, Status: pgtype.Present},
109 {Float: 4, Status: pgtype.Present},
110 {Float: 5, Status: pgtype.Present},
111 {Float: 6, 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.Float4Array
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 TestFloat4ArrayAssignTo(t *testing.T) {
135 var float32Slice []float32
136 var namedFloat32Slice _float32Slice
137 var float32SliceDim2 [][]float32
138 var float32SliceDim4 [][][][]float32
139 var float32ArrayDim2 [2][1]float32
140 var float32ArrayDim4 [2][1][1][3]float32
141
142 simpleTests := []struct {
143 src pgtype.Float4Array
144 dst interface{}
145 expected interface{}
146 }{
147 {
148 src: pgtype.Float4Array{
149 Elements: []pgtype.Float4{{Float: 1.23, Status: pgtype.Present}},
150 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
151 Status: pgtype.Present,
152 },
153 dst: &float32Slice,
154 expected: []float32{1.23},
155 },
156 {
157 src: pgtype.Float4Array{
158 Elements: []pgtype.Float4{{Float: 1.23, Status: pgtype.Present}},
159 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
160 Status: pgtype.Present,
161 },
162 dst: &namedFloat32Slice,
163 expected: _float32Slice{1.23},
164 },
165 {
166 src: pgtype.Float4Array{Status: pgtype.Null},
167 dst: &float32Slice,
168 expected: (([]float32)(nil)),
169 },
170 {
171 src: pgtype.Float4Array{Status: pgtype.Present},
172 dst: &float32Slice,
173 expected: []float32{},
174 },
175 {
176 src: pgtype.Float4Array{
177 Elements: []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
178 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
179 Status: pgtype.Present},
180 expected: [][]float32{{1}, {2}},
181 dst: &float32SliceDim2,
182 },
183 {
184 src: pgtype.Float4Array{
185 Elements: []pgtype.Float4{
186 {Float: 1, Status: pgtype.Present},
187 {Float: 2, Status: pgtype.Present},
188 {Float: 3, Status: pgtype.Present},
189 {Float: 4, Status: pgtype.Present},
190 {Float: 5, Status: pgtype.Present},
191 {Float: 6, Status: pgtype.Present}},
192 Dimensions: []pgtype.ArrayDimension{
193 {LowerBound: 1, Length: 2},
194 {LowerBound: 1, Length: 1},
195 {LowerBound: 1, Length: 1},
196 {LowerBound: 1, Length: 3}},
197 Status: pgtype.Present},
198 expected: [][][][]float32{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
199 dst: &float32SliceDim4,
200 },
201 {
202 src: pgtype.Float4Array{
203 Elements: []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
204 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
205 Status: pgtype.Present},
206 expected: [2][1]float32{{1}, {2}},
207 dst: &float32ArrayDim2,
208 },
209 {
210 src: pgtype.Float4Array{
211 Elements: []pgtype.Float4{
212 {Float: 1, Status: pgtype.Present},
213 {Float: 2, Status: pgtype.Present},
214 {Float: 3, Status: pgtype.Present},
215 {Float: 4, Status: pgtype.Present},
216 {Float: 5, Status: pgtype.Present},
217 {Float: 6, Status: pgtype.Present}},
218 Dimensions: []pgtype.ArrayDimension{
219 {LowerBound: 1, Length: 2},
220 {LowerBound: 1, Length: 1},
221 {LowerBound: 1, Length: 1},
222 {LowerBound: 1, Length: 3}},
223 Status: pgtype.Present},
224 expected: [2][1][1][3]float32{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
225 dst: &float32ArrayDim4,
226 },
227 }
228
229 for i, tt := range simpleTests {
230 err := tt.src.AssignTo(tt.dst)
231 if err != nil {
232 t.Errorf("%d: %v", i, err)
233 }
234
235 if dst := reflect.ValueOf(tt.dst).Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) {
236 t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
237 }
238 }
239
240 errorTests := []struct {
241 src pgtype.Float4Array
242 dst interface{}
243 }{
244 {
245 src: pgtype.Float4Array{
246 Elements: []pgtype.Float4{{Status: pgtype.Null}},
247 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
248 Status: pgtype.Present,
249 },
250 dst: &float32Slice,
251 },
252 {
253 src: pgtype.Float4Array{
254 Elements: []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
255 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
256 Status: pgtype.Present},
257 dst: &float32ArrayDim2,
258 },
259 {
260 src: pgtype.Float4Array{
261 Elements: []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
262 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
263 Status: pgtype.Present},
264 dst: &float32Slice,
265 },
266 {
267 src: pgtype.Float4Array{
268 Elements: []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
269 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
270 Status: pgtype.Present},
271 dst: &float32ArrayDim4,
272 },
273 }
274
275 for i, tt := range errorTests {
276 err := tt.src.AssignTo(tt.dst)
277 if err == nil {
278 t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
279 }
280 }
281
282 }
283
View as plain text