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 TestFloat4Transcode(t *testing.T) {
12 testutil.TestSuccessfulTranscode(t, "float4", []interface{}{
13 &pgtype.Float4{Float: -1, Status: pgtype.Present},
14 &pgtype.Float4{Float: 0, Status: pgtype.Present},
15 &pgtype.Float4{Float: 0.00001, Status: pgtype.Present},
16 &pgtype.Float4{Float: 1, Status: pgtype.Present},
17 &pgtype.Float4{Float: 9999.99, Status: pgtype.Present},
18 &pgtype.Float4{Float: 0, Status: pgtype.Null},
19 })
20 }
21
22 func TestFloat4Set(t *testing.T) {
23 successfulTests := []struct {
24 source interface{}
25 result pgtype.Float4
26 }{
27 {source: float32(1), result: pgtype.Float4{Float: 1, Status: pgtype.Present}},
28 {source: float64(1), result: pgtype.Float4{Float: 1, Status: pgtype.Present}},
29 {source: int8(1), result: pgtype.Float4{Float: 1, Status: pgtype.Present}},
30 {source: int16(1), result: pgtype.Float4{Float: 1, Status: pgtype.Present}},
31 {source: int32(1), result: pgtype.Float4{Float: 1, Status: pgtype.Present}},
32 {source: int64(1), result: pgtype.Float4{Float: 1, Status: pgtype.Present}},
33 {source: int8(-1), result: pgtype.Float4{Float: -1, Status: pgtype.Present}},
34 {source: int16(-1), result: pgtype.Float4{Float: -1, Status: pgtype.Present}},
35 {source: int32(-1), result: pgtype.Float4{Float: -1, Status: pgtype.Present}},
36 {source: int64(-1), result: pgtype.Float4{Float: -1, Status: pgtype.Present}},
37 {source: uint8(1), result: pgtype.Float4{Float: 1, Status: pgtype.Present}},
38 {source: uint16(1), result: pgtype.Float4{Float: 1, Status: pgtype.Present}},
39 {source: uint32(1), result: pgtype.Float4{Float: 1, Status: pgtype.Present}},
40 {source: uint64(1), result: pgtype.Float4{Float: 1, Status: pgtype.Present}},
41 {source: "1", result: pgtype.Float4{Float: 1, Status: pgtype.Present}},
42 {source: _int8(1), result: pgtype.Float4{Float: 1, Status: pgtype.Present}},
43 }
44
45 for i, tt := range successfulTests {
46 var r pgtype.Float4
47 err := r.Set(tt.source)
48 if err != nil {
49 t.Errorf("%d: %v", i, err)
50 }
51
52 if r != tt.result {
53 t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, r)
54 }
55 }
56 }
57
58 func TestFloat4AssignTo(t *testing.T) {
59 type aliasf32 float32
60 type aliasf64 float64
61
62 var i8 int8
63 var i16 int16
64 var i32 int32
65 var i64 int64
66 var i int
67 var ui8 uint8
68 var ui16 uint16
69 var ui32 uint32
70 var ui64 uint64
71 var ui uint
72 var pi8 *int8
73 var _i8 _int8
74 var _pi8 *_int8
75 var f32 float32
76 var f64 float64
77 var pf32 *float32
78 var pf64 *float64
79 var a32 aliasf32
80 var a64 aliasf64
81
82 simpleTests := []struct {
83 src pgtype.Float4
84 dst interface{}
85 expected interface{}
86 }{
87 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &f32, expected: float32(42)},
88 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &f64, expected: float64(42)},
89 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &i16, expected: int16(42)},
90 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &i32, expected: int32(42)},
91 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &i64, expected: int64(42)},
92 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &i, expected: int(42)},
93 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &ui8, expected: uint8(42)},
94 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &ui16, expected: uint16(42)},
95 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &ui32, expected: uint32(42)},
96 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &ui64, expected: uint64(42)},
97 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &ui, expected: uint(42)},
98 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &_i8, expected: _int8(42)},
99 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &a32, expected: aliasf32(42)},
100 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &a64, expected: aliasf64(42)},
101 {src: pgtype.Float4{Float: 0, Status: pgtype.Null}, dst: &pi8, expected: ((*int8)(nil))},
102 {src: pgtype.Float4{Float: 0, Status: pgtype.Null}, dst: &_pi8, expected: ((*_int8)(nil))},
103 }
104
105 for i, tt := range simpleTests {
106 err := tt.src.AssignTo(tt.dst)
107 if err != nil {
108 t.Errorf("%d: %v", i, err)
109 }
110
111 if dst := reflect.ValueOf(tt.dst).Elem().Interface(); dst != tt.expected {
112 t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
113 }
114 }
115
116 pointerAllocTests := []struct {
117 src pgtype.Float4
118 dst interface{}
119 expected interface{}
120 }{
121 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &pf32, expected: float32(42)},
122 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &pf64, expected: float64(42)},
123 }
124
125 for i, tt := range pointerAllocTests {
126 err := tt.src.AssignTo(tt.dst)
127 if err != nil {
128 t.Errorf("%d: %v", i, err)
129 }
130
131 if dst := reflect.ValueOf(tt.dst).Elem().Elem().Interface(); dst != tt.expected {
132 t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
133 }
134 }
135
136 errorTests := []struct {
137 src pgtype.Float4
138 dst interface{}
139 }{
140 {src: pgtype.Float4{Float: 150, Status: pgtype.Present}, dst: &i8},
141 {src: pgtype.Float4{Float: 40000, Status: pgtype.Present}, dst: &i16},
142 {src: pgtype.Float4{Float: -1, Status: pgtype.Present}, dst: &ui8},
143 {src: pgtype.Float4{Float: -1, Status: pgtype.Present}, dst: &ui16},
144 {src: pgtype.Float4{Float: -1, Status: pgtype.Present}, dst: &ui32},
145 {src: pgtype.Float4{Float: -1, Status: pgtype.Present}, dst: &ui64},
146 {src: pgtype.Float4{Float: -1, Status: pgtype.Present}, dst: &ui},
147 {src: pgtype.Float4{Float: 0, Status: pgtype.Null}, dst: &i32},
148 }
149
150 for i, tt := range errorTests {
151 err := tt.src.AssignTo(tt.dst)
152 if err == nil {
153 t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
154 }
155 }
156 }
157
View as plain text