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