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 TestFloat8ArrayTranscode(t *testing.T) {
12 testutil.TestSuccessfulTranscode(t, "float8[]", []interface{}{
13 &pgtype.Float8Array{
14 Elements: nil,
15 Dimensions: nil,
16 Status: pgtype.Present,
17 },
18 &pgtype.Float8Array{
19 Elements: []pgtype.Float8{
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.Float8Array{Status: pgtype.Null},
27 &pgtype.Float8Array{
28 Elements: []pgtype.Float8{
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.Float8Array{
40 Elements: []pgtype.Float8{
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 TestFloat8ArraySet(t *testing.T) {
56 successfulTests := []struct {
57 source interface{}
58 result pgtype.Float8Array
59 }{
60 {
61 source: []float64{1},
62 result: pgtype.Float8Array{
63 Elements: []pgtype.Float8{{Float: 1, Status: pgtype.Present}},
64 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
65 Status: pgtype.Present},
66 },
67 {
68 source: (([]float64)(nil)),
69 result: pgtype.Float8Array{Status: pgtype.Null},
70 },
71 {
72 source: [][]float64{{1}, {2}},
73 result: pgtype.Float8Array{
74 Elements: []pgtype.Float8{{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: [][][][]float64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
80 result: pgtype.Float8Array{
81 Elements: []pgtype.Float8{
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
97 for i, tt := range successfulTests {
98 var r pgtype.Float8Array
99 err := r.Set(tt.source)
100 if err != nil {
101 t.Errorf("%d: %v", i, err)
102 }
103
104 if !reflect.DeepEqual(r, tt.result) {
105 t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, r)
106 }
107 }
108 }
109
110 func TestFloat8ArrayAssignTo(t *testing.T) {
111 var float64Slice []float64
112 var namedFloat64Slice _float64Slice
113 var float64SliceDim2 [][]float64
114 var float64SliceDim4 [][][][]float64
115 var float64ArrayDim2 [2][1]float64
116 var float64ArrayDim4 [2][1][1][3]float64
117
118 simpleTests := []struct {
119 src pgtype.Float8Array
120 dst interface{}
121 expected interface{}
122 }{
123 {
124 src: pgtype.Float8Array{
125 Elements: []pgtype.Float8{{Float: 1.23, Status: pgtype.Present}},
126 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
127 Status: pgtype.Present,
128 },
129 dst: &float64Slice,
130 expected: []float64{1.23},
131 },
132 {
133 src: pgtype.Float8Array{
134 Elements: []pgtype.Float8{{Float: 1.23, Status: pgtype.Present}},
135 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
136 Status: pgtype.Present,
137 },
138 dst: &namedFloat64Slice,
139 expected: _float64Slice{1.23},
140 },
141 {
142 src: pgtype.Float8Array{Status: pgtype.Null},
143 dst: &float64Slice,
144 expected: (([]float64)(nil)),
145 },
146 {
147 src: pgtype.Float8Array{Status: pgtype.Present},
148 dst: &float64Slice,
149 expected: []float64{},
150 },
151 {
152 src: pgtype.Float8Array{
153 Elements: []pgtype.Float8{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
154 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
155 Status: pgtype.Present},
156 expected: [][]float64{{1}, {2}},
157 dst: &float64SliceDim2,
158 },
159 {
160 src: pgtype.Float8Array{
161 Elements: []pgtype.Float8{
162 {Float: 1, Status: pgtype.Present},
163 {Float: 2, Status: pgtype.Present},
164 {Float: 3, Status: pgtype.Present},
165 {Float: 4, Status: pgtype.Present},
166 {Float: 5, Status: pgtype.Present},
167 {Float: 6, Status: pgtype.Present}},
168 Dimensions: []pgtype.ArrayDimension{
169 {LowerBound: 1, Length: 2},
170 {LowerBound: 1, Length: 1},
171 {LowerBound: 1, Length: 1},
172 {LowerBound: 1, Length: 3}},
173 Status: pgtype.Present},
174 expected: [][][][]float64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
175 dst: &float64SliceDim4,
176 },
177 {
178 src: pgtype.Float8Array{
179 Elements: []pgtype.Float8{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
180 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
181 Status: pgtype.Present},
182 expected: [2][1]float64{{1}, {2}},
183 dst: &float64ArrayDim2,
184 },
185 {
186 src: pgtype.Float8Array{
187 Elements: []pgtype.Float8{
188 {Float: 1, Status: pgtype.Present},
189 {Float: 2, Status: pgtype.Present},
190 {Float: 3, Status: pgtype.Present},
191 {Float: 4, Status: pgtype.Present},
192 {Float: 5, Status: pgtype.Present},
193 {Float: 6, Status: pgtype.Present}},
194 Dimensions: []pgtype.ArrayDimension{
195 {LowerBound: 1, Length: 2},
196 {LowerBound: 1, Length: 1},
197 {LowerBound: 1, Length: 1},
198 {LowerBound: 1, Length: 3}},
199 Status: pgtype.Present},
200 expected: [2][1][1][3]float64{{{{1, 2, 3}}}, {{{4, 5, 6}}}},
201 dst: &float64ArrayDim4,
202 },
203 }
204
205 for i, tt := range simpleTests {
206 err := tt.src.AssignTo(tt.dst)
207 if err != nil {
208 t.Errorf("%d: %v", i, err)
209 }
210
211 if dst := reflect.ValueOf(tt.dst).Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) {
212 t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
213 }
214 }
215
216 errorTests := []struct {
217 src pgtype.Float8Array
218 dst interface{}
219 }{
220 {
221 src: pgtype.Float8Array{
222 Elements: []pgtype.Float8{{Status: pgtype.Null}},
223 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
224 Status: pgtype.Present,
225 },
226 dst: &float64Slice,
227 },
228 {
229 src: pgtype.Float8Array{
230 Elements: []pgtype.Float8{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
231 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
232 Status: pgtype.Present},
233 dst: &float64ArrayDim2,
234 },
235 {
236 src: pgtype.Float8Array{
237 Elements: []pgtype.Float8{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
238 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}, {LowerBound: 1, Length: 2}},
239 Status: pgtype.Present},
240 dst: &float64Slice,
241 },
242 {
243 src: pgtype.Float8Array{
244 Elements: []pgtype.Float8{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
245 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 2}, {LowerBound: 1, Length: 1}},
246 Status: pgtype.Present},
247 dst: &float64ArrayDim4,
248 },
249 }
250
251 for i, tt := range errorTests {
252 err := tt.src.AssignTo(tt.dst)
253 if err == nil {
254 t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
255 }
256 }
257
258 }
259
View as plain text