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