1package pgtype_test 2 3import ( 4 "reflect" 5 "testing" 6 7 "github.com/jackc/pgtype" 8 "github.com/jackc/pgtype/testutil" 9) 10 11func TestInt2ArrayTranscode(t *testing.T) { 12 testutil.TestSuccessfulTranscode(t, "int2[]", []interface{}{ 13 &pgtype.Int2Array{ 14 Elements: nil, 15 Dimensions: nil, 16 Status: pgtype.Present, 17 }, 18 &pgtype.Int2Array{ 19 Elements: []pgtype.Int2{ 20 {Int: 1, Status: pgtype.Present}, 21 {Status: pgtype.Null}, 22 }, 23 Dimensions: []pgtype.ArrayDimension{{Length: 2, LowerBound: 1}}, 24 Status: pgtype.Present, 25 }, 26 &pgtype.Int2Array{Status: pgtype.Null}, 27 &pgtype.Int2Array{ 28 Elements: []pgtype.Int2{ 29 {Int: 1, Status: pgtype.Present}, 30 {Int: 2, Status: pgtype.Present}, 31 {Int: 3, Status: pgtype.Present}, 32 {Int: 4, Status: pgtype.Present}, 33 {Status: pgtype.Null}, 34 {Int: 6, Status: pgtype.Present}, 35 }, 36 Dimensions: []pgtype.ArrayDimension{{Length: 3, LowerBound: 1}, {Length: 2, LowerBound: 1}}, 37 Status: pgtype.Present, 38 }, 39 &pgtype.Int2Array{ 40 Elements: []pgtype.Int2{ 41 {Int: 1, Status: pgtype.Present}, 42 {Int: 2, Status: pgtype.Present}, 43 {Int: 3, Status: pgtype.Present}, 44 {Int: 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 55func TestInt2ArraySet(t *testing.T) { 56 successfulTests := []struct { 57 source interface{} 58 result pgtype.Int2Array 59 }{ 60 { 61 source: []int64{1}, 62 result: pgtype.Int2Array{ 63 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}}, 64 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}}, 65 Status: pgtype.Present}, 66 }, 67 { 68 source: []int32{1}, 69 result: pgtype.Int2Array{ 70 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}}, 71 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}}, 72 Status: pgtype.Present}, 73 }, 74 { 75 source: []int16{1}, 76 result: pgtype.Int2Array{ 77 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}}, 78 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}}, 79 Status: pgtype.Present}, 80 }, 81 { 82 source: []int{1}, 83 result: pgtype.Int2Array{ 84 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}}, 85 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}}, 86 Status: pgtype.Present}, 87 }, 88 { 89 source: []uint64{1}, 90 result: pgtype.Int2Array{ 91 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}}, 92 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}}, 93 Status: pgtype.Present}, 94 }, 95 { 96 source: []uint32{1}, 97 result: pgtype.Int2Array{ 98 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}}, 99 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}}, 100 Status: pgtype.Present}, 101 }, 102 { 103 source: []uint16{1}, 104 result: pgtype.Int2Array{ 105 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}}, 106 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}}, 107 Status: pgtype.Present}, 108 }, 109 { 110 source: (([]int16)(nil)), 111 result: pgtype.Int2Array{Status: pgtype.Null}, 112 }, 113 } 114 115 for i, tt := range successfulTests { 116 var r pgtype.Int2Array 117 err := r.Set(tt.source) 118 if err != nil { 119 t.Errorf("%d: %v", i, err) 120 } 121 122 if !reflect.DeepEqual(r, tt.result) { 123 t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, r) 124 } 125 } 126} 127 128func TestInt2ArrayAssignTo(t *testing.T) { 129 var int16Slice []int16 130 var uint16Slice []uint16 131 var namedInt16Slice _int16Slice 132 133 simpleTests := []struct { 134 src pgtype.Int2Array 135 dst interface{} 136 expected interface{} 137 }{ 138 { 139 src: pgtype.Int2Array{ 140 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}}, 141 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}}, 142 Status: pgtype.Present, 143 }, 144 dst: &int16Slice, 145 expected: []int16{1}, 146 }, 147 { 148 src: pgtype.Int2Array{ 149 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}}, 150 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}}, 151 Status: pgtype.Present, 152 }, 153 dst: &uint16Slice, 154 expected: []uint16{1}, 155 }, 156 { 157 src: pgtype.Int2Array{ 158 Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}}, 159 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}}, 160 Status: pgtype.Present, 161 }, 162 dst: &namedInt16Slice, 163 expected: _int16Slice{1}, 164 }, 165 { 166 src: pgtype.Int2Array{Status: pgtype.Null}, 167 dst: &int16Slice, 168 expected: (([]int16)(nil)), 169 }, 170 } 171 172 for i, tt := range simpleTests { 173 err := tt.src.AssignTo(tt.dst) 174 if err != nil { 175 t.Errorf("%d: %v", i, err) 176 } 177 178 if dst := reflect.ValueOf(tt.dst).Elem().Interface(); !reflect.DeepEqual(dst, tt.expected) { 179 t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst) 180 } 181 } 182 183 errorTests := []struct { 184 src pgtype.Int2Array 185 dst interface{} 186 }{ 187 { 188 src: pgtype.Int2Array{ 189 Elements: []pgtype.Int2{{Status: pgtype.Null}}, 190 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}}, 191 Status: pgtype.Present, 192 }, 193 dst: &int16Slice, 194 }, 195 { 196 src: pgtype.Int2Array{ 197 Elements: []pgtype.Int2{{Int: -1, Status: pgtype.Present}}, 198 Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}}, 199 Status: pgtype.Present, 200 }, 201 dst: &uint16Slice, 202 }, 203 } 204 205 for i, tt := range errorTests { 206 err := tt.src.AssignTo(tt.dst) 207 if err == nil { 208 t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst) 209 } 210 } 211 212} 213