1package pgtype_test 2 3import ( 4 "reflect" 5 "testing" 6 7 "github.com/jackc/pgtype" 8 "github.com/jackc/pgtype/testutil" 9) 10 11func 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 22func 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 58func TestFloat4AssignTo(t *testing.T) { 59 var i8 int8 60 var i16 int16 61 var i32 int32 62 var i64 int64 63 var i int 64 var ui8 uint8 65 var ui16 uint16 66 var ui32 uint32 67 var ui64 uint64 68 var ui uint 69 var pi8 *int8 70 var _i8 _int8 71 var _pi8 *_int8 72 var f32 float32 73 var f64 float64 74 var pf32 *float32 75 var pf64 *float64 76 77 simpleTests := []struct { 78 src pgtype.Float4 79 dst interface{} 80 expected interface{} 81 }{ 82 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &f32, expected: float32(42)}, 83 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &f64, expected: float64(42)}, 84 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &i16, expected: int16(42)}, 85 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &i32, expected: int32(42)}, 86 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &i64, expected: int64(42)}, 87 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &i, expected: int(42)}, 88 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &ui8, expected: uint8(42)}, 89 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &ui16, expected: uint16(42)}, 90 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &ui32, expected: uint32(42)}, 91 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &ui64, expected: uint64(42)}, 92 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &ui, expected: uint(42)}, 93 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &_i8, expected: _int8(42)}, 94 {src: pgtype.Float4{Float: 0, Status: pgtype.Null}, dst: &pi8, expected: ((*int8)(nil))}, 95 {src: pgtype.Float4{Float: 0, Status: pgtype.Null}, dst: &_pi8, expected: ((*_int8)(nil))}, 96 } 97 98 for i, tt := range simpleTests { 99 err := tt.src.AssignTo(tt.dst) 100 if err != nil { 101 t.Errorf("%d: %v", i, err) 102 } 103 104 if dst := reflect.ValueOf(tt.dst).Elem().Interface(); dst != tt.expected { 105 t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst) 106 } 107 } 108 109 pointerAllocTests := []struct { 110 src pgtype.Float4 111 dst interface{} 112 expected interface{} 113 }{ 114 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &pf32, expected: float32(42)}, 115 {src: pgtype.Float4{Float: 42, Status: pgtype.Present}, dst: &pf64, expected: float64(42)}, 116 } 117 118 for i, tt := range pointerAllocTests { 119 err := tt.src.AssignTo(tt.dst) 120 if err != nil { 121 t.Errorf("%d: %v", i, err) 122 } 123 124 if dst := reflect.ValueOf(tt.dst).Elem().Elem().Interface(); dst != tt.expected { 125 t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst) 126 } 127 } 128 129 errorTests := []struct { 130 src pgtype.Float4 131 dst interface{} 132 }{ 133 {src: pgtype.Float4{Float: 150, Status: pgtype.Present}, dst: &i8}, 134 {src: pgtype.Float4{Float: 40000, Status: pgtype.Present}, dst: &i16}, 135 {src: pgtype.Float4{Float: -1, Status: pgtype.Present}, dst: &ui8}, 136 {src: pgtype.Float4{Float: -1, Status: pgtype.Present}, dst: &ui16}, 137 {src: pgtype.Float4{Float: -1, Status: pgtype.Present}, dst: &ui32}, 138 {src: pgtype.Float4{Float: -1, Status: pgtype.Present}, dst: &ui64}, 139 {src: pgtype.Float4{Float: -1, Status: pgtype.Present}, dst: &ui}, 140 {src: pgtype.Float4{Float: 0, Status: pgtype.Null}, dst: &i32}, 141 } 142 143 for i, tt := range errorTests { 144 err := tt.src.AssignTo(tt.dst) 145 if err == nil { 146 t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst) 147 } 148 } 149} 150