xref: /aosp_15_r20/build/blueprint/proptools/extend_test.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
1*1fa6dee9SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved.
2*1fa6dee9SAndroid Build Coastguard Worker//
3*1fa6dee9SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*1fa6dee9SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*1fa6dee9SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*1fa6dee9SAndroid Build Coastguard Worker//
7*1fa6dee9SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*1fa6dee9SAndroid Build Coastguard Worker//
9*1fa6dee9SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*1fa6dee9SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*1fa6dee9SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*1fa6dee9SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*1fa6dee9SAndroid Build Coastguard Worker// limitations under the License.
14*1fa6dee9SAndroid Build Coastguard Worker
15*1fa6dee9SAndroid Build Coastguard Workerpackage proptools
16*1fa6dee9SAndroid Build Coastguard Worker
17*1fa6dee9SAndroid Build Coastguard Workerimport (
18*1fa6dee9SAndroid Build Coastguard Worker	"errors"
19*1fa6dee9SAndroid Build Coastguard Worker	"fmt"
20*1fa6dee9SAndroid Build Coastguard Worker	"reflect"
21*1fa6dee9SAndroid Build Coastguard Worker	"strings"
22*1fa6dee9SAndroid Build Coastguard Worker	"testing"
23*1fa6dee9SAndroid Build Coastguard Worker
24*1fa6dee9SAndroid Build Coastguard Worker	"github.com/google/blueprint/parser"
25*1fa6dee9SAndroid Build Coastguard Worker)
26*1fa6dee9SAndroid Build Coastguard Worker
27*1fa6dee9SAndroid Build Coastguard Workertype appendPropertyTestCase struct {
28*1fa6dee9SAndroid Build Coastguard Worker	name   string
29*1fa6dee9SAndroid Build Coastguard Worker	dst    interface{}
30*1fa6dee9SAndroid Build Coastguard Worker	src    interface{}
31*1fa6dee9SAndroid Build Coastguard Worker	out    interface{}
32*1fa6dee9SAndroid Build Coastguard Worker	order  Order // default is Append
33*1fa6dee9SAndroid Build Coastguard Worker	filter ExtendPropertyFilterFunc
34*1fa6dee9SAndroid Build Coastguard Worker	err    error
35*1fa6dee9SAndroid Build Coastguard Worker}
36*1fa6dee9SAndroid Build Coastguard Worker
37*1fa6dee9SAndroid Build Coastguard Workerfunc appendPropertiesTestCases() []appendPropertyTestCase {
38*1fa6dee9SAndroid Build Coastguard Worker	return []appendPropertyTestCase{
39*1fa6dee9SAndroid Build Coastguard Worker		// Valid inputs
40*1fa6dee9SAndroid Build Coastguard Worker
41*1fa6dee9SAndroid Build Coastguard Worker		{
42*1fa6dee9SAndroid Build Coastguard Worker			name: "Append bool",
43*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ B1, B2, B3, B4 bool }{
44*1fa6dee9SAndroid Build Coastguard Worker				B1: true,
45*1fa6dee9SAndroid Build Coastguard Worker				B2: false,
46*1fa6dee9SAndroid Build Coastguard Worker				B3: true,
47*1fa6dee9SAndroid Build Coastguard Worker				B4: false,
48*1fa6dee9SAndroid Build Coastguard Worker			},
49*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ B1, B2, B3, B4 bool }{
50*1fa6dee9SAndroid Build Coastguard Worker				B1: true,
51*1fa6dee9SAndroid Build Coastguard Worker				B2: true,
52*1fa6dee9SAndroid Build Coastguard Worker				B3: false,
53*1fa6dee9SAndroid Build Coastguard Worker				B4: false,
54*1fa6dee9SAndroid Build Coastguard Worker			},
55*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ B1, B2, B3, B4 bool }{
56*1fa6dee9SAndroid Build Coastguard Worker				B1: true,
57*1fa6dee9SAndroid Build Coastguard Worker				B2: true,
58*1fa6dee9SAndroid Build Coastguard Worker				B3: true,
59*1fa6dee9SAndroid Build Coastguard Worker				B4: false,
60*1fa6dee9SAndroid Build Coastguard Worker			},
61*1fa6dee9SAndroid Build Coastguard Worker		},
62*1fa6dee9SAndroid Build Coastguard Worker		{
63*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend bool",
64*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ B1, B2, B3, B4 bool }{
65*1fa6dee9SAndroid Build Coastguard Worker				B1: true,
66*1fa6dee9SAndroid Build Coastguard Worker				B2: false,
67*1fa6dee9SAndroid Build Coastguard Worker				B3: true,
68*1fa6dee9SAndroid Build Coastguard Worker				B4: false,
69*1fa6dee9SAndroid Build Coastguard Worker			},
70*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ B1, B2, B3, B4 bool }{
71*1fa6dee9SAndroid Build Coastguard Worker				B1: true,
72*1fa6dee9SAndroid Build Coastguard Worker				B2: true,
73*1fa6dee9SAndroid Build Coastguard Worker				B3: false,
74*1fa6dee9SAndroid Build Coastguard Worker				B4: false,
75*1fa6dee9SAndroid Build Coastguard Worker			},
76*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ B1, B2, B3, B4 bool }{
77*1fa6dee9SAndroid Build Coastguard Worker				B1: true,
78*1fa6dee9SAndroid Build Coastguard Worker				B2: true,
79*1fa6dee9SAndroid Build Coastguard Worker				B3: true,
80*1fa6dee9SAndroid Build Coastguard Worker				B4: false,
81*1fa6dee9SAndroid Build Coastguard Worker			},
82*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
83*1fa6dee9SAndroid Build Coastguard Worker		},
84*1fa6dee9SAndroid Build Coastguard Worker		{
85*1fa6dee9SAndroid Build Coastguard Worker			name: "Append strings",
86*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S string }{
87*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
88*1fa6dee9SAndroid Build Coastguard Worker			},
89*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
90*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
91*1fa6dee9SAndroid Build Coastguard Worker			},
92*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S string }{
93*1fa6dee9SAndroid Build Coastguard Worker				S: "string1string2",
94*1fa6dee9SAndroid Build Coastguard Worker			},
95*1fa6dee9SAndroid Build Coastguard Worker		},
96*1fa6dee9SAndroid Build Coastguard Worker		{
97*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend strings",
98*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S string }{
99*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
100*1fa6dee9SAndroid Build Coastguard Worker			},
101*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
102*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
103*1fa6dee9SAndroid Build Coastguard Worker			},
104*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S string }{
105*1fa6dee9SAndroid Build Coastguard Worker				S: "string2string1",
106*1fa6dee9SAndroid Build Coastguard Worker			},
107*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
108*1fa6dee9SAndroid Build Coastguard Worker		},
109*1fa6dee9SAndroid Build Coastguard Worker		{
110*1fa6dee9SAndroid Build Coastguard Worker			name: "Append pointer to bool",
111*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ B1, B2, B3, B4, B5, B6, B7, B8, B9 *bool }{
112*1fa6dee9SAndroid Build Coastguard Worker				B1: BoolPtr(true),
113*1fa6dee9SAndroid Build Coastguard Worker				B2: BoolPtr(false),
114*1fa6dee9SAndroid Build Coastguard Worker				B3: nil,
115*1fa6dee9SAndroid Build Coastguard Worker				B4: BoolPtr(true),
116*1fa6dee9SAndroid Build Coastguard Worker				B5: BoolPtr(false),
117*1fa6dee9SAndroid Build Coastguard Worker				B6: nil,
118*1fa6dee9SAndroid Build Coastguard Worker				B7: BoolPtr(true),
119*1fa6dee9SAndroid Build Coastguard Worker				B8: BoolPtr(false),
120*1fa6dee9SAndroid Build Coastguard Worker				B9: nil,
121*1fa6dee9SAndroid Build Coastguard Worker			},
122*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ B1, B2, B3, B4, B5, B6, B7, B8, B9 *bool }{
123*1fa6dee9SAndroid Build Coastguard Worker				B1: nil,
124*1fa6dee9SAndroid Build Coastguard Worker				B2: nil,
125*1fa6dee9SAndroid Build Coastguard Worker				B3: nil,
126*1fa6dee9SAndroid Build Coastguard Worker				B4: BoolPtr(true),
127*1fa6dee9SAndroid Build Coastguard Worker				B5: BoolPtr(true),
128*1fa6dee9SAndroid Build Coastguard Worker				B6: BoolPtr(true),
129*1fa6dee9SAndroid Build Coastguard Worker				B7: BoolPtr(false),
130*1fa6dee9SAndroid Build Coastguard Worker				B8: BoolPtr(false),
131*1fa6dee9SAndroid Build Coastguard Worker				B9: BoolPtr(false),
132*1fa6dee9SAndroid Build Coastguard Worker			},
133*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ B1, B2, B3, B4, B5, B6, B7, B8, B9 *bool }{
134*1fa6dee9SAndroid Build Coastguard Worker				B1: BoolPtr(true),
135*1fa6dee9SAndroid Build Coastguard Worker				B2: BoolPtr(false),
136*1fa6dee9SAndroid Build Coastguard Worker				B3: nil,
137*1fa6dee9SAndroid Build Coastguard Worker				B4: BoolPtr(true),
138*1fa6dee9SAndroid Build Coastguard Worker				B5: BoolPtr(true),
139*1fa6dee9SAndroid Build Coastguard Worker				B6: BoolPtr(true),
140*1fa6dee9SAndroid Build Coastguard Worker				B7: BoolPtr(false),
141*1fa6dee9SAndroid Build Coastguard Worker				B8: BoolPtr(false),
142*1fa6dee9SAndroid Build Coastguard Worker				B9: BoolPtr(false),
143*1fa6dee9SAndroid Build Coastguard Worker			},
144*1fa6dee9SAndroid Build Coastguard Worker		},
145*1fa6dee9SAndroid Build Coastguard Worker		{
146*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend pointer to bool",
147*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ B1, B2, B3, B4, B5, B6, B7, B8, B9 *bool }{
148*1fa6dee9SAndroid Build Coastguard Worker				B1: BoolPtr(true),
149*1fa6dee9SAndroid Build Coastguard Worker				B2: BoolPtr(false),
150*1fa6dee9SAndroid Build Coastguard Worker				B3: nil,
151*1fa6dee9SAndroid Build Coastguard Worker				B4: BoolPtr(true),
152*1fa6dee9SAndroid Build Coastguard Worker				B5: BoolPtr(false),
153*1fa6dee9SAndroid Build Coastguard Worker				B6: nil,
154*1fa6dee9SAndroid Build Coastguard Worker				B7: BoolPtr(true),
155*1fa6dee9SAndroid Build Coastguard Worker				B8: BoolPtr(false),
156*1fa6dee9SAndroid Build Coastguard Worker				B9: nil,
157*1fa6dee9SAndroid Build Coastguard Worker			},
158*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ B1, B2, B3, B4, B5, B6, B7, B8, B9 *bool }{
159*1fa6dee9SAndroid Build Coastguard Worker				B1: nil,
160*1fa6dee9SAndroid Build Coastguard Worker				B2: nil,
161*1fa6dee9SAndroid Build Coastguard Worker				B3: nil,
162*1fa6dee9SAndroid Build Coastguard Worker				B4: BoolPtr(true),
163*1fa6dee9SAndroid Build Coastguard Worker				B5: BoolPtr(true),
164*1fa6dee9SAndroid Build Coastguard Worker				B6: BoolPtr(true),
165*1fa6dee9SAndroid Build Coastguard Worker				B7: BoolPtr(false),
166*1fa6dee9SAndroid Build Coastguard Worker				B8: BoolPtr(false),
167*1fa6dee9SAndroid Build Coastguard Worker				B9: BoolPtr(false),
168*1fa6dee9SAndroid Build Coastguard Worker			},
169*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ B1, B2, B3, B4, B5, B6, B7, B8, B9 *bool }{
170*1fa6dee9SAndroid Build Coastguard Worker				B1: BoolPtr(true),
171*1fa6dee9SAndroid Build Coastguard Worker				B2: BoolPtr(false),
172*1fa6dee9SAndroid Build Coastguard Worker				B3: nil,
173*1fa6dee9SAndroid Build Coastguard Worker				B4: BoolPtr(true),
174*1fa6dee9SAndroid Build Coastguard Worker				B5: BoolPtr(false),
175*1fa6dee9SAndroid Build Coastguard Worker				B6: BoolPtr(true),
176*1fa6dee9SAndroid Build Coastguard Worker				B7: BoolPtr(true),
177*1fa6dee9SAndroid Build Coastguard Worker				B8: BoolPtr(false),
178*1fa6dee9SAndroid Build Coastguard Worker				B9: BoolPtr(false),
179*1fa6dee9SAndroid Build Coastguard Worker			},
180*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
181*1fa6dee9SAndroid Build Coastguard Worker		},
182*1fa6dee9SAndroid Build Coastguard Worker		{
183*1fa6dee9SAndroid Build Coastguard Worker			name: "Append pointer to integer",
184*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ I1, I2, I3, I4, I5, I6, I7, I8, I9 *int64 }{
185*1fa6dee9SAndroid Build Coastguard Worker				I1: Int64Ptr(55),
186*1fa6dee9SAndroid Build Coastguard Worker				I2: Int64Ptr(-3),
187*1fa6dee9SAndroid Build Coastguard Worker				I3: nil,
188*1fa6dee9SAndroid Build Coastguard Worker				I4: Int64Ptr(100),
189*1fa6dee9SAndroid Build Coastguard Worker				I5: Int64Ptr(33),
190*1fa6dee9SAndroid Build Coastguard Worker				I6: nil,
191*1fa6dee9SAndroid Build Coastguard Worker				I7: Int64Ptr(77),
192*1fa6dee9SAndroid Build Coastguard Worker				I8: Int64Ptr(0),
193*1fa6dee9SAndroid Build Coastguard Worker				I9: nil,
194*1fa6dee9SAndroid Build Coastguard Worker			},
195*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ I1, I2, I3, I4, I5, I6, I7, I8, I9 *int64 }{
196*1fa6dee9SAndroid Build Coastguard Worker				I1: nil,
197*1fa6dee9SAndroid Build Coastguard Worker				I2: nil,
198*1fa6dee9SAndroid Build Coastguard Worker				I3: nil,
199*1fa6dee9SAndroid Build Coastguard Worker				I4: Int64Ptr(1),
200*1fa6dee9SAndroid Build Coastguard Worker				I5: Int64Ptr(-2),
201*1fa6dee9SAndroid Build Coastguard Worker				I6: Int64Ptr(8),
202*1fa6dee9SAndroid Build Coastguard Worker				I7: Int64Ptr(9),
203*1fa6dee9SAndroid Build Coastguard Worker				I8: Int64Ptr(10),
204*1fa6dee9SAndroid Build Coastguard Worker				I9: Int64Ptr(11),
205*1fa6dee9SAndroid Build Coastguard Worker			},
206*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ I1, I2, I3, I4, I5, I6, I7, I8, I9 *int64 }{
207*1fa6dee9SAndroid Build Coastguard Worker				I1: Int64Ptr(55),
208*1fa6dee9SAndroid Build Coastguard Worker				I2: Int64Ptr(-3),
209*1fa6dee9SAndroid Build Coastguard Worker				I3: nil,
210*1fa6dee9SAndroid Build Coastguard Worker				I4: Int64Ptr(1),
211*1fa6dee9SAndroid Build Coastguard Worker				I5: Int64Ptr(-2),
212*1fa6dee9SAndroid Build Coastguard Worker				I6: Int64Ptr(8),
213*1fa6dee9SAndroid Build Coastguard Worker				I7: Int64Ptr(9),
214*1fa6dee9SAndroid Build Coastguard Worker				I8: Int64Ptr(10),
215*1fa6dee9SAndroid Build Coastguard Worker				I9: Int64Ptr(11),
216*1fa6dee9SAndroid Build Coastguard Worker			},
217*1fa6dee9SAndroid Build Coastguard Worker		},
218*1fa6dee9SAndroid Build Coastguard Worker		{
219*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend pointer to integer",
220*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ I1, I2, I3 *int64 }{
221*1fa6dee9SAndroid Build Coastguard Worker				I1: Int64Ptr(55),
222*1fa6dee9SAndroid Build Coastguard Worker				I3: nil,
223*1fa6dee9SAndroid Build Coastguard Worker			},
224*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ I1, I2, I3 *int64 }{
225*1fa6dee9SAndroid Build Coastguard Worker				I2: Int64Ptr(33),
226*1fa6dee9SAndroid Build Coastguard Worker			},
227*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ I1, I2, I3 *int64 }{
228*1fa6dee9SAndroid Build Coastguard Worker				I1: Int64Ptr(55),
229*1fa6dee9SAndroid Build Coastguard Worker				I2: Int64Ptr(33),
230*1fa6dee9SAndroid Build Coastguard Worker				I3: nil,
231*1fa6dee9SAndroid Build Coastguard Worker			},
232*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
233*1fa6dee9SAndroid Build Coastguard Worker		},
234*1fa6dee9SAndroid Build Coastguard Worker		{
235*1fa6dee9SAndroid Build Coastguard Worker			name: "Append pointer to strings",
236*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2, S3, S4 *string }{
237*1fa6dee9SAndroid Build Coastguard Worker				S1: StringPtr("string1"),
238*1fa6dee9SAndroid Build Coastguard Worker				S2: StringPtr("string2"),
239*1fa6dee9SAndroid Build Coastguard Worker			},
240*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2, S3, S4 *string }{
241*1fa6dee9SAndroid Build Coastguard Worker				S1: StringPtr("string3"),
242*1fa6dee9SAndroid Build Coastguard Worker				S3: StringPtr("string4"),
243*1fa6dee9SAndroid Build Coastguard Worker			},
244*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2, S3, S4 *string }{
245*1fa6dee9SAndroid Build Coastguard Worker				S1: StringPtr("string3"),
246*1fa6dee9SAndroid Build Coastguard Worker				S2: StringPtr("string2"),
247*1fa6dee9SAndroid Build Coastguard Worker				S3: StringPtr("string4"),
248*1fa6dee9SAndroid Build Coastguard Worker				S4: nil,
249*1fa6dee9SAndroid Build Coastguard Worker			},
250*1fa6dee9SAndroid Build Coastguard Worker		},
251*1fa6dee9SAndroid Build Coastguard Worker		{
252*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend pointer to strings",
253*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2, S3, S4 *string }{
254*1fa6dee9SAndroid Build Coastguard Worker				S1: StringPtr("string1"),
255*1fa6dee9SAndroid Build Coastguard Worker				S2: StringPtr("string2"),
256*1fa6dee9SAndroid Build Coastguard Worker			},
257*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2, S3, S4 *string }{
258*1fa6dee9SAndroid Build Coastguard Worker				S1: StringPtr("string3"),
259*1fa6dee9SAndroid Build Coastguard Worker				S3: StringPtr("string4"),
260*1fa6dee9SAndroid Build Coastguard Worker			},
261*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2, S3, S4 *string }{
262*1fa6dee9SAndroid Build Coastguard Worker				S1: StringPtr("string1"),
263*1fa6dee9SAndroid Build Coastguard Worker				S2: StringPtr("string2"),
264*1fa6dee9SAndroid Build Coastguard Worker				S3: StringPtr("string4"),
265*1fa6dee9SAndroid Build Coastguard Worker				S4: nil,
266*1fa6dee9SAndroid Build Coastguard Worker			},
267*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
268*1fa6dee9SAndroid Build Coastguard Worker		},
269*1fa6dee9SAndroid Build Coastguard Worker		{
270*1fa6dee9SAndroid Build Coastguard Worker			name: "Append slice",
271*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S []string }{
272*1fa6dee9SAndroid Build Coastguard Worker				S: []string{"string1"},
273*1fa6dee9SAndroid Build Coastguard Worker			},
274*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S []string }{
275*1fa6dee9SAndroid Build Coastguard Worker				S: []string{"string2"},
276*1fa6dee9SAndroid Build Coastguard Worker			},
277*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S []string }{
278*1fa6dee9SAndroid Build Coastguard Worker				S: []string{"string1", "string2"},
279*1fa6dee9SAndroid Build Coastguard Worker			},
280*1fa6dee9SAndroid Build Coastguard Worker		},
281*1fa6dee9SAndroid Build Coastguard Worker		{
282*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend slice",
283*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S []string }{
284*1fa6dee9SAndroid Build Coastguard Worker				S: []string{"string1"},
285*1fa6dee9SAndroid Build Coastguard Worker			},
286*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S []string }{
287*1fa6dee9SAndroid Build Coastguard Worker				S: []string{"string2"},
288*1fa6dee9SAndroid Build Coastguard Worker			},
289*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S []string }{
290*1fa6dee9SAndroid Build Coastguard Worker				S: []string{"string2", "string1"},
291*1fa6dee9SAndroid Build Coastguard Worker			},
292*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
293*1fa6dee9SAndroid Build Coastguard Worker		},
294*1fa6dee9SAndroid Build Coastguard Worker		{
295*1fa6dee9SAndroid Build Coastguard Worker			name: "Replace slice",
296*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S []string }{
297*1fa6dee9SAndroid Build Coastguard Worker				S: []string{"string1"},
298*1fa6dee9SAndroid Build Coastguard Worker			},
299*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S []string }{
300*1fa6dee9SAndroid Build Coastguard Worker				S: []string{"string2"},
301*1fa6dee9SAndroid Build Coastguard Worker			},
302*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S []string }{
303*1fa6dee9SAndroid Build Coastguard Worker				S: []string{"string2"},
304*1fa6dee9SAndroid Build Coastguard Worker			},
305*1fa6dee9SAndroid Build Coastguard Worker			order: Replace,
306*1fa6dee9SAndroid Build Coastguard Worker		},
307*1fa6dee9SAndroid Build Coastguard Worker		{
308*1fa6dee9SAndroid Build Coastguard Worker			name: "Append empty slice",
309*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2 []string }{
310*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{"string1"},
311*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{},
312*1fa6dee9SAndroid Build Coastguard Worker			},
313*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2 []string }{
314*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{},
315*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{"string2"},
316*1fa6dee9SAndroid Build Coastguard Worker			},
317*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2 []string }{
318*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{"string1"},
319*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{"string2"},
320*1fa6dee9SAndroid Build Coastguard Worker			},
321*1fa6dee9SAndroid Build Coastguard Worker		},
322*1fa6dee9SAndroid Build Coastguard Worker		{
323*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend empty slice",
324*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2 []string }{
325*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{"string1"},
326*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{},
327*1fa6dee9SAndroid Build Coastguard Worker			},
328*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2 []string }{
329*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{},
330*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{"string2"},
331*1fa6dee9SAndroid Build Coastguard Worker			},
332*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2 []string }{
333*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{"string1"},
334*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{"string2"},
335*1fa6dee9SAndroid Build Coastguard Worker			},
336*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
337*1fa6dee9SAndroid Build Coastguard Worker		},
338*1fa6dee9SAndroid Build Coastguard Worker		{
339*1fa6dee9SAndroid Build Coastguard Worker			name: "Replace empty slice",
340*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2 []string }{
341*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{"string1"},
342*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{},
343*1fa6dee9SAndroid Build Coastguard Worker			},
344*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2 []string }{
345*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{},
346*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{"string2"},
347*1fa6dee9SAndroid Build Coastguard Worker			},
348*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2 []string }{
349*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{},
350*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{"string2"},
351*1fa6dee9SAndroid Build Coastguard Worker			},
352*1fa6dee9SAndroid Build Coastguard Worker			order: Replace,
353*1fa6dee9SAndroid Build Coastguard Worker		},
354*1fa6dee9SAndroid Build Coastguard Worker		{
355*1fa6dee9SAndroid Build Coastguard Worker			name: "Append nil slice",
356*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2, S3 []string }{
357*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{"string1"},
358*1fa6dee9SAndroid Build Coastguard Worker			},
359*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2, S3 []string }{
360*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{"string2"},
361*1fa6dee9SAndroid Build Coastguard Worker			},
362*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2, S3 []string }{
363*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{"string1"},
364*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{"string2"},
365*1fa6dee9SAndroid Build Coastguard Worker				S3: nil,
366*1fa6dee9SAndroid Build Coastguard Worker			},
367*1fa6dee9SAndroid Build Coastguard Worker		},
368*1fa6dee9SAndroid Build Coastguard Worker		{
369*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend nil slice",
370*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2, S3 []string }{
371*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{"string1"},
372*1fa6dee9SAndroid Build Coastguard Worker			},
373*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2, S3 []string }{
374*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{"string2"},
375*1fa6dee9SAndroid Build Coastguard Worker			},
376*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2, S3 []string }{
377*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{"string1"},
378*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{"string2"},
379*1fa6dee9SAndroid Build Coastguard Worker				S3: nil,
380*1fa6dee9SAndroid Build Coastguard Worker			},
381*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
382*1fa6dee9SAndroid Build Coastguard Worker		},
383*1fa6dee9SAndroid Build Coastguard Worker		{
384*1fa6dee9SAndroid Build Coastguard Worker			name: "Replace nil slice",
385*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2, S3 []string }{
386*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{"string1"},
387*1fa6dee9SAndroid Build Coastguard Worker			},
388*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2, S3 []string }{
389*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{"string2"},
390*1fa6dee9SAndroid Build Coastguard Worker			},
391*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2, S3 []string }{
392*1fa6dee9SAndroid Build Coastguard Worker				S1: []string{"string1"},
393*1fa6dee9SAndroid Build Coastguard Worker				S2: []string{"string2"},
394*1fa6dee9SAndroid Build Coastguard Worker				S3: nil,
395*1fa6dee9SAndroid Build Coastguard Worker			},
396*1fa6dee9SAndroid Build Coastguard Worker			order: Replace,
397*1fa6dee9SAndroid Build Coastguard Worker		},
398*1fa6dee9SAndroid Build Coastguard Worker		{
399*1fa6dee9SAndroid Build Coastguard Worker			name: "Replace embedded slice",
400*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S *struct{ S1 []string } }{
401*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S1 []string }{
402*1fa6dee9SAndroid Build Coastguard Worker					S1: []string{"string1"},
403*1fa6dee9SAndroid Build Coastguard Worker				},
404*1fa6dee9SAndroid Build Coastguard Worker			},
405*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S *struct{ S1 []string } }{
406*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S1 []string }{
407*1fa6dee9SAndroid Build Coastguard Worker					S1: []string{"string2"},
408*1fa6dee9SAndroid Build Coastguard Worker				},
409*1fa6dee9SAndroid Build Coastguard Worker			},
410*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S *struct{ S1 []string } }{
411*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S1 []string }{
412*1fa6dee9SAndroid Build Coastguard Worker					S1: []string{"string2"},
413*1fa6dee9SAndroid Build Coastguard Worker				},
414*1fa6dee9SAndroid Build Coastguard Worker			},
415*1fa6dee9SAndroid Build Coastguard Worker			order: Replace,
416*1fa6dee9SAndroid Build Coastguard Worker		},
417*1fa6dee9SAndroid Build Coastguard Worker		{
418*1fa6dee9SAndroid Build Coastguard Worker			name: "Append slice of structs",
419*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S []struct{ F string } }{
420*1fa6dee9SAndroid Build Coastguard Worker				S: []struct{ F string }{
421*1fa6dee9SAndroid Build Coastguard Worker					{F: "foo"}, {F: "bar"},
422*1fa6dee9SAndroid Build Coastguard Worker				},
423*1fa6dee9SAndroid Build Coastguard Worker			},
424*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S []struct{ F string } }{
425*1fa6dee9SAndroid Build Coastguard Worker				S: []struct{ F string }{
426*1fa6dee9SAndroid Build Coastguard Worker					{F: "baz"},
427*1fa6dee9SAndroid Build Coastguard Worker				},
428*1fa6dee9SAndroid Build Coastguard Worker			},
429*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S []struct{ F string } }{
430*1fa6dee9SAndroid Build Coastguard Worker				S: []struct{ F string }{
431*1fa6dee9SAndroid Build Coastguard Worker					{F: "foo"}, {F: "bar"}, {F: "baz"},
432*1fa6dee9SAndroid Build Coastguard Worker				},
433*1fa6dee9SAndroid Build Coastguard Worker			},
434*1fa6dee9SAndroid Build Coastguard Worker			order: Append,
435*1fa6dee9SAndroid Build Coastguard Worker		},
436*1fa6dee9SAndroid Build Coastguard Worker		{
437*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend slice of structs",
438*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S []struct{ F string } }{
439*1fa6dee9SAndroid Build Coastguard Worker				S: []struct{ F string }{
440*1fa6dee9SAndroid Build Coastguard Worker					{F: "foo"}, {F: "bar"},
441*1fa6dee9SAndroid Build Coastguard Worker				},
442*1fa6dee9SAndroid Build Coastguard Worker			},
443*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S []struct{ F string } }{
444*1fa6dee9SAndroid Build Coastguard Worker				S: []struct{ F string }{
445*1fa6dee9SAndroid Build Coastguard Worker					{F: "baz"},
446*1fa6dee9SAndroid Build Coastguard Worker				},
447*1fa6dee9SAndroid Build Coastguard Worker			},
448*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S []struct{ F string } }{
449*1fa6dee9SAndroid Build Coastguard Worker				S: []struct{ F string }{
450*1fa6dee9SAndroid Build Coastguard Worker					{F: "baz"}, {F: "foo"}, {F: "bar"},
451*1fa6dee9SAndroid Build Coastguard Worker				},
452*1fa6dee9SAndroid Build Coastguard Worker			},
453*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
454*1fa6dee9SAndroid Build Coastguard Worker		},
455*1fa6dee9SAndroid Build Coastguard Worker		{
456*1fa6dee9SAndroid Build Coastguard Worker			name: "Append map",
457*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S map[string]string }{
458*1fa6dee9SAndroid Build Coastguard Worker				S: map[string]string{
459*1fa6dee9SAndroid Build Coastguard Worker					"key0": "",
460*1fa6dee9SAndroid Build Coastguard Worker					"key1": "dst_value1",
461*1fa6dee9SAndroid Build Coastguard Worker					"key2": "dst_value2",
462*1fa6dee9SAndroid Build Coastguard Worker				},
463*1fa6dee9SAndroid Build Coastguard Worker			},
464*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S map[string]string }{
465*1fa6dee9SAndroid Build Coastguard Worker				S: map[string]string{
466*1fa6dee9SAndroid Build Coastguard Worker					"key0": "src_value0",
467*1fa6dee9SAndroid Build Coastguard Worker					"key1": "src_value1",
468*1fa6dee9SAndroid Build Coastguard Worker					"key3": "src_value3",
469*1fa6dee9SAndroid Build Coastguard Worker				},
470*1fa6dee9SAndroid Build Coastguard Worker			},
471*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S map[string]string }{
472*1fa6dee9SAndroid Build Coastguard Worker				S: map[string]string{
473*1fa6dee9SAndroid Build Coastguard Worker					"key0": "src_value0",
474*1fa6dee9SAndroid Build Coastguard Worker					"key1": "src_value1",
475*1fa6dee9SAndroid Build Coastguard Worker					"key2": "dst_value2",
476*1fa6dee9SAndroid Build Coastguard Worker					"key3": "src_value3",
477*1fa6dee9SAndroid Build Coastguard Worker				},
478*1fa6dee9SAndroid Build Coastguard Worker			},
479*1fa6dee9SAndroid Build Coastguard Worker			order: Append,
480*1fa6dee9SAndroid Build Coastguard Worker		},
481*1fa6dee9SAndroid Build Coastguard Worker		{
482*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend map",
483*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S map[string]string }{
484*1fa6dee9SAndroid Build Coastguard Worker				S: map[string]string{
485*1fa6dee9SAndroid Build Coastguard Worker					"key0": "",
486*1fa6dee9SAndroid Build Coastguard Worker					"key1": "dst_value1",
487*1fa6dee9SAndroid Build Coastguard Worker					"key2": "dst_value2",
488*1fa6dee9SAndroid Build Coastguard Worker				},
489*1fa6dee9SAndroid Build Coastguard Worker			},
490*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S map[string]string }{
491*1fa6dee9SAndroid Build Coastguard Worker				S: map[string]string{
492*1fa6dee9SAndroid Build Coastguard Worker					"key0": "src_value0",
493*1fa6dee9SAndroid Build Coastguard Worker					"key1": "src_value1",
494*1fa6dee9SAndroid Build Coastguard Worker					"key3": "src_value3",
495*1fa6dee9SAndroid Build Coastguard Worker				},
496*1fa6dee9SAndroid Build Coastguard Worker			},
497*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S map[string]string }{
498*1fa6dee9SAndroid Build Coastguard Worker				S: map[string]string{
499*1fa6dee9SAndroid Build Coastguard Worker					"key0": "",
500*1fa6dee9SAndroid Build Coastguard Worker					"key1": "dst_value1",
501*1fa6dee9SAndroid Build Coastguard Worker					"key2": "dst_value2",
502*1fa6dee9SAndroid Build Coastguard Worker					"key3": "src_value3",
503*1fa6dee9SAndroid Build Coastguard Worker				},
504*1fa6dee9SAndroid Build Coastguard Worker			},
505*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
506*1fa6dee9SAndroid Build Coastguard Worker		},
507*1fa6dee9SAndroid Build Coastguard Worker		{
508*1fa6dee9SAndroid Build Coastguard Worker			name: "Replace map",
509*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S map[string]string }{
510*1fa6dee9SAndroid Build Coastguard Worker				S: map[string]string{
511*1fa6dee9SAndroid Build Coastguard Worker					"key0": "",
512*1fa6dee9SAndroid Build Coastguard Worker					"key1": "dst_value1",
513*1fa6dee9SAndroid Build Coastguard Worker					"key2": "dst_value2",
514*1fa6dee9SAndroid Build Coastguard Worker				},
515*1fa6dee9SAndroid Build Coastguard Worker			},
516*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S map[string]string }{
517*1fa6dee9SAndroid Build Coastguard Worker				S: map[string]string{
518*1fa6dee9SAndroid Build Coastguard Worker					"key0": "src_value0",
519*1fa6dee9SAndroid Build Coastguard Worker					"key1": "src_value1",
520*1fa6dee9SAndroid Build Coastguard Worker					"key3": "src_value3",
521*1fa6dee9SAndroid Build Coastguard Worker				},
522*1fa6dee9SAndroid Build Coastguard Worker			},
523*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S map[string]string }{
524*1fa6dee9SAndroid Build Coastguard Worker				S: map[string]string{
525*1fa6dee9SAndroid Build Coastguard Worker					"key0": "src_value0",
526*1fa6dee9SAndroid Build Coastguard Worker					"key1": "src_value1",
527*1fa6dee9SAndroid Build Coastguard Worker					"key3": "src_value3",
528*1fa6dee9SAndroid Build Coastguard Worker				},
529*1fa6dee9SAndroid Build Coastguard Worker			},
530*1fa6dee9SAndroid Build Coastguard Worker			order: Replace,
531*1fa6dee9SAndroid Build Coastguard Worker		},
532*1fa6dee9SAndroid Build Coastguard Worker		{
533*1fa6dee9SAndroid Build Coastguard Worker			name: "Append empty map",
534*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2 map[string]string }{
535*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{"key0": "dst_value0"},
536*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{},
537*1fa6dee9SAndroid Build Coastguard Worker			},
538*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2 map[string]string }{
539*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{},
540*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{"key0": "src_value0"},
541*1fa6dee9SAndroid Build Coastguard Worker			},
542*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2 map[string]string }{
543*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{"key0": "dst_value0"},
544*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{"key0": "src_value0"},
545*1fa6dee9SAndroid Build Coastguard Worker			},
546*1fa6dee9SAndroid Build Coastguard Worker			order: Append,
547*1fa6dee9SAndroid Build Coastguard Worker		},
548*1fa6dee9SAndroid Build Coastguard Worker		{
549*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend empty map",
550*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2 map[string]string }{
551*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{"key0": "dst_value0"},
552*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{},
553*1fa6dee9SAndroid Build Coastguard Worker			},
554*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2 map[string]string }{
555*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{},
556*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{"key0": "src_value0"},
557*1fa6dee9SAndroid Build Coastguard Worker			},
558*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2 map[string]string }{
559*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{"key0": "dst_value0"},
560*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{"key0": "src_value0"},
561*1fa6dee9SAndroid Build Coastguard Worker			},
562*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
563*1fa6dee9SAndroid Build Coastguard Worker		},
564*1fa6dee9SAndroid Build Coastguard Worker		{
565*1fa6dee9SAndroid Build Coastguard Worker			name: "Replace empty map",
566*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2 map[string]string }{
567*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{"key0": "dst_value0"},
568*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{},
569*1fa6dee9SAndroid Build Coastguard Worker			},
570*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2 map[string]string }{
571*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{},
572*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{"key0": "src_value0"},
573*1fa6dee9SAndroid Build Coastguard Worker			},
574*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2 map[string]string }{
575*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{},
576*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{"key0": "src_value0"},
577*1fa6dee9SAndroid Build Coastguard Worker			},
578*1fa6dee9SAndroid Build Coastguard Worker			order: Replace,
579*1fa6dee9SAndroid Build Coastguard Worker		},
580*1fa6dee9SAndroid Build Coastguard Worker		{
581*1fa6dee9SAndroid Build Coastguard Worker			name: "Append nil map",
582*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2, S3 map[string]string }{
583*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{"key0": "dst_value0"},
584*1fa6dee9SAndroid Build Coastguard Worker			},
585*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2, S3 map[string]string }{
586*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{"key0": "src_value0"},
587*1fa6dee9SAndroid Build Coastguard Worker			},
588*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2, S3 map[string]string }{
589*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{"key0": "dst_value0"},
590*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{"key0": "src_value0"},
591*1fa6dee9SAndroid Build Coastguard Worker			},
592*1fa6dee9SAndroid Build Coastguard Worker			order: Append,
593*1fa6dee9SAndroid Build Coastguard Worker		},
594*1fa6dee9SAndroid Build Coastguard Worker		{
595*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend nil map",
596*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2, S3 map[string]string }{
597*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{"key0": "dst_value0"},
598*1fa6dee9SAndroid Build Coastguard Worker			},
599*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2, S3 map[string]string }{
600*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{"key0": "src_value0"},
601*1fa6dee9SAndroid Build Coastguard Worker			},
602*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2, S3 map[string]string }{
603*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{"key0": "dst_value0"},
604*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{"key0": "src_value0"},
605*1fa6dee9SAndroid Build Coastguard Worker			},
606*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
607*1fa6dee9SAndroid Build Coastguard Worker		},
608*1fa6dee9SAndroid Build Coastguard Worker		{
609*1fa6dee9SAndroid Build Coastguard Worker			name: "Replace nil map",
610*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S1, S2, S3 map[string]string }{
611*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{"key0": "dst_value0"},
612*1fa6dee9SAndroid Build Coastguard Worker			},
613*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S1, S2, S3 map[string]string }{
614*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{"key0": "src_value0"},
615*1fa6dee9SAndroid Build Coastguard Worker			},
616*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S1, S2, S3 map[string]string }{
617*1fa6dee9SAndroid Build Coastguard Worker				S1: map[string]string{"key0": "dst_value0"},
618*1fa6dee9SAndroid Build Coastguard Worker				S2: map[string]string{"key0": "src_value0"},
619*1fa6dee9SAndroid Build Coastguard Worker				S3: nil,
620*1fa6dee9SAndroid Build Coastguard Worker			},
621*1fa6dee9SAndroid Build Coastguard Worker			order: Replace,
622*1fa6dee9SAndroid Build Coastguard Worker		},
623*1fa6dee9SAndroid Build Coastguard Worker		{
624*1fa6dee9SAndroid Build Coastguard Worker			name: "Replace slice of structs",
625*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S []struct{ F string } }{
626*1fa6dee9SAndroid Build Coastguard Worker				S: []struct{ F string }{
627*1fa6dee9SAndroid Build Coastguard Worker					{F: "foo"}, {F: "bar"},
628*1fa6dee9SAndroid Build Coastguard Worker				},
629*1fa6dee9SAndroid Build Coastguard Worker			},
630*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S []struct{ F string } }{
631*1fa6dee9SAndroid Build Coastguard Worker				S: []struct{ F string }{
632*1fa6dee9SAndroid Build Coastguard Worker					{F: "baz"},
633*1fa6dee9SAndroid Build Coastguard Worker				},
634*1fa6dee9SAndroid Build Coastguard Worker			},
635*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S []struct{ F string } }{
636*1fa6dee9SAndroid Build Coastguard Worker				S: []struct{ F string }{
637*1fa6dee9SAndroid Build Coastguard Worker					{F: "baz"},
638*1fa6dee9SAndroid Build Coastguard Worker				},
639*1fa6dee9SAndroid Build Coastguard Worker			},
640*1fa6dee9SAndroid Build Coastguard Worker			order: Replace,
641*1fa6dee9SAndroid Build Coastguard Worker		},
642*1fa6dee9SAndroid Build Coastguard Worker		{
643*1fa6dee9SAndroid Build Coastguard Worker			name: "Append pointer",
644*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S *struct{ S string } }{
645*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
646*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
647*1fa6dee9SAndroid Build Coastguard Worker				},
648*1fa6dee9SAndroid Build Coastguard Worker			},
649*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S *struct{ S string } }{
650*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
651*1fa6dee9SAndroid Build Coastguard Worker					S: "string2",
652*1fa6dee9SAndroid Build Coastguard Worker				},
653*1fa6dee9SAndroid Build Coastguard Worker			},
654*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S *struct{ S string } }{
655*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
656*1fa6dee9SAndroid Build Coastguard Worker					S: "string1string2",
657*1fa6dee9SAndroid Build Coastguard Worker				},
658*1fa6dee9SAndroid Build Coastguard Worker			},
659*1fa6dee9SAndroid Build Coastguard Worker		},
660*1fa6dee9SAndroid Build Coastguard Worker		{
661*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend pointer",
662*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S *struct{ S string } }{
663*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
664*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
665*1fa6dee9SAndroid Build Coastguard Worker				},
666*1fa6dee9SAndroid Build Coastguard Worker			},
667*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S *struct{ S string } }{
668*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
669*1fa6dee9SAndroid Build Coastguard Worker					S: "string2",
670*1fa6dee9SAndroid Build Coastguard Worker				},
671*1fa6dee9SAndroid Build Coastguard Worker			},
672*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S *struct{ S string } }{
673*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
674*1fa6dee9SAndroid Build Coastguard Worker					S: "string2string1",
675*1fa6dee9SAndroid Build Coastguard Worker				},
676*1fa6dee9SAndroid Build Coastguard Worker			},
677*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
678*1fa6dee9SAndroid Build Coastguard Worker		},
679*1fa6dee9SAndroid Build Coastguard Worker		{
680*1fa6dee9SAndroid Build Coastguard Worker			name: "Append interface",
681*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S interface{} }{
682*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
683*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
684*1fa6dee9SAndroid Build Coastguard Worker				},
685*1fa6dee9SAndroid Build Coastguard Worker			},
686*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S interface{} }{
687*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
688*1fa6dee9SAndroid Build Coastguard Worker					S: "string2",
689*1fa6dee9SAndroid Build Coastguard Worker				},
690*1fa6dee9SAndroid Build Coastguard Worker			},
691*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S interface{} }{
692*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
693*1fa6dee9SAndroid Build Coastguard Worker					S: "string1string2",
694*1fa6dee9SAndroid Build Coastguard Worker				},
695*1fa6dee9SAndroid Build Coastguard Worker			},
696*1fa6dee9SAndroid Build Coastguard Worker		},
697*1fa6dee9SAndroid Build Coastguard Worker		{
698*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend interface",
699*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S interface{} }{
700*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
701*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
702*1fa6dee9SAndroid Build Coastguard Worker				},
703*1fa6dee9SAndroid Build Coastguard Worker			},
704*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S interface{} }{
705*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
706*1fa6dee9SAndroid Build Coastguard Worker					S: "string2",
707*1fa6dee9SAndroid Build Coastguard Worker				},
708*1fa6dee9SAndroid Build Coastguard Worker			},
709*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S interface{} }{
710*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
711*1fa6dee9SAndroid Build Coastguard Worker					S: "string2string1",
712*1fa6dee9SAndroid Build Coastguard Worker				},
713*1fa6dee9SAndroid Build Coastguard Worker			},
714*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
715*1fa6dee9SAndroid Build Coastguard Worker		},
716*1fa6dee9SAndroid Build Coastguard Worker		{
717*1fa6dee9SAndroid Build Coastguard Worker			name: "Unexported field",
718*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ s string }{
719*1fa6dee9SAndroid Build Coastguard Worker				s: "string1",
720*1fa6dee9SAndroid Build Coastguard Worker			},
721*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ s string }{
722*1fa6dee9SAndroid Build Coastguard Worker				s: "string2",
723*1fa6dee9SAndroid Build Coastguard Worker			},
724*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ s string }{
725*1fa6dee9SAndroid Build Coastguard Worker				s: "string1",
726*1fa6dee9SAndroid Build Coastguard Worker			},
727*1fa6dee9SAndroid Build Coastguard Worker		},
728*1fa6dee9SAndroid Build Coastguard Worker		{
729*1fa6dee9SAndroid Build Coastguard Worker			name: "Unexported field",
730*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ i *int64 }{
731*1fa6dee9SAndroid Build Coastguard Worker				i: Int64Ptr(33),
732*1fa6dee9SAndroid Build Coastguard Worker			},
733*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ i *int64 }{
734*1fa6dee9SAndroid Build Coastguard Worker				i: Int64Ptr(5),
735*1fa6dee9SAndroid Build Coastguard Worker			},
736*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ i *int64 }{
737*1fa6dee9SAndroid Build Coastguard Worker				i: Int64Ptr(33),
738*1fa6dee9SAndroid Build Coastguard Worker			},
739*1fa6dee9SAndroid Build Coastguard Worker		},
740*1fa6dee9SAndroid Build Coastguard Worker		{
741*1fa6dee9SAndroid Build Coastguard Worker			name: "Empty struct",
742*1fa6dee9SAndroid Build Coastguard Worker			dst:  &struct{}{},
743*1fa6dee9SAndroid Build Coastguard Worker			src:  &struct{}{},
744*1fa6dee9SAndroid Build Coastguard Worker			out:  &struct{}{},
745*1fa6dee9SAndroid Build Coastguard Worker		},
746*1fa6dee9SAndroid Build Coastguard Worker		{
747*1fa6dee9SAndroid Build Coastguard Worker			name: "Interface nil",
748*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S interface{} }{
749*1fa6dee9SAndroid Build Coastguard Worker				S: nil,
750*1fa6dee9SAndroid Build Coastguard Worker			},
751*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S interface{} }{
752*1fa6dee9SAndroid Build Coastguard Worker				S: nil,
753*1fa6dee9SAndroid Build Coastguard Worker			},
754*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S interface{} }{
755*1fa6dee9SAndroid Build Coastguard Worker				S: nil,
756*1fa6dee9SAndroid Build Coastguard Worker			},
757*1fa6dee9SAndroid Build Coastguard Worker		},
758*1fa6dee9SAndroid Build Coastguard Worker		{
759*1fa6dee9SAndroid Build Coastguard Worker			name: "Pointer nil",
760*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S *struct{} }{
761*1fa6dee9SAndroid Build Coastguard Worker				S: nil,
762*1fa6dee9SAndroid Build Coastguard Worker			},
763*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S *struct{} }{
764*1fa6dee9SAndroid Build Coastguard Worker				S: nil,
765*1fa6dee9SAndroid Build Coastguard Worker			},
766*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S *struct{} }{
767*1fa6dee9SAndroid Build Coastguard Worker				S: nil,
768*1fa6dee9SAndroid Build Coastguard Worker			},
769*1fa6dee9SAndroid Build Coastguard Worker		},
770*1fa6dee9SAndroid Build Coastguard Worker		{
771*1fa6dee9SAndroid Build Coastguard Worker			name: "Anonymous struct",
772*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct {
773*1fa6dee9SAndroid Build Coastguard Worker				EmbeddedStruct
774*1fa6dee9SAndroid Build Coastguard Worker				Nested struct{ EmbeddedStruct }
775*1fa6dee9SAndroid Build Coastguard Worker			}{
776*1fa6dee9SAndroid Build Coastguard Worker				EmbeddedStruct: EmbeddedStruct{
777*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
778*1fa6dee9SAndroid Build Coastguard Worker					I: Int64Ptr(55),
779*1fa6dee9SAndroid Build Coastguard Worker				},
780*1fa6dee9SAndroid Build Coastguard Worker				Nested: struct{ EmbeddedStruct }{
781*1fa6dee9SAndroid Build Coastguard Worker					EmbeddedStruct: EmbeddedStruct{
782*1fa6dee9SAndroid Build Coastguard Worker						S: "string2",
783*1fa6dee9SAndroid Build Coastguard Worker						I: Int64Ptr(-4),
784*1fa6dee9SAndroid Build Coastguard Worker					},
785*1fa6dee9SAndroid Build Coastguard Worker				},
786*1fa6dee9SAndroid Build Coastguard Worker			},
787*1fa6dee9SAndroid Build Coastguard Worker			src: &struct {
788*1fa6dee9SAndroid Build Coastguard Worker				EmbeddedStruct
789*1fa6dee9SAndroid Build Coastguard Worker				Nested struct{ EmbeddedStruct }
790*1fa6dee9SAndroid Build Coastguard Worker			}{
791*1fa6dee9SAndroid Build Coastguard Worker				EmbeddedStruct: EmbeddedStruct{
792*1fa6dee9SAndroid Build Coastguard Worker					S: "string3",
793*1fa6dee9SAndroid Build Coastguard Worker					I: Int64Ptr(66),
794*1fa6dee9SAndroid Build Coastguard Worker				},
795*1fa6dee9SAndroid Build Coastguard Worker				Nested: struct{ EmbeddedStruct }{
796*1fa6dee9SAndroid Build Coastguard Worker					EmbeddedStruct: EmbeddedStruct{
797*1fa6dee9SAndroid Build Coastguard Worker						S: "string4",
798*1fa6dee9SAndroid Build Coastguard Worker						I: Int64Ptr(-8),
799*1fa6dee9SAndroid Build Coastguard Worker					},
800*1fa6dee9SAndroid Build Coastguard Worker				},
801*1fa6dee9SAndroid Build Coastguard Worker			},
802*1fa6dee9SAndroid Build Coastguard Worker			out: &struct {
803*1fa6dee9SAndroid Build Coastguard Worker				EmbeddedStruct
804*1fa6dee9SAndroid Build Coastguard Worker				Nested struct{ EmbeddedStruct }
805*1fa6dee9SAndroid Build Coastguard Worker			}{
806*1fa6dee9SAndroid Build Coastguard Worker				EmbeddedStruct: EmbeddedStruct{
807*1fa6dee9SAndroid Build Coastguard Worker					S: "string1string3",
808*1fa6dee9SAndroid Build Coastguard Worker					I: Int64Ptr(66),
809*1fa6dee9SAndroid Build Coastguard Worker				},
810*1fa6dee9SAndroid Build Coastguard Worker				Nested: struct{ EmbeddedStruct }{
811*1fa6dee9SAndroid Build Coastguard Worker					EmbeddedStruct: EmbeddedStruct{
812*1fa6dee9SAndroid Build Coastguard Worker						S: "string2string4",
813*1fa6dee9SAndroid Build Coastguard Worker						I: Int64Ptr(-8),
814*1fa6dee9SAndroid Build Coastguard Worker					},
815*1fa6dee9SAndroid Build Coastguard Worker				},
816*1fa6dee9SAndroid Build Coastguard Worker			},
817*1fa6dee9SAndroid Build Coastguard Worker		},
818*1fa6dee9SAndroid Build Coastguard Worker		{
819*1fa6dee9SAndroid Build Coastguard Worker			name: "BlueprintEmbed struct",
820*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct {
821*1fa6dee9SAndroid Build Coastguard Worker				BlueprintEmbed EmbeddedStruct
822*1fa6dee9SAndroid Build Coastguard Worker				Nested         struct{ BlueprintEmbed EmbeddedStruct }
823*1fa6dee9SAndroid Build Coastguard Worker			}{
824*1fa6dee9SAndroid Build Coastguard Worker				BlueprintEmbed: EmbeddedStruct{
825*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
826*1fa6dee9SAndroid Build Coastguard Worker					I: Int64Ptr(55),
827*1fa6dee9SAndroid Build Coastguard Worker				},
828*1fa6dee9SAndroid Build Coastguard Worker				Nested: struct{ BlueprintEmbed EmbeddedStruct }{
829*1fa6dee9SAndroid Build Coastguard Worker					BlueprintEmbed: EmbeddedStruct{
830*1fa6dee9SAndroid Build Coastguard Worker						S: "string2",
831*1fa6dee9SAndroid Build Coastguard Worker						I: Int64Ptr(-4),
832*1fa6dee9SAndroid Build Coastguard Worker					},
833*1fa6dee9SAndroid Build Coastguard Worker				},
834*1fa6dee9SAndroid Build Coastguard Worker			},
835*1fa6dee9SAndroid Build Coastguard Worker			src: &struct {
836*1fa6dee9SAndroid Build Coastguard Worker				BlueprintEmbed EmbeddedStruct
837*1fa6dee9SAndroid Build Coastguard Worker				Nested         struct{ BlueprintEmbed EmbeddedStruct }
838*1fa6dee9SAndroid Build Coastguard Worker			}{
839*1fa6dee9SAndroid Build Coastguard Worker				BlueprintEmbed: EmbeddedStruct{
840*1fa6dee9SAndroid Build Coastguard Worker					S: "string3",
841*1fa6dee9SAndroid Build Coastguard Worker					I: Int64Ptr(66),
842*1fa6dee9SAndroid Build Coastguard Worker				},
843*1fa6dee9SAndroid Build Coastguard Worker				Nested: struct{ BlueprintEmbed EmbeddedStruct }{
844*1fa6dee9SAndroid Build Coastguard Worker					BlueprintEmbed: EmbeddedStruct{
845*1fa6dee9SAndroid Build Coastguard Worker						S: "string4",
846*1fa6dee9SAndroid Build Coastguard Worker						I: Int64Ptr(-8),
847*1fa6dee9SAndroid Build Coastguard Worker					},
848*1fa6dee9SAndroid Build Coastguard Worker				},
849*1fa6dee9SAndroid Build Coastguard Worker			},
850*1fa6dee9SAndroid Build Coastguard Worker			out: &struct {
851*1fa6dee9SAndroid Build Coastguard Worker				BlueprintEmbed EmbeddedStruct
852*1fa6dee9SAndroid Build Coastguard Worker				Nested         struct{ BlueprintEmbed EmbeddedStruct }
853*1fa6dee9SAndroid Build Coastguard Worker			}{
854*1fa6dee9SAndroid Build Coastguard Worker				BlueprintEmbed: EmbeddedStruct{
855*1fa6dee9SAndroid Build Coastguard Worker					S: "string1string3",
856*1fa6dee9SAndroid Build Coastguard Worker					I: Int64Ptr(66),
857*1fa6dee9SAndroid Build Coastguard Worker				},
858*1fa6dee9SAndroid Build Coastguard Worker				Nested: struct{ BlueprintEmbed EmbeddedStruct }{
859*1fa6dee9SAndroid Build Coastguard Worker					BlueprintEmbed: EmbeddedStruct{
860*1fa6dee9SAndroid Build Coastguard Worker						S: "string2string4",
861*1fa6dee9SAndroid Build Coastguard Worker						I: Int64Ptr(-8),
862*1fa6dee9SAndroid Build Coastguard Worker					},
863*1fa6dee9SAndroid Build Coastguard Worker				},
864*1fa6dee9SAndroid Build Coastguard Worker			},
865*1fa6dee9SAndroid Build Coastguard Worker		},
866*1fa6dee9SAndroid Build Coastguard Worker		{
867*1fa6dee9SAndroid Build Coastguard Worker			name: "Anonymous interface",
868*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct {
869*1fa6dee9SAndroid Build Coastguard Worker				EmbeddedInterface
870*1fa6dee9SAndroid Build Coastguard Worker				Nested struct{ EmbeddedInterface }
871*1fa6dee9SAndroid Build Coastguard Worker			}{
872*1fa6dee9SAndroid Build Coastguard Worker				EmbeddedInterface: &struct {
873*1fa6dee9SAndroid Build Coastguard Worker					S string
874*1fa6dee9SAndroid Build Coastguard Worker					I *int64
875*1fa6dee9SAndroid Build Coastguard Worker				}{
876*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
877*1fa6dee9SAndroid Build Coastguard Worker					I: Int64Ptr(-8),
878*1fa6dee9SAndroid Build Coastguard Worker				},
879*1fa6dee9SAndroid Build Coastguard Worker				Nested: struct{ EmbeddedInterface }{
880*1fa6dee9SAndroid Build Coastguard Worker					EmbeddedInterface: &struct {
881*1fa6dee9SAndroid Build Coastguard Worker						S string
882*1fa6dee9SAndroid Build Coastguard Worker						I *int64
883*1fa6dee9SAndroid Build Coastguard Worker					}{
884*1fa6dee9SAndroid Build Coastguard Worker						S: "string2",
885*1fa6dee9SAndroid Build Coastguard Worker						I: Int64Ptr(55),
886*1fa6dee9SAndroid Build Coastguard Worker					},
887*1fa6dee9SAndroid Build Coastguard Worker				},
888*1fa6dee9SAndroid Build Coastguard Worker			},
889*1fa6dee9SAndroid Build Coastguard Worker			src: &struct {
890*1fa6dee9SAndroid Build Coastguard Worker				EmbeddedInterface
891*1fa6dee9SAndroid Build Coastguard Worker				Nested struct{ EmbeddedInterface }
892*1fa6dee9SAndroid Build Coastguard Worker			}{
893*1fa6dee9SAndroid Build Coastguard Worker				EmbeddedInterface: &struct {
894*1fa6dee9SAndroid Build Coastguard Worker					S string
895*1fa6dee9SAndroid Build Coastguard Worker					I *int64
896*1fa6dee9SAndroid Build Coastguard Worker				}{
897*1fa6dee9SAndroid Build Coastguard Worker					S: "string3",
898*1fa6dee9SAndroid Build Coastguard Worker					I: Int64Ptr(6),
899*1fa6dee9SAndroid Build Coastguard Worker				},
900*1fa6dee9SAndroid Build Coastguard Worker				Nested: struct{ EmbeddedInterface }{
901*1fa6dee9SAndroid Build Coastguard Worker					EmbeddedInterface: &struct {
902*1fa6dee9SAndroid Build Coastguard Worker						S string
903*1fa6dee9SAndroid Build Coastguard Worker						I *int64
904*1fa6dee9SAndroid Build Coastguard Worker					}{
905*1fa6dee9SAndroid Build Coastguard Worker						S: "string4",
906*1fa6dee9SAndroid Build Coastguard Worker						I: Int64Ptr(6),
907*1fa6dee9SAndroid Build Coastguard Worker					},
908*1fa6dee9SAndroid Build Coastguard Worker				},
909*1fa6dee9SAndroid Build Coastguard Worker			},
910*1fa6dee9SAndroid Build Coastguard Worker			out: &struct {
911*1fa6dee9SAndroid Build Coastguard Worker				EmbeddedInterface
912*1fa6dee9SAndroid Build Coastguard Worker				Nested struct{ EmbeddedInterface }
913*1fa6dee9SAndroid Build Coastguard Worker			}{
914*1fa6dee9SAndroid Build Coastguard Worker				EmbeddedInterface: &struct {
915*1fa6dee9SAndroid Build Coastguard Worker					S string
916*1fa6dee9SAndroid Build Coastguard Worker					I *int64
917*1fa6dee9SAndroid Build Coastguard Worker				}{
918*1fa6dee9SAndroid Build Coastguard Worker					S: "string1string3",
919*1fa6dee9SAndroid Build Coastguard Worker					I: Int64Ptr(6),
920*1fa6dee9SAndroid Build Coastguard Worker				},
921*1fa6dee9SAndroid Build Coastguard Worker				Nested: struct{ EmbeddedInterface }{
922*1fa6dee9SAndroid Build Coastguard Worker					EmbeddedInterface: &struct {
923*1fa6dee9SAndroid Build Coastguard Worker						S string
924*1fa6dee9SAndroid Build Coastguard Worker						I *int64
925*1fa6dee9SAndroid Build Coastguard Worker					}{
926*1fa6dee9SAndroid Build Coastguard Worker						S: "string2string4",
927*1fa6dee9SAndroid Build Coastguard Worker						I: Int64Ptr(6),
928*1fa6dee9SAndroid Build Coastguard Worker					},
929*1fa6dee9SAndroid Build Coastguard Worker				},
930*1fa6dee9SAndroid Build Coastguard Worker			},
931*1fa6dee9SAndroid Build Coastguard Worker		},
932*1fa6dee9SAndroid Build Coastguard Worker		{
933*1fa6dee9SAndroid Build Coastguard Worker			name: "Nil pointer to a struct",
934*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct {
935*1fa6dee9SAndroid Build Coastguard Worker				Nested *struct {
936*1fa6dee9SAndroid Build Coastguard Worker					S string
937*1fa6dee9SAndroid Build Coastguard Worker				}
938*1fa6dee9SAndroid Build Coastguard Worker			}{},
939*1fa6dee9SAndroid Build Coastguard Worker			src: &struct {
940*1fa6dee9SAndroid Build Coastguard Worker				Nested *struct {
941*1fa6dee9SAndroid Build Coastguard Worker					S string
942*1fa6dee9SAndroid Build Coastguard Worker				}
943*1fa6dee9SAndroid Build Coastguard Worker			}{
944*1fa6dee9SAndroid Build Coastguard Worker				Nested: &struct {
945*1fa6dee9SAndroid Build Coastguard Worker					S string
946*1fa6dee9SAndroid Build Coastguard Worker				}{
947*1fa6dee9SAndroid Build Coastguard Worker					S: "string",
948*1fa6dee9SAndroid Build Coastguard Worker				},
949*1fa6dee9SAndroid Build Coastguard Worker			},
950*1fa6dee9SAndroid Build Coastguard Worker			out: &struct {
951*1fa6dee9SAndroid Build Coastguard Worker				Nested *struct {
952*1fa6dee9SAndroid Build Coastguard Worker					S string
953*1fa6dee9SAndroid Build Coastguard Worker				}
954*1fa6dee9SAndroid Build Coastguard Worker			}{
955*1fa6dee9SAndroid Build Coastguard Worker				Nested: &struct {
956*1fa6dee9SAndroid Build Coastguard Worker					S string
957*1fa6dee9SAndroid Build Coastguard Worker				}{
958*1fa6dee9SAndroid Build Coastguard Worker					S: "string",
959*1fa6dee9SAndroid Build Coastguard Worker				},
960*1fa6dee9SAndroid Build Coastguard Worker			},
961*1fa6dee9SAndroid Build Coastguard Worker		},
962*1fa6dee9SAndroid Build Coastguard Worker		{
963*1fa6dee9SAndroid Build Coastguard Worker			name: "Nil pointer to a struct in an interface",
964*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct {
965*1fa6dee9SAndroid Build Coastguard Worker				Nested interface{}
966*1fa6dee9SAndroid Build Coastguard Worker			}{
967*1fa6dee9SAndroid Build Coastguard Worker				Nested: (*struct{ S string })(nil),
968*1fa6dee9SAndroid Build Coastguard Worker			},
969*1fa6dee9SAndroid Build Coastguard Worker			src: &struct {
970*1fa6dee9SAndroid Build Coastguard Worker				Nested interface{}
971*1fa6dee9SAndroid Build Coastguard Worker			}{
972*1fa6dee9SAndroid Build Coastguard Worker				Nested: &struct {
973*1fa6dee9SAndroid Build Coastguard Worker					S string
974*1fa6dee9SAndroid Build Coastguard Worker				}{
975*1fa6dee9SAndroid Build Coastguard Worker					S: "string",
976*1fa6dee9SAndroid Build Coastguard Worker				},
977*1fa6dee9SAndroid Build Coastguard Worker			},
978*1fa6dee9SAndroid Build Coastguard Worker			out: &struct {
979*1fa6dee9SAndroid Build Coastguard Worker				Nested interface{}
980*1fa6dee9SAndroid Build Coastguard Worker			}{
981*1fa6dee9SAndroid Build Coastguard Worker				Nested: &struct {
982*1fa6dee9SAndroid Build Coastguard Worker					S string
983*1fa6dee9SAndroid Build Coastguard Worker				}{
984*1fa6dee9SAndroid Build Coastguard Worker					S: "string",
985*1fa6dee9SAndroid Build Coastguard Worker				},
986*1fa6dee9SAndroid Build Coastguard Worker			},
987*1fa6dee9SAndroid Build Coastguard Worker		},
988*1fa6dee9SAndroid Build Coastguard Worker		{
989*1fa6dee9SAndroid Build Coastguard Worker			name: "Interface src nil",
990*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S interface{} }{
991*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
992*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
993*1fa6dee9SAndroid Build Coastguard Worker				},
994*1fa6dee9SAndroid Build Coastguard Worker			},
995*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S interface{} }{
996*1fa6dee9SAndroid Build Coastguard Worker				S: nil,
997*1fa6dee9SAndroid Build Coastguard Worker			},
998*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S interface{} }{
999*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
1000*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
1001*1fa6dee9SAndroid Build Coastguard Worker				},
1002*1fa6dee9SAndroid Build Coastguard Worker			},
1003*1fa6dee9SAndroid Build Coastguard Worker		},
1004*1fa6dee9SAndroid Build Coastguard Worker
1005*1fa6dee9SAndroid Build Coastguard Worker		// Errors
1006*1fa6dee9SAndroid Build Coastguard Worker
1007*1fa6dee9SAndroid Build Coastguard Worker		{
1008*1fa6dee9SAndroid Build Coastguard Worker			name: "Non-pointer dst",
1009*1fa6dee9SAndroid Build Coastguard Worker			dst:  struct{}{},
1010*1fa6dee9SAndroid Build Coastguard Worker			src:  &struct{}{},
1011*1fa6dee9SAndroid Build Coastguard Worker			err:  errors.New("expected pointer to struct, got struct {}"),
1012*1fa6dee9SAndroid Build Coastguard Worker			out:  struct{}{},
1013*1fa6dee9SAndroid Build Coastguard Worker		},
1014*1fa6dee9SAndroid Build Coastguard Worker		{
1015*1fa6dee9SAndroid Build Coastguard Worker			name: "Non-pointer src",
1016*1fa6dee9SAndroid Build Coastguard Worker			dst:  &struct{}{},
1017*1fa6dee9SAndroid Build Coastguard Worker			src:  struct{}{},
1018*1fa6dee9SAndroid Build Coastguard Worker			err:  errors.New("expected pointer to struct, got struct {}"),
1019*1fa6dee9SAndroid Build Coastguard Worker			out:  &struct{}{},
1020*1fa6dee9SAndroid Build Coastguard Worker		},
1021*1fa6dee9SAndroid Build Coastguard Worker		{
1022*1fa6dee9SAndroid Build Coastguard Worker			name: "Non-struct dst",
1023*1fa6dee9SAndroid Build Coastguard Worker			dst:  &[]string{"bad"},
1024*1fa6dee9SAndroid Build Coastguard Worker			src:  &struct{}{},
1025*1fa6dee9SAndroid Build Coastguard Worker			err:  errors.New("expected pointer to struct, got *[]string"),
1026*1fa6dee9SAndroid Build Coastguard Worker			out:  &[]string{"bad"},
1027*1fa6dee9SAndroid Build Coastguard Worker		},
1028*1fa6dee9SAndroid Build Coastguard Worker		{
1029*1fa6dee9SAndroid Build Coastguard Worker			name: "Non-struct src",
1030*1fa6dee9SAndroid Build Coastguard Worker			dst:  &struct{}{},
1031*1fa6dee9SAndroid Build Coastguard Worker			src:  &[]string{"bad"},
1032*1fa6dee9SAndroid Build Coastguard Worker			err:  errors.New("expected pointer to struct, got *[]string"),
1033*1fa6dee9SAndroid Build Coastguard Worker			out:  &struct{}{},
1034*1fa6dee9SAndroid Build Coastguard Worker		},
1035*1fa6dee9SAndroid Build Coastguard Worker		{
1036*1fa6dee9SAndroid Build Coastguard Worker			name: "Mismatched types",
1037*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ A string }{
1038*1fa6dee9SAndroid Build Coastguard Worker				A: "string1",
1039*1fa6dee9SAndroid Build Coastguard Worker			},
1040*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ B string }{
1041*1fa6dee9SAndroid Build Coastguard Worker				B: "string2",
1042*1fa6dee9SAndroid Build Coastguard Worker			},
1043*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ A string }{
1044*1fa6dee9SAndroid Build Coastguard Worker				A: "string1",
1045*1fa6dee9SAndroid Build Coastguard Worker			},
1046*1fa6dee9SAndroid Build Coastguard Worker			err: errors.New("expected matching types for dst and src, got *struct { A string } and *struct { B string }"),
1047*1fa6dee9SAndroid Build Coastguard Worker		},
1048*1fa6dee9SAndroid Build Coastguard Worker		{
1049*1fa6dee9SAndroid Build Coastguard Worker			name: "Unsupported kind",
1050*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ I int }{
1051*1fa6dee9SAndroid Build Coastguard Worker				I: 1,
1052*1fa6dee9SAndroid Build Coastguard Worker			},
1053*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ I int }{
1054*1fa6dee9SAndroid Build Coastguard Worker				I: 2,
1055*1fa6dee9SAndroid Build Coastguard Worker			},
1056*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ I int }{
1057*1fa6dee9SAndroid Build Coastguard Worker				I: 1,
1058*1fa6dee9SAndroid Build Coastguard Worker			},
1059*1fa6dee9SAndroid Build Coastguard Worker			err: extendPropertyErrorf("i", "unsupported kind int"),
1060*1fa6dee9SAndroid Build Coastguard Worker		},
1061*1fa6dee9SAndroid Build Coastguard Worker		{
1062*1fa6dee9SAndroid Build Coastguard Worker			name: "Unsupported kind",
1063*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ I int64 }{
1064*1fa6dee9SAndroid Build Coastguard Worker				I: 1,
1065*1fa6dee9SAndroid Build Coastguard Worker			},
1066*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ I int64 }{
1067*1fa6dee9SAndroid Build Coastguard Worker				I: 2,
1068*1fa6dee9SAndroid Build Coastguard Worker			},
1069*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ I int64 }{
1070*1fa6dee9SAndroid Build Coastguard Worker				I: 1,
1071*1fa6dee9SAndroid Build Coastguard Worker			},
1072*1fa6dee9SAndroid Build Coastguard Worker			err: extendPropertyErrorf("i", "unsupported kind int64"),
1073*1fa6dee9SAndroid Build Coastguard Worker		},
1074*1fa6dee9SAndroid Build Coastguard Worker		{
1075*1fa6dee9SAndroid Build Coastguard Worker			name: "Interface nilitude mismatch",
1076*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S interface{} }{
1077*1fa6dee9SAndroid Build Coastguard Worker				S: nil,
1078*1fa6dee9SAndroid Build Coastguard Worker			},
1079*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S interface{} }{
1080*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
1081*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
1082*1fa6dee9SAndroid Build Coastguard Worker				},
1083*1fa6dee9SAndroid Build Coastguard Worker			},
1084*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S interface{} }{
1085*1fa6dee9SAndroid Build Coastguard Worker				S: nil,
1086*1fa6dee9SAndroid Build Coastguard Worker			},
1087*1fa6dee9SAndroid Build Coastguard Worker			err: extendPropertyErrorf("s", "nilitude mismatch"),
1088*1fa6dee9SAndroid Build Coastguard Worker		},
1089*1fa6dee9SAndroid Build Coastguard Worker		{
1090*1fa6dee9SAndroid Build Coastguard Worker			name: "Interface type mismatch",
1091*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S interface{} }{
1092*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ A string }{
1093*1fa6dee9SAndroid Build Coastguard Worker					A: "string1",
1094*1fa6dee9SAndroid Build Coastguard Worker				},
1095*1fa6dee9SAndroid Build Coastguard Worker			},
1096*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S interface{} }{
1097*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ B string }{
1098*1fa6dee9SAndroid Build Coastguard Worker					B: "string2",
1099*1fa6dee9SAndroid Build Coastguard Worker				},
1100*1fa6dee9SAndroid Build Coastguard Worker			},
1101*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S interface{} }{
1102*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ A string }{
1103*1fa6dee9SAndroid Build Coastguard Worker					A: "string1",
1104*1fa6dee9SAndroid Build Coastguard Worker				},
1105*1fa6dee9SAndroid Build Coastguard Worker			},
1106*1fa6dee9SAndroid Build Coastguard Worker			err: extendPropertyErrorf("s", "mismatched types struct { A string } and struct { B string }"),
1107*1fa6dee9SAndroid Build Coastguard Worker		},
1108*1fa6dee9SAndroid Build Coastguard Worker		{
1109*1fa6dee9SAndroid Build Coastguard Worker			name: "Interface not a pointer",
1110*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S interface{} }{
1111*1fa6dee9SAndroid Build Coastguard Worker				S: struct{ S string }{
1112*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
1113*1fa6dee9SAndroid Build Coastguard Worker				},
1114*1fa6dee9SAndroid Build Coastguard Worker			},
1115*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S interface{} }{
1116*1fa6dee9SAndroid Build Coastguard Worker				S: struct{ S string }{
1117*1fa6dee9SAndroid Build Coastguard Worker					S: "string2",
1118*1fa6dee9SAndroid Build Coastguard Worker				},
1119*1fa6dee9SAndroid Build Coastguard Worker			},
1120*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S interface{} }{
1121*1fa6dee9SAndroid Build Coastguard Worker				S: struct{ S string }{
1122*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
1123*1fa6dee9SAndroid Build Coastguard Worker				},
1124*1fa6dee9SAndroid Build Coastguard Worker			},
1125*1fa6dee9SAndroid Build Coastguard Worker			err: extendPropertyErrorf("s", "interface not a pointer"),
1126*1fa6dee9SAndroid Build Coastguard Worker		},
1127*1fa6dee9SAndroid Build Coastguard Worker		{
1128*1fa6dee9SAndroid Build Coastguard Worker			name: "Pointer not a struct",
1129*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S *[]string }{
1130*1fa6dee9SAndroid Build Coastguard Worker				S: &[]string{"string1"},
1131*1fa6dee9SAndroid Build Coastguard Worker			},
1132*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S *[]string }{
1133*1fa6dee9SAndroid Build Coastguard Worker				S: &[]string{"string2"},
1134*1fa6dee9SAndroid Build Coastguard Worker			},
1135*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S *[]string }{
1136*1fa6dee9SAndroid Build Coastguard Worker				S: &[]string{"string1"},
1137*1fa6dee9SAndroid Build Coastguard Worker			},
1138*1fa6dee9SAndroid Build Coastguard Worker			err: extendPropertyErrorf("s", "pointer is a slice"),
1139*1fa6dee9SAndroid Build Coastguard Worker		},
1140*1fa6dee9SAndroid Build Coastguard Worker		{
1141*1fa6dee9SAndroid Build Coastguard Worker			name: "Error in nested struct",
1142*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S interface{} }{
1143*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ I int }{
1144*1fa6dee9SAndroid Build Coastguard Worker					I: 1,
1145*1fa6dee9SAndroid Build Coastguard Worker				},
1146*1fa6dee9SAndroid Build Coastguard Worker			},
1147*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S interface{} }{
1148*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ I int }{
1149*1fa6dee9SAndroid Build Coastguard Worker					I: 2,
1150*1fa6dee9SAndroid Build Coastguard Worker				},
1151*1fa6dee9SAndroid Build Coastguard Worker			},
1152*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S interface{} }{
1153*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ I int }{
1154*1fa6dee9SAndroid Build Coastguard Worker					I: 1,
1155*1fa6dee9SAndroid Build Coastguard Worker				},
1156*1fa6dee9SAndroid Build Coastguard Worker			},
1157*1fa6dee9SAndroid Build Coastguard Worker			err: extendPropertyErrorf("s.i", "unsupported kind int"),
1158*1fa6dee9SAndroid Build Coastguard Worker		},
1159*1fa6dee9SAndroid Build Coastguard Worker
1160*1fa6dee9SAndroid Build Coastguard Worker		// Filters
1161*1fa6dee9SAndroid Build Coastguard Worker
1162*1fa6dee9SAndroid Build Coastguard Worker		{
1163*1fa6dee9SAndroid Build Coastguard Worker			name: "Filter true",
1164*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S string }{
1165*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
1166*1fa6dee9SAndroid Build Coastguard Worker			},
1167*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1168*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1169*1fa6dee9SAndroid Build Coastguard Worker			},
1170*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S string }{
1171*1fa6dee9SAndroid Build Coastguard Worker				S: "string1string2",
1172*1fa6dee9SAndroid Build Coastguard Worker			},
1173*1fa6dee9SAndroid Build Coastguard Worker			filter: func(dstField, srcField reflect.StructField) (bool, error) {
1174*1fa6dee9SAndroid Build Coastguard Worker				return true, nil
1175*1fa6dee9SAndroid Build Coastguard Worker			},
1176*1fa6dee9SAndroid Build Coastguard Worker		},
1177*1fa6dee9SAndroid Build Coastguard Worker		{
1178*1fa6dee9SAndroid Build Coastguard Worker			name: "Filter false",
1179*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S string }{
1180*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
1181*1fa6dee9SAndroid Build Coastguard Worker			},
1182*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1183*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1184*1fa6dee9SAndroid Build Coastguard Worker			},
1185*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S string }{
1186*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
1187*1fa6dee9SAndroid Build Coastguard Worker			},
1188*1fa6dee9SAndroid Build Coastguard Worker			filter: func(dstField, srcField reflect.StructField) (bool, error) {
1189*1fa6dee9SAndroid Build Coastguard Worker				return false, nil
1190*1fa6dee9SAndroid Build Coastguard Worker			},
1191*1fa6dee9SAndroid Build Coastguard Worker		},
1192*1fa6dee9SAndroid Build Coastguard Worker		{
1193*1fa6dee9SAndroid Build Coastguard Worker			name: "Filter check args",
1194*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S string }{
1195*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
1196*1fa6dee9SAndroid Build Coastguard Worker			},
1197*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1198*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1199*1fa6dee9SAndroid Build Coastguard Worker			},
1200*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S string }{
1201*1fa6dee9SAndroid Build Coastguard Worker				S: "string1string2",
1202*1fa6dee9SAndroid Build Coastguard Worker			},
1203*1fa6dee9SAndroid Build Coastguard Worker			filter: func(dstField, srcField reflect.StructField) (bool, error) {
1204*1fa6dee9SAndroid Build Coastguard Worker				return dstField.Name == "S" && srcField.Name == "S", nil
1205*1fa6dee9SAndroid Build Coastguard Worker			},
1206*1fa6dee9SAndroid Build Coastguard Worker		},
1207*1fa6dee9SAndroid Build Coastguard Worker		{
1208*1fa6dee9SAndroid Build Coastguard Worker			name: "Filter mutated",
1209*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct {
1210*1fa6dee9SAndroid Build Coastguard Worker				S string `blueprint:"mutated"`
1211*1fa6dee9SAndroid Build Coastguard Worker			}{
1212*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
1213*1fa6dee9SAndroid Build Coastguard Worker			},
1214*1fa6dee9SAndroid Build Coastguard Worker			src: &struct {
1215*1fa6dee9SAndroid Build Coastguard Worker				S string `blueprint:"mutated"`
1216*1fa6dee9SAndroid Build Coastguard Worker			}{
1217*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1218*1fa6dee9SAndroid Build Coastguard Worker			},
1219*1fa6dee9SAndroid Build Coastguard Worker			out: &struct {
1220*1fa6dee9SAndroid Build Coastguard Worker				S string `blueprint:"mutated"`
1221*1fa6dee9SAndroid Build Coastguard Worker			}{
1222*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
1223*1fa6dee9SAndroid Build Coastguard Worker			},
1224*1fa6dee9SAndroid Build Coastguard Worker		},
1225*1fa6dee9SAndroid Build Coastguard Worker		{
1226*1fa6dee9SAndroid Build Coastguard Worker			name: "Filter mutated",
1227*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct {
1228*1fa6dee9SAndroid Build Coastguard Worker				S *int64 `blueprint:"mutated"`
1229*1fa6dee9SAndroid Build Coastguard Worker			}{
1230*1fa6dee9SAndroid Build Coastguard Worker				S: Int64Ptr(4),
1231*1fa6dee9SAndroid Build Coastguard Worker			},
1232*1fa6dee9SAndroid Build Coastguard Worker			src: &struct {
1233*1fa6dee9SAndroid Build Coastguard Worker				S *int64 `blueprint:"mutated"`
1234*1fa6dee9SAndroid Build Coastguard Worker			}{
1235*1fa6dee9SAndroid Build Coastguard Worker				S: Int64Ptr(5),
1236*1fa6dee9SAndroid Build Coastguard Worker			},
1237*1fa6dee9SAndroid Build Coastguard Worker			out: &struct {
1238*1fa6dee9SAndroid Build Coastguard Worker				S *int64 `blueprint:"mutated"`
1239*1fa6dee9SAndroid Build Coastguard Worker			}{
1240*1fa6dee9SAndroid Build Coastguard Worker				S: Int64Ptr(4),
1241*1fa6dee9SAndroid Build Coastguard Worker			},
1242*1fa6dee9SAndroid Build Coastguard Worker		},
1243*1fa6dee9SAndroid Build Coastguard Worker		{
1244*1fa6dee9SAndroid Build Coastguard Worker			name: "Filter error",
1245*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S string }{
1246*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
1247*1fa6dee9SAndroid Build Coastguard Worker			},
1248*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1249*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1250*1fa6dee9SAndroid Build Coastguard Worker			},
1251*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S string }{
1252*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
1253*1fa6dee9SAndroid Build Coastguard Worker			},
1254*1fa6dee9SAndroid Build Coastguard Worker			filter: func(dstField, srcField reflect.StructField) (bool, error) {
1255*1fa6dee9SAndroid Build Coastguard Worker				return true, fmt.Errorf("filter error")
1256*1fa6dee9SAndroid Build Coastguard Worker			},
1257*1fa6dee9SAndroid Build Coastguard Worker			err: extendPropertyErrorf("s", "filter error"),
1258*1fa6dee9SAndroid Build Coastguard Worker		},
1259*1fa6dee9SAndroid Build Coastguard Worker		{
1260*1fa6dee9SAndroid Build Coastguard Worker			name: "Append configurable",
1261*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S Configurable[[]string] }{
1262*1fa6dee9SAndroid Build Coastguard Worker				S: NewConfigurable[[]string]([]ConfigurableCondition{{
1263*1fa6dee9SAndroid Build Coastguard Worker					functionName: "soong_config_variable",
1264*1fa6dee9SAndroid Build Coastguard Worker					args: []string{
1265*1fa6dee9SAndroid Build Coastguard Worker						"my_namespace",
1266*1fa6dee9SAndroid Build Coastguard Worker						"foo",
1267*1fa6dee9SAndroid Build Coastguard Worker					},
1268*1fa6dee9SAndroid Build Coastguard Worker				}},
1269*1fa6dee9SAndroid Build Coastguard Worker					[]ConfigurableCase[[]string]{{
1270*1fa6dee9SAndroid Build Coastguard Worker						patterns: []ConfigurablePattern{{
1271*1fa6dee9SAndroid Build Coastguard Worker							typ:         configurablePatternTypeString,
1272*1fa6dee9SAndroid Build Coastguard Worker							stringValue: "a",
1273*1fa6dee9SAndroid Build Coastguard Worker						}},
1274*1fa6dee9SAndroid Build Coastguard Worker						value: &parser.List{Values: []parser.Expression{
1275*1fa6dee9SAndroid Build Coastguard Worker							&parser.String{Value: "1"},
1276*1fa6dee9SAndroid Build Coastguard Worker							&parser.String{Value: "2"},
1277*1fa6dee9SAndroid Build Coastguard Worker						}},
1278*1fa6dee9SAndroid Build Coastguard Worker					}},
1279*1fa6dee9SAndroid Build Coastguard Worker				),
1280*1fa6dee9SAndroid Build Coastguard Worker			},
1281*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S Configurable[[]string] }{
1282*1fa6dee9SAndroid Build Coastguard Worker				S: NewConfigurable([]ConfigurableCondition{{
1283*1fa6dee9SAndroid Build Coastguard Worker					functionName: "release_variable",
1284*1fa6dee9SAndroid Build Coastguard Worker					args: []string{
1285*1fa6dee9SAndroid Build Coastguard Worker						"bar",
1286*1fa6dee9SAndroid Build Coastguard Worker					},
1287*1fa6dee9SAndroid Build Coastguard Worker				}},
1288*1fa6dee9SAndroid Build Coastguard Worker					[]ConfigurableCase[[]string]{{
1289*1fa6dee9SAndroid Build Coastguard Worker						patterns: []ConfigurablePattern{{
1290*1fa6dee9SAndroid Build Coastguard Worker							typ:         configurablePatternTypeString,
1291*1fa6dee9SAndroid Build Coastguard Worker							stringValue: "b",
1292*1fa6dee9SAndroid Build Coastguard Worker						}},
1293*1fa6dee9SAndroid Build Coastguard Worker						value: &parser.List{Values: []parser.Expression{
1294*1fa6dee9SAndroid Build Coastguard Worker							&parser.String{Value: "3"},
1295*1fa6dee9SAndroid Build Coastguard Worker							&parser.String{Value: "4"},
1296*1fa6dee9SAndroid Build Coastguard Worker						}},
1297*1fa6dee9SAndroid Build Coastguard Worker					}},
1298*1fa6dee9SAndroid Build Coastguard Worker				),
1299*1fa6dee9SAndroid Build Coastguard Worker			},
1300*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S Configurable[[]string] }{
1301*1fa6dee9SAndroid Build Coastguard Worker				S: func() Configurable[[]string] {
1302*1fa6dee9SAndroid Build Coastguard Worker					result := NewConfigurable([]ConfigurableCondition{{
1303*1fa6dee9SAndroid Build Coastguard Worker						functionName: "soong_config_variable",
1304*1fa6dee9SAndroid Build Coastguard Worker						args: []string{
1305*1fa6dee9SAndroid Build Coastguard Worker							"my_namespace",
1306*1fa6dee9SAndroid Build Coastguard Worker							"foo",
1307*1fa6dee9SAndroid Build Coastguard Worker						},
1308*1fa6dee9SAndroid Build Coastguard Worker					}},
1309*1fa6dee9SAndroid Build Coastguard Worker						[]ConfigurableCase[[]string]{{
1310*1fa6dee9SAndroid Build Coastguard Worker							patterns: []ConfigurablePattern{{
1311*1fa6dee9SAndroid Build Coastguard Worker								typ:         configurablePatternTypeString,
1312*1fa6dee9SAndroid Build Coastguard Worker								stringValue: "a",
1313*1fa6dee9SAndroid Build Coastguard Worker							}},
1314*1fa6dee9SAndroid Build Coastguard Worker							value: &parser.List{Values: []parser.Expression{
1315*1fa6dee9SAndroid Build Coastguard Worker								&parser.String{Value: "1"},
1316*1fa6dee9SAndroid Build Coastguard Worker								&parser.String{Value: "2"},
1317*1fa6dee9SAndroid Build Coastguard Worker							}},
1318*1fa6dee9SAndroid Build Coastguard Worker						}},
1319*1fa6dee9SAndroid Build Coastguard Worker					)
1320*1fa6dee9SAndroid Build Coastguard Worker					result.Append(NewConfigurable([]ConfigurableCondition{{
1321*1fa6dee9SAndroid Build Coastguard Worker						functionName: "release_variable",
1322*1fa6dee9SAndroid Build Coastguard Worker						args: []string{
1323*1fa6dee9SAndroid Build Coastguard Worker							"bar",
1324*1fa6dee9SAndroid Build Coastguard Worker						},
1325*1fa6dee9SAndroid Build Coastguard Worker					}},
1326*1fa6dee9SAndroid Build Coastguard Worker						[]ConfigurableCase[[]string]{{
1327*1fa6dee9SAndroid Build Coastguard Worker							patterns: []ConfigurablePattern{{
1328*1fa6dee9SAndroid Build Coastguard Worker								typ:         configurablePatternTypeString,
1329*1fa6dee9SAndroid Build Coastguard Worker								stringValue: "b",
1330*1fa6dee9SAndroid Build Coastguard Worker							}},
1331*1fa6dee9SAndroid Build Coastguard Worker							value: &parser.List{Values: []parser.Expression{
1332*1fa6dee9SAndroid Build Coastguard Worker								&parser.String{Value: "3"},
1333*1fa6dee9SAndroid Build Coastguard Worker								&parser.String{Value: "4"},
1334*1fa6dee9SAndroid Build Coastguard Worker							}},
1335*1fa6dee9SAndroid Build Coastguard Worker						}}))
1336*1fa6dee9SAndroid Build Coastguard Worker					return result
1337*1fa6dee9SAndroid Build Coastguard Worker				}(),
1338*1fa6dee9SAndroid Build Coastguard Worker			},
1339*1fa6dee9SAndroid Build Coastguard Worker		},
1340*1fa6dee9SAndroid Build Coastguard Worker		{
1341*1fa6dee9SAndroid Build Coastguard Worker			name:  "Prepend configurable",
1342*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
1343*1fa6dee9SAndroid Build Coastguard Worker			dst: &struct{ S Configurable[[]string] }{
1344*1fa6dee9SAndroid Build Coastguard Worker				S: NewConfigurable([]ConfigurableCondition{{
1345*1fa6dee9SAndroid Build Coastguard Worker					functionName: "soong_config_variable",
1346*1fa6dee9SAndroid Build Coastguard Worker					args: []string{
1347*1fa6dee9SAndroid Build Coastguard Worker						"my_namespace",
1348*1fa6dee9SAndroid Build Coastguard Worker						"foo",
1349*1fa6dee9SAndroid Build Coastguard Worker					},
1350*1fa6dee9SAndroid Build Coastguard Worker				}},
1351*1fa6dee9SAndroid Build Coastguard Worker					[]ConfigurableCase[[]string]{{
1352*1fa6dee9SAndroid Build Coastguard Worker						patterns: []ConfigurablePattern{{
1353*1fa6dee9SAndroid Build Coastguard Worker							typ:         configurablePatternTypeString,
1354*1fa6dee9SAndroid Build Coastguard Worker							stringValue: "a",
1355*1fa6dee9SAndroid Build Coastguard Worker						}},
1356*1fa6dee9SAndroid Build Coastguard Worker						value: &parser.List{Values: []parser.Expression{
1357*1fa6dee9SAndroid Build Coastguard Worker							&parser.String{Value: "1"},
1358*1fa6dee9SAndroid Build Coastguard Worker							&parser.String{Value: "2"},
1359*1fa6dee9SAndroid Build Coastguard Worker						}},
1360*1fa6dee9SAndroid Build Coastguard Worker					}},
1361*1fa6dee9SAndroid Build Coastguard Worker				),
1362*1fa6dee9SAndroid Build Coastguard Worker			},
1363*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S Configurable[[]string] }{
1364*1fa6dee9SAndroid Build Coastguard Worker				S: NewConfigurable([]ConfigurableCondition{{
1365*1fa6dee9SAndroid Build Coastguard Worker					functionName: "release_variable",
1366*1fa6dee9SAndroid Build Coastguard Worker					args: []string{
1367*1fa6dee9SAndroid Build Coastguard Worker						"bar",
1368*1fa6dee9SAndroid Build Coastguard Worker					},
1369*1fa6dee9SAndroid Build Coastguard Worker				}},
1370*1fa6dee9SAndroid Build Coastguard Worker					[]ConfigurableCase[[]string]{{
1371*1fa6dee9SAndroid Build Coastguard Worker						patterns: []ConfigurablePattern{{
1372*1fa6dee9SAndroid Build Coastguard Worker							typ:         configurablePatternTypeString,
1373*1fa6dee9SAndroid Build Coastguard Worker							stringValue: "b",
1374*1fa6dee9SAndroid Build Coastguard Worker						}},
1375*1fa6dee9SAndroid Build Coastguard Worker						value: &parser.List{Values: []parser.Expression{
1376*1fa6dee9SAndroid Build Coastguard Worker							&parser.String{Value: "3"},
1377*1fa6dee9SAndroid Build Coastguard Worker							&parser.String{Value: "4"},
1378*1fa6dee9SAndroid Build Coastguard Worker						}},
1379*1fa6dee9SAndroid Build Coastguard Worker					}},
1380*1fa6dee9SAndroid Build Coastguard Worker				),
1381*1fa6dee9SAndroid Build Coastguard Worker			},
1382*1fa6dee9SAndroid Build Coastguard Worker			out: &struct{ S Configurable[[]string] }{
1383*1fa6dee9SAndroid Build Coastguard Worker				S: func() Configurable[[]string] {
1384*1fa6dee9SAndroid Build Coastguard Worker					result := NewConfigurable(
1385*1fa6dee9SAndroid Build Coastguard Worker						[]ConfigurableCondition{{
1386*1fa6dee9SAndroid Build Coastguard Worker							functionName: "release_variable",
1387*1fa6dee9SAndroid Build Coastguard Worker							args: []string{
1388*1fa6dee9SAndroid Build Coastguard Worker								"bar",
1389*1fa6dee9SAndroid Build Coastguard Worker							},
1390*1fa6dee9SAndroid Build Coastguard Worker						}},
1391*1fa6dee9SAndroid Build Coastguard Worker						[]ConfigurableCase[[]string]{{
1392*1fa6dee9SAndroid Build Coastguard Worker							patterns: []ConfigurablePattern{{
1393*1fa6dee9SAndroid Build Coastguard Worker								typ:         configurablePatternTypeString,
1394*1fa6dee9SAndroid Build Coastguard Worker								stringValue: "b",
1395*1fa6dee9SAndroid Build Coastguard Worker							}},
1396*1fa6dee9SAndroid Build Coastguard Worker							value: &parser.List{Values: []parser.Expression{
1397*1fa6dee9SAndroid Build Coastguard Worker								&parser.String{Value: "3"},
1398*1fa6dee9SAndroid Build Coastguard Worker								&parser.String{Value: "4"},
1399*1fa6dee9SAndroid Build Coastguard Worker							}},
1400*1fa6dee9SAndroid Build Coastguard Worker						}},
1401*1fa6dee9SAndroid Build Coastguard Worker					)
1402*1fa6dee9SAndroid Build Coastguard Worker					result.Append(NewConfigurable(
1403*1fa6dee9SAndroid Build Coastguard Worker						[]ConfigurableCondition{{
1404*1fa6dee9SAndroid Build Coastguard Worker							functionName: "soong_config_variable",
1405*1fa6dee9SAndroid Build Coastguard Worker							args: []string{
1406*1fa6dee9SAndroid Build Coastguard Worker								"my_namespace",
1407*1fa6dee9SAndroid Build Coastguard Worker								"foo",
1408*1fa6dee9SAndroid Build Coastguard Worker							},
1409*1fa6dee9SAndroid Build Coastguard Worker						}},
1410*1fa6dee9SAndroid Build Coastguard Worker						[]ConfigurableCase[[]string]{{
1411*1fa6dee9SAndroid Build Coastguard Worker							patterns: []ConfigurablePattern{{
1412*1fa6dee9SAndroid Build Coastguard Worker								typ:         configurablePatternTypeString,
1413*1fa6dee9SAndroid Build Coastguard Worker								stringValue: "a",
1414*1fa6dee9SAndroid Build Coastguard Worker							}},
1415*1fa6dee9SAndroid Build Coastguard Worker							value: &parser.List{Values: []parser.Expression{
1416*1fa6dee9SAndroid Build Coastguard Worker								&parser.String{Value: "1"},
1417*1fa6dee9SAndroid Build Coastguard Worker								&parser.String{Value: "2"},
1418*1fa6dee9SAndroid Build Coastguard Worker							}},
1419*1fa6dee9SAndroid Build Coastguard Worker						}}))
1420*1fa6dee9SAndroid Build Coastguard Worker					return result
1421*1fa6dee9SAndroid Build Coastguard Worker				}(),
1422*1fa6dee9SAndroid Build Coastguard Worker			},
1423*1fa6dee9SAndroid Build Coastguard Worker		},
1424*1fa6dee9SAndroid Build Coastguard Worker	}
1425*1fa6dee9SAndroid Build Coastguard Worker}
1426*1fa6dee9SAndroid Build Coastguard Worker
1427*1fa6dee9SAndroid Build Coastguard Workerfunc TestAppendProperties(t *testing.T) {
1428*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range appendPropertiesTestCases() {
1429*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.name, func(t *testing.T) {
1430*1fa6dee9SAndroid Build Coastguard Worker
1431*1fa6dee9SAndroid Build Coastguard Worker			got := testCase.dst
1432*1fa6dee9SAndroid Build Coastguard Worker			var err error
1433*1fa6dee9SAndroid Build Coastguard Worker			var testType string
1434*1fa6dee9SAndroid Build Coastguard Worker
1435*1fa6dee9SAndroid Build Coastguard Worker			switch testCase.order {
1436*1fa6dee9SAndroid Build Coastguard Worker			case Append:
1437*1fa6dee9SAndroid Build Coastguard Worker				testType = "append"
1438*1fa6dee9SAndroid Build Coastguard Worker				err = AppendProperties(got, testCase.src, testCase.filter)
1439*1fa6dee9SAndroid Build Coastguard Worker			case Prepend:
1440*1fa6dee9SAndroid Build Coastguard Worker				testType = "prepend"
1441*1fa6dee9SAndroid Build Coastguard Worker				err = PrependProperties(got, testCase.src, testCase.filter)
1442*1fa6dee9SAndroid Build Coastguard Worker			case Replace:
1443*1fa6dee9SAndroid Build Coastguard Worker				testType = "replace"
1444*1fa6dee9SAndroid Build Coastguard Worker				err = ExtendProperties(got, testCase.src, testCase.filter, OrderReplace)
1445*1fa6dee9SAndroid Build Coastguard Worker			}
1446*1fa6dee9SAndroid Build Coastguard Worker
1447*1fa6dee9SAndroid Build Coastguard Worker			check(t, testType, testCase.name, got, err, testCase.out, testCase.err)
1448*1fa6dee9SAndroid Build Coastguard Worker		})
1449*1fa6dee9SAndroid Build Coastguard Worker	}
1450*1fa6dee9SAndroid Build Coastguard Worker}
1451*1fa6dee9SAndroid Build Coastguard Worker
1452*1fa6dee9SAndroid Build Coastguard Workerfunc TestExtendProperties(t *testing.T) {
1453*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range appendPropertiesTestCases() {
1454*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.name, func(t *testing.T) {
1455*1fa6dee9SAndroid Build Coastguard Worker
1456*1fa6dee9SAndroid Build Coastguard Worker			got := testCase.dst
1457*1fa6dee9SAndroid Build Coastguard Worker			var err error
1458*1fa6dee9SAndroid Build Coastguard Worker			var testType string
1459*1fa6dee9SAndroid Build Coastguard Worker
1460*1fa6dee9SAndroid Build Coastguard Worker			order := func(dstField, srcField reflect.StructField) (Order, error) {
1461*1fa6dee9SAndroid Build Coastguard Worker				switch testCase.order {
1462*1fa6dee9SAndroid Build Coastguard Worker				case Append:
1463*1fa6dee9SAndroid Build Coastguard Worker					return Append, nil
1464*1fa6dee9SAndroid Build Coastguard Worker				case Prepend:
1465*1fa6dee9SAndroid Build Coastguard Worker					return Prepend, nil
1466*1fa6dee9SAndroid Build Coastguard Worker				case Replace:
1467*1fa6dee9SAndroid Build Coastguard Worker					return Replace, nil
1468*1fa6dee9SAndroid Build Coastguard Worker				}
1469*1fa6dee9SAndroid Build Coastguard Worker				return Append, errors.New("unknown order")
1470*1fa6dee9SAndroid Build Coastguard Worker			}
1471*1fa6dee9SAndroid Build Coastguard Worker
1472*1fa6dee9SAndroid Build Coastguard Worker			switch testCase.order {
1473*1fa6dee9SAndroid Build Coastguard Worker			case Append:
1474*1fa6dee9SAndroid Build Coastguard Worker				testType = "prepend"
1475*1fa6dee9SAndroid Build Coastguard Worker			case Prepend:
1476*1fa6dee9SAndroid Build Coastguard Worker				testType = "append"
1477*1fa6dee9SAndroid Build Coastguard Worker			case Replace:
1478*1fa6dee9SAndroid Build Coastguard Worker				testType = "replace"
1479*1fa6dee9SAndroid Build Coastguard Worker			}
1480*1fa6dee9SAndroid Build Coastguard Worker
1481*1fa6dee9SAndroid Build Coastguard Worker			err = ExtendProperties(got, testCase.src, testCase.filter, order)
1482*1fa6dee9SAndroid Build Coastguard Worker
1483*1fa6dee9SAndroid Build Coastguard Worker			check(t, testType, testCase.name, got, err, testCase.out, testCase.err)
1484*1fa6dee9SAndroid Build Coastguard Worker		})
1485*1fa6dee9SAndroid Build Coastguard Worker	}
1486*1fa6dee9SAndroid Build Coastguard Worker}
1487*1fa6dee9SAndroid Build Coastguard Worker
1488*1fa6dee9SAndroid Build Coastguard Workertype appendMatchingPropertiesTestCase struct {
1489*1fa6dee9SAndroid Build Coastguard Worker	name   string
1490*1fa6dee9SAndroid Build Coastguard Worker	dst    []interface{}
1491*1fa6dee9SAndroid Build Coastguard Worker	src    interface{}
1492*1fa6dee9SAndroid Build Coastguard Worker	out    []interface{}
1493*1fa6dee9SAndroid Build Coastguard Worker	order  Order // default is Append
1494*1fa6dee9SAndroid Build Coastguard Worker	filter ExtendPropertyFilterFunc
1495*1fa6dee9SAndroid Build Coastguard Worker	err    error
1496*1fa6dee9SAndroid Build Coastguard Worker}
1497*1fa6dee9SAndroid Build Coastguard Worker
1498*1fa6dee9SAndroid Build Coastguard Workerfunc appendMatchingPropertiesTestCases() []appendMatchingPropertiesTestCase {
1499*1fa6dee9SAndroid Build Coastguard Worker	return []appendMatchingPropertiesTestCase{
1500*1fa6dee9SAndroid Build Coastguard Worker		{
1501*1fa6dee9SAndroid Build Coastguard Worker			name: "Append strings",
1502*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{&struct{ S string }{
1503*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
1504*1fa6dee9SAndroid Build Coastguard Worker			}},
1505*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1506*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1507*1fa6dee9SAndroid Build Coastguard Worker			},
1508*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{&struct{ S string }{
1509*1fa6dee9SAndroid Build Coastguard Worker				S: "string1string2",
1510*1fa6dee9SAndroid Build Coastguard Worker			}},
1511*1fa6dee9SAndroid Build Coastguard Worker		},
1512*1fa6dee9SAndroid Build Coastguard Worker		{
1513*1fa6dee9SAndroid Build Coastguard Worker			name: "Prepend strings",
1514*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{&struct{ S string }{
1515*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
1516*1fa6dee9SAndroid Build Coastguard Worker			}},
1517*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1518*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1519*1fa6dee9SAndroid Build Coastguard Worker			},
1520*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{&struct{ S string }{
1521*1fa6dee9SAndroid Build Coastguard Worker				S: "string2string1",
1522*1fa6dee9SAndroid Build Coastguard Worker			}},
1523*1fa6dee9SAndroid Build Coastguard Worker			order: Prepend,
1524*1fa6dee9SAndroid Build Coastguard Worker		},
1525*1fa6dee9SAndroid Build Coastguard Worker		{
1526*1fa6dee9SAndroid Build Coastguard Worker			name: "Append all",
1527*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1528*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S, A string }{
1529*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
1530*1fa6dee9SAndroid Build Coastguard Worker				},
1531*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S, B string }{
1532*1fa6dee9SAndroid Build Coastguard Worker					S: "string2",
1533*1fa6dee9SAndroid Build Coastguard Worker				},
1534*1fa6dee9SAndroid Build Coastguard Worker			},
1535*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1536*1fa6dee9SAndroid Build Coastguard Worker				S: "string3",
1537*1fa6dee9SAndroid Build Coastguard Worker			},
1538*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1539*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S, A string }{
1540*1fa6dee9SAndroid Build Coastguard Worker					S: "string1string3",
1541*1fa6dee9SAndroid Build Coastguard Worker				},
1542*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S, B string }{
1543*1fa6dee9SAndroid Build Coastguard Worker					S: "string2string3",
1544*1fa6dee9SAndroid Build Coastguard Worker				},
1545*1fa6dee9SAndroid Build Coastguard Worker			},
1546*1fa6dee9SAndroid Build Coastguard Worker		},
1547*1fa6dee9SAndroid Build Coastguard Worker		{
1548*1fa6dee9SAndroid Build Coastguard Worker			name: "Append some",
1549*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1550*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S, A string }{
1551*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
1552*1fa6dee9SAndroid Build Coastguard Worker				},
1553*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1554*1fa6dee9SAndroid Build Coastguard Worker			},
1555*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1556*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1557*1fa6dee9SAndroid Build Coastguard Worker			},
1558*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1559*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S, A string }{
1560*1fa6dee9SAndroid Build Coastguard Worker					S: "string1string2",
1561*1fa6dee9SAndroid Build Coastguard Worker				},
1562*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1563*1fa6dee9SAndroid Build Coastguard Worker			},
1564*1fa6dee9SAndroid Build Coastguard Worker		},
1565*1fa6dee9SAndroid Build Coastguard Worker		{
1566*1fa6dee9SAndroid Build Coastguard Worker			name: "Append mismatched structs",
1567*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{&struct{ S, A string }{
1568*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
1569*1fa6dee9SAndroid Build Coastguard Worker			}},
1570*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1571*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1572*1fa6dee9SAndroid Build Coastguard Worker			},
1573*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{&struct{ S, A string }{
1574*1fa6dee9SAndroid Build Coastguard Worker				S: "string1string2",
1575*1fa6dee9SAndroid Build Coastguard Worker			}},
1576*1fa6dee9SAndroid Build Coastguard Worker		},
1577*1fa6dee9SAndroid Build Coastguard Worker		{
1578*1fa6dee9SAndroid Build Coastguard Worker			name: "Append mismatched pointer structs",
1579*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{&struct{ S *struct{ S, A string } }{
1580*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S, A string }{
1581*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
1582*1fa6dee9SAndroid Build Coastguard Worker				},
1583*1fa6dee9SAndroid Build Coastguard Worker			}},
1584*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S *struct{ S string } }{
1585*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S string }{
1586*1fa6dee9SAndroid Build Coastguard Worker					S: "string2",
1587*1fa6dee9SAndroid Build Coastguard Worker				},
1588*1fa6dee9SAndroid Build Coastguard Worker			},
1589*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{&struct{ S *struct{ S, A string } }{
1590*1fa6dee9SAndroid Build Coastguard Worker				S: &struct{ S, A string }{
1591*1fa6dee9SAndroid Build Coastguard Worker					S: "string1string2",
1592*1fa6dee9SAndroid Build Coastguard Worker				},
1593*1fa6dee9SAndroid Build Coastguard Worker			}},
1594*1fa6dee9SAndroid Build Coastguard Worker		},
1595*1fa6dee9SAndroid Build Coastguard Worker		{
1596*1fa6dee9SAndroid Build Coastguard Worker			name: "Append through mismatched types",
1597*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1598*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1599*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S interface{} }{
1600*1fa6dee9SAndroid Build Coastguard Worker					S: &struct{ S, A string }{
1601*1fa6dee9SAndroid Build Coastguard Worker						S: "string1",
1602*1fa6dee9SAndroid Build Coastguard Worker					},
1603*1fa6dee9SAndroid Build Coastguard Worker				},
1604*1fa6dee9SAndroid Build Coastguard Worker			},
1605*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S struct{ S string } }{
1606*1fa6dee9SAndroid Build Coastguard Worker				S: struct{ S string }{
1607*1fa6dee9SAndroid Build Coastguard Worker					S: "string2",
1608*1fa6dee9SAndroid Build Coastguard Worker				},
1609*1fa6dee9SAndroid Build Coastguard Worker			},
1610*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1611*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1612*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S interface{} }{
1613*1fa6dee9SAndroid Build Coastguard Worker					S: &struct{ S, A string }{
1614*1fa6dee9SAndroid Build Coastguard Worker						S: "string1string2",
1615*1fa6dee9SAndroid Build Coastguard Worker					},
1616*1fa6dee9SAndroid Build Coastguard Worker				},
1617*1fa6dee9SAndroid Build Coastguard Worker			},
1618*1fa6dee9SAndroid Build Coastguard Worker		},
1619*1fa6dee9SAndroid Build Coastguard Worker		{
1620*1fa6dee9SAndroid Build Coastguard Worker			name: "Append through mismatched types and nil",
1621*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1622*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1623*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S interface{} }{
1624*1fa6dee9SAndroid Build Coastguard Worker					S: (*struct{ S, A string })(nil),
1625*1fa6dee9SAndroid Build Coastguard Worker				},
1626*1fa6dee9SAndroid Build Coastguard Worker			},
1627*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S struct{ S string } }{
1628*1fa6dee9SAndroid Build Coastguard Worker				S: struct{ S string }{
1629*1fa6dee9SAndroid Build Coastguard Worker					S: "string2",
1630*1fa6dee9SAndroid Build Coastguard Worker				},
1631*1fa6dee9SAndroid Build Coastguard Worker			},
1632*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1633*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1634*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S interface{} }{
1635*1fa6dee9SAndroid Build Coastguard Worker					S: &struct{ S, A string }{
1636*1fa6dee9SAndroid Build Coastguard Worker						S: "string2",
1637*1fa6dee9SAndroid Build Coastguard Worker					},
1638*1fa6dee9SAndroid Build Coastguard Worker				},
1639*1fa6dee9SAndroid Build Coastguard Worker			},
1640*1fa6dee9SAndroid Build Coastguard Worker		},
1641*1fa6dee9SAndroid Build Coastguard Worker		{
1642*1fa6dee9SAndroid Build Coastguard Worker			name: "Append through multiple matches",
1643*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1644*1fa6dee9SAndroid Build Coastguard Worker				&struct {
1645*1fa6dee9SAndroid Build Coastguard Worker					S struct{ S, A string }
1646*1fa6dee9SAndroid Build Coastguard Worker				}{
1647*1fa6dee9SAndroid Build Coastguard Worker					S: struct{ S, A string }{
1648*1fa6dee9SAndroid Build Coastguard Worker						S: "string1",
1649*1fa6dee9SAndroid Build Coastguard Worker					},
1650*1fa6dee9SAndroid Build Coastguard Worker				},
1651*1fa6dee9SAndroid Build Coastguard Worker				&struct {
1652*1fa6dee9SAndroid Build Coastguard Worker					S struct{ S, B string }
1653*1fa6dee9SAndroid Build Coastguard Worker				}{
1654*1fa6dee9SAndroid Build Coastguard Worker					S: struct{ S, B string }{
1655*1fa6dee9SAndroid Build Coastguard Worker						S: "string2",
1656*1fa6dee9SAndroid Build Coastguard Worker					},
1657*1fa6dee9SAndroid Build Coastguard Worker				},
1658*1fa6dee9SAndroid Build Coastguard Worker			},
1659*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S struct{ B string } }{
1660*1fa6dee9SAndroid Build Coastguard Worker				S: struct{ B string }{
1661*1fa6dee9SAndroid Build Coastguard Worker					B: "string3",
1662*1fa6dee9SAndroid Build Coastguard Worker				},
1663*1fa6dee9SAndroid Build Coastguard Worker			},
1664*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1665*1fa6dee9SAndroid Build Coastguard Worker				&struct {
1666*1fa6dee9SAndroid Build Coastguard Worker					S struct{ S, A string }
1667*1fa6dee9SAndroid Build Coastguard Worker				}{
1668*1fa6dee9SAndroid Build Coastguard Worker					S: struct{ S, A string }{
1669*1fa6dee9SAndroid Build Coastguard Worker						S: "string1",
1670*1fa6dee9SAndroid Build Coastguard Worker					},
1671*1fa6dee9SAndroid Build Coastguard Worker				},
1672*1fa6dee9SAndroid Build Coastguard Worker				&struct {
1673*1fa6dee9SAndroid Build Coastguard Worker					S struct{ S, B string }
1674*1fa6dee9SAndroid Build Coastguard Worker				}{
1675*1fa6dee9SAndroid Build Coastguard Worker					S: struct{ S, B string }{
1676*1fa6dee9SAndroid Build Coastguard Worker						S: "string2",
1677*1fa6dee9SAndroid Build Coastguard Worker						B: "string3",
1678*1fa6dee9SAndroid Build Coastguard Worker					},
1679*1fa6dee9SAndroid Build Coastguard Worker				},
1680*1fa6dee9SAndroid Build Coastguard Worker			},
1681*1fa6dee9SAndroid Build Coastguard Worker		},
1682*1fa6dee9SAndroid Build Coastguard Worker		{
1683*1fa6dee9SAndroid Build Coastguard Worker			name: "Append through embedded struct",
1684*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1685*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1686*1fa6dee9SAndroid Build Coastguard Worker				&struct{ EmbeddedStruct }{
1687*1fa6dee9SAndroid Build Coastguard Worker					EmbeddedStruct: EmbeddedStruct{
1688*1fa6dee9SAndroid Build Coastguard Worker						S: "string1",
1689*1fa6dee9SAndroid Build Coastguard Worker					},
1690*1fa6dee9SAndroid Build Coastguard Worker				},
1691*1fa6dee9SAndroid Build Coastguard Worker			},
1692*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1693*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1694*1fa6dee9SAndroid Build Coastguard Worker			},
1695*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1696*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1697*1fa6dee9SAndroid Build Coastguard Worker				&struct{ EmbeddedStruct }{
1698*1fa6dee9SAndroid Build Coastguard Worker					EmbeddedStruct: EmbeddedStruct{
1699*1fa6dee9SAndroid Build Coastguard Worker						S: "string1string2",
1700*1fa6dee9SAndroid Build Coastguard Worker					},
1701*1fa6dee9SAndroid Build Coastguard Worker				},
1702*1fa6dee9SAndroid Build Coastguard Worker			},
1703*1fa6dee9SAndroid Build Coastguard Worker		},
1704*1fa6dee9SAndroid Build Coastguard Worker		{
1705*1fa6dee9SAndroid Build Coastguard Worker			name: "Append through BlueprintEmbed struct",
1706*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1707*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1708*1fa6dee9SAndroid Build Coastguard Worker				&struct{ BlueprintEmbed EmbeddedStruct }{
1709*1fa6dee9SAndroid Build Coastguard Worker					BlueprintEmbed: EmbeddedStruct{
1710*1fa6dee9SAndroid Build Coastguard Worker						S: "string1",
1711*1fa6dee9SAndroid Build Coastguard Worker					},
1712*1fa6dee9SAndroid Build Coastguard Worker				},
1713*1fa6dee9SAndroid Build Coastguard Worker			},
1714*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1715*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1716*1fa6dee9SAndroid Build Coastguard Worker			},
1717*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1718*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1719*1fa6dee9SAndroid Build Coastguard Worker				&struct{ BlueprintEmbed EmbeddedStruct }{
1720*1fa6dee9SAndroid Build Coastguard Worker					BlueprintEmbed: EmbeddedStruct{
1721*1fa6dee9SAndroid Build Coastguard Worker						S: "string1string2",
1722*1fa6dee9SAndroid Build Coastguard Worker					},
1723*1fa6dee9SAndroid Build Coastguard Worker				},
1724*1fa6dee9SAndroid Build Coastguard Worker			},
1725*1fa6dee9SAndroid Build Coastguard Worker		},
1726*1fa6dee9SAndroid Build Coastguard Worker		{
1727*1fa6dee9SAndroid Build Coastguard Worker			name: "Append through embedded pointer to struct",
1728*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1729*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1730*1fa6dee9SAndroid Build Coastguard Worker				&struct{ *EmbeddedStruct }{
1731*1fa6dee9SAndroid Build Coastguard Worker					EmbeddedStruct: &EmbeddedStruct{
1732*1fa6dee9SAndroid Build Coastguard Worker						S: "string1",
1733*1fa6dee9SAndroid Build Coastguard Worker					},
1734*1fa6dee9SAndroid Build Coastguard Worker				},
1735*1fa6dee9SAndroid Build Coastguard Worker			},
1736*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1737*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1738*1fa6dee9SAndroid Build Coastguard Worker			},
1739*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1740*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1741*1fa6dee9SAndroid Build Coastguard Worker				&struct{ *EmbeddedStruct }{
1742*1fa6dee9SAndroid Build Coastguard Worker					EmbeddedStruct: &EmbeddedStruct{
1743*1fa6dee9SAndroid Build Coastguard Worker						S: "string1string2",
1744*1fa6dee9SAndroid Build Coastguard Worker					},
1745*1fa6dee9SAndroid Build Coastguard Worker				},
1746*1fa6dee9SAndroid Build Coastguard Worker			},
1747*1fa6dee9SAndroid Build Coastguard Worker		},
1748*1fa6dee9SAndroid Build Coastguard Worker		{
1749*1fa6dee9SAndroid Build Coastguard Worker			name: "Append through BlueprintEmbed pointer to struct",
1750*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1751*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1752*1fa6dee9SAndroid Build Coastguard Worker				&struct{ BlueprintEmbed *EmbeddedStruct }{
1753*1fa6dee9SAndroid Build Coastguard Worker					BlueprintEmbed: &EmbeddedStruct{
1754*1fa6dee9SAndroid Build Coastguard Worker						S: "string1",
1755*1fa6dee9SAndroid Build Coastguard Worker					},
1756*1fa6dee9SAndroid Build Coastguard Worker				},
1757*1fa6dee9SAndroid Build Coastguard Worker			},
1758*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1759*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1760*1fa6dee9SAndroid Build Coastguard Worker			},
1761*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1762*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1763*1fa6dee9SAndroid Build Coastguard Worker				&struct{ BlueprintEmbed *EmbeddedStruct }{
1764*1fa6dee9SAndroid Build Coastguard Worker					BlueprintEmbed: &EmbeddedStruct{
1765*1fa6dee9SAndroid Build Coastguard Worker						S: "string1string2",
1766*1fa6dee9SAndroid Build Coastguard Worker					},
1767*1fa6dee9SAndroid Build Coastguard Worker				},
1768*1fa6dee9SAndroid Build Coastguard Worker			},
1769*1fa6dee9SAndroid Build Coastguard Worker		},
1770*1fa6dee9SAndroid Build Coastguard Worker		{
1771*1fa6dee9SAndroid Build Coastguard Worker			name: "Append through embedded nil pointer to struct",
1772*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1773*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1774*1fa6dee9SAndroid Build Coastguard Worker				&struct{ *EmbeddedStruct }{},
1775*1fa6dee9SAndroid Build Coastguard Worker			},
1776*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1777*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1778*1fa6dee9SAndroid Build Coastguard Worker			},
1779*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1780*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1781*1fa6dee9SAndroid Build Coastguard Worker				&struct{ *EmbeddedStruct }{
1782*1fa6dee9SAndroid Build Coastguard Worker					EmbeddedStruct: &EmbeddedStruct{
1783*1fa6dee9SAndroid Build Coastguard Worker						S: "string2",
1784*1fa6dee9SAndroid Build Coastguard Worker					},
1785*1fa6dee9SAndroid Build Coastguard Worker				},
1786*1fa6dee9SAndroid Build Coastguard Worker			},
1787*1fa6dee9SAndroid Build Coastguard Worker		},
1788*1fa6dee9SAndroid Build Coastguard Worker		{
1789*1fa6dee9SAndroid Build Coastguard Worker			name: "Append through BlueprintEmbed nil pointer to struct",
1790*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1791*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1792*1fa6dee9SAndroid Build Coastguard Worker				&struct{ BlueprintEmbed *EmbeddedStruct }{},
1793*1fa6dee9SAndroid Build Coastguard Worker			},
1794*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1795*1fa6dee9SAndroid Build Coastguard Worker				S: "string2",
1796*1fa6dee9SAndroid Build Coastguard Worker			},
1797*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1798*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1799*1fa6dee9SAndroid Build Coastguard Worker				&struct{ BlueprintEmbed *EmbeddedStruct }{
1800*1fa6dee9SAndroid Build Coastguard Worker					BlueprintEmbed: &EmbeddedStruct{
1801*1fa6dee9SAndroid Build Coastguard Worker						S: "string2",
1802*1fa6dee9SAndroid Build Coastguard Worker					},
1803*1fa6dee9SAndroid Build Coastguard Worker				},
1804*1fa6dee9SAndroid Build Coastguard Worker			},
1805*1fa6dee9SAndroid Build Coastguard Worker		},
1806*1fa6dee9SAndroid Build Coastguard Worker
1807*1fa6dee9SAndroid Build Coastguard Worker		// Errors
1808*1fa6dee9SAndroid Build Coastguard Worker
1809*1fa6dee9SAndroid Build Coastguard Worker		{
1810*1fa6dee9SAndroid Build Coastguard Worker			name: "Non-pointer dst",
1811*1fa6dee9SAndroid Build Coastguard Worker			dst:  []interface{}{struct{}{}},
1812*1fa6dee9SAndroid Build Coastguard Worker			src:  &struct{}{},
1813*1fa6dee9SAndroid Build Coastguard Worker			err:  errors.New("expected pointer to struct, got struct {}"),
1814*1fa6dee9SAndroid Build Coastguard Worker			out:  []interface{}{struct{}{}},
1815*1fa6dee9SAndroid Build Coastguard Worker		},
1816*1fa6dee9SAndroid Build Coastguard Worker		{
1817*1fa6dee9SAndroid Build Coastguard Worker			name: "Non-pointer src",
1818*1fa6dee9SAndroid Build Coastguard Worker			dst:  []interface{}{&struct{}{}},
1819*1fa6dee9SAndroid Build Coastguard Worker			src:  struct{}{},
1820*1fa6dee9SAndroid Build Coastguard Worker			err:  errors.New("expected pointer to struct, got struct {}"),
1821*1fa6dee9SAndroid Build Coastguard Worker			out:  []interface{}{&struct{}{}},
1822*1fa6dee9SAndroid Build Coastguard Worker		},
1823*1fa6dee9SAndroid Build Coastguard Worker		{
1824*1fa6dee9SAndroid Build Coastguard Worker			name: "Non-struct dst",
1825*1fa6dee9SAndroid Build Coastguard Worker			dst:  []interface{}{&[]string{"bad"}},
1826*1fa6dee9SAndroid Build Coastguard Worker			src:  &struct{}{},
1827*1fa6dee9SAndroid Build Coastguard Worker			err:  errors.New("expected pointer to struct, got *[]string"),
1828*1fa6dee9SAndroid Build Coastguard Worker			out:  []interface{}{&[]string{"bad"}},
1829*1fa6dee9SAndroid Build Coastguard Worker		},
1830*1fa6dee9SAndroid Build Coastguard Worker		{
1831*1fa6dee9SAndroid Build Coastguard Worker			name: "Non-struct src",
1832*1fa6dee9SAndroid Build Coastguard Worker			dst:  []interface{}{&struct{}{}},
1833*1fa6dee9SAndroid Build Coastguard Worker			src:  &[]string{"bad"},
1834*1fa6dee9SAndroid Build Coastguard Worker			err:  errors.New("expected pointer to struct, got *[]string"),
1835*1fa6dee9SAndroid Build Coastguard Worker			out:  []interface{}{&struct{}{}},
1836*1fa6dee9SAndroid Build Coastguard Worker		},
1837*1fa6dee9SAndroid Build Coastguard Worker		{
1838*1fa6dee9SAndroid Build Coastguard Worker			name: "Append none",
1839*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1840*1fa6dee9SAndroid Build Coastguard Worker				&struct{ A string }{},
1841*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1842*1fa6dee9SAndroid Build Coastguard Worker			},
1843*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S string }{
1844*1fa6dee9SAndroid Build Coastguard Worker				S: "string1",
1845*1fa6dee9SAndroid Build Coastguard Worker			},
1846*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1847*1fa6dee9SAndroid Build Coastguard Worker				&struct{ A string }{},
1848*1fa6dee9SAndroid Build Coastguard Worker				&struct{ B string }{},
1849*1fa6dee9SAndroid Build Coastguard Worker			},
1850*1fa6dee9SAndroid Build Coastguard Worker			err: extendPropertyErrorf("s", "failed to find property to extend"),
1851*1fa6dee9SAndroid Build Coastguard Worker		},
1852*1fa6dee9SAndroid Build Coastguard Worker		{
1853*1fa6dee9SAndroid Build Coastguard Worker			name: "Append mismatched kinds",
1854*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1855*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S string }{
1856*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
1857*1fa6dee9SAndroid Build Coastguard Worker				},
1858*1fa6dee9SAndroid Build Coastguard Worker			},
1859*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S []string }{
1860*1fa6dee9SAndroid Build Coastguard Worker				S: []string{"string2"},
1861*1fa6dee9SAndroid Build Coastguard Worker			},
1862*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1863*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S string }{
1864*1fa6dee9SAndroid Build Coastguard Worker					S: "string1",
1865*1fa6dee9SAndroid Build Coastguard Worker				},
1866*1fa6dee9SAndroid Build Coastguard Worker			},
1867*1fa6dee9SAndroid Build Coastguard Worker			err: extendPropertyErrorf("s", "mismatched types string and []string"),
1868*1fa6dee9SAndroid Build Coastguard Worker		},
1869*1fa6dee9SAndroid Build Coastguard Worker		{
1870*1fa6dee9SAndroid Build Coastguard Worker			name: "Append mismatched types",
1871*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1872*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S []int }{
1873*1fa6dee9SAndroid Build Coastguard Worker					S: []int{1},
1874*1fa6dee9SAndroid Build Coastguard Worker				},
1875*1fa6dee9SAndroid Build Coastguard Worker			},
1876*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S []string }{
1877*1fa6dee9SAndroid Build Coastguard Worker				S: []string{"string2"},
1878*1fa6dee9SAndroid Build Coastguard Worker			},
1879*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1880*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S []int }{
1881*1fa6dee9SAndroid Build Coastguard Worker					S: []int{1},
1882*1fa6dee9SAndroid Build Coastguard Worker				},
1883*1fa6dee9SAndroid Build Coastguard Worker			},
1884*1fa6dee9SAndroid Build Coastguard Worker			err: extendPropertyErrorf("s", "mismatched types []int and []string"),
1885*1fa6dee9SAndroid Build Coastguard Worker		},
1886*1fa6dee9SAndroid Build Coastguard Worker		{
1887*1fa6dee9SAndroid Build Coastguard Worker			name:  "Append *bool to Configurable[bool]",
1888*1fa6dee9SAndroid Build Coastguard Worker			order: Append,
1889*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1890*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S Configurable[bool] }{
1891*1fa6dee9SAndroid Build Coastguard Worker					S: NewConfigurable[bool]([]ConfigurableCondition{{
1892*1fa6dee9SAndroid Build Coastguard Worker						functionName: "soong_config_variable",
1893*1fa6dee9SAndroid Build Coastguard Worker						args: []string{
1894*1fa6dee9SAndroid Build Coastguard Worker							"my_namespace",
1895*1fa6dee9SAndroid Build Coastguard Worker							"foo",
1896*1fa6dee9SAndroid Build Coastguard Worker						},
1897*1fa6dee9SAndroid Build Coastguard Worker					}}, []ConfigurableCase[bool]{{
1898*1fa6dee9SAndroid Build Coastguard Worker						patterns: []ConfigurablePattern{{
1899*1fa6dee9SAndroid Build Coastguard Worker							typ:         configurablePatternTypeString,
1900*1fa6dee9SAndroid Build Coastguard Worker							stringValue: "a",
1901*1fa6dee9SAndroid Build Coastguard Worker						}},
1902*1fa6dee9SAndroid Build Coastguard Worker						value: &parser.Bool{Value: true},
1903*1fa6dee9SAndroid Build Coastguard Worker					}, {
1904*1fa6dee9SAndroid Build Coastguard Worker						patterns: []ConfigurablePattern{{
1905*1fa6dee9SAndroid Build Coastguard Worker							typ: configurablePatternTypeDefault,
1906*1fa6dee9SAndroid Build Coastguard Worker						}},
1907*1fa6dee9SAndroid Build Coastguard Worker						value: &parser.Bool{Value: false},
1908*1fa6dee9SAndroid Build Coastguard Worker					}}),
1909*1fa6dee9SAndroid Build Coastguard Worker				},
1910*1fa6dee9SAndroid Build Coastguard Worker			},
1911*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S *bool }{
1912*1fa6dee9SAndroid Build Coastguard Worker				S: BoolPtr(true),
1913*1fa6dee9SAndroid Build Coastguard Worker			},
1914*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1915*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S Configurable[bool] }{
1916*1fa6dee9SAndroid Build Coastguard Worker					S: func() Configurable[bool] {
1917*1fa6dee9SAndroid Build Coastguard Worker						result := NewConfigurable[bool]([]ConfigurableCondition{{
1918*1fa6dee9SAndroid Build Coastguard Worker							functionName: "soong_config_variable",
1919*1fa6dee9SAndroid Build Coastguard Worker							args: []string{
1920*1fa6dee9SAndroid Build Coastguard Worker								"my_namespace",
1921*1fa6dee9SAndroid Build Coastguard Worker								"foo",
1922*1fa6dee9SAndroid Build Coastguard Worker							},
1923*1fa6dee9SAndroid Build Coastguard Worker						}},
1924*1fa6dee9SAndroid Build Coastguard Worker							[]ConfigurableCase[bool]{{
1925*1fa6dee9SAndroid Build Coastguard Worker								patterns: []ConfigurablePattern{{
1926*1fa6dee9SAndroid Build Coastguard Worker									typ:         configurablePatternTypeString,
1927*1fa6dee9SAndroid Build Coastguard Worker									stringValue: "a",
1928*1fa6dee9SAndroid Build Coastguard Worker								}},
1929*1fa6dee9SAndroid Build Coastguard Worker								value: &parser.Bool{Value: true},
1930*1fa6dee9SAndroid Build Coastguard Worker							}, {
1931*1fa6dee9SAndroid Build Coastguard Worker								patterns: []ConfigurablePattern{{
1932*1fa6dee9SAndroid Build Coastguard Worker									typ: configurablePatternTypeDefault,
1933*1fa6dee9SAndroid Build Coastguard Worker								}},
1934*1fa6dee9SAndroid Build Coastguard Worker								value: &parser.Bool{Value: false},
1935*1fa6dee9SAndroid Build Coastguard Worker							}},
1936*1fa6dee9SAndroid Build Coastguard Worker						)
1937*1fa6dee9SAndroid Build Coastguard Worker						result.AppendSimpleValue(true)
1938*1fa6dee9SAndroid Build Coastguard Worker						return result
1939*1fa6dee9SAndroid Build Coastguard Worker					}(),
1940*1fa6dee9SAndroid Build Coastguard Worker				},
1941*1fa6dee9SAndroid Build Coastguard Worker			},
1942*1fa6dee9SAndroid Build Coastguard Worker		},
1943*1fa6dee9SAndroid Build Coastguard Worker		{
1944*1fa6dee9SAndroid Build Coastguard Worker			name:  "Append bool to Configurable[bool]",
1945*1fa6dee9SAndroid Build Coastguard Worker			order: Append,
1946*1fa6dee9SAndroid Build Coastguard Worker			dst: []interface{}{
1947*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S Configurable[bool] }{
1948*1fa6dee9SAndroid Build Coastguard Worker					S: NewConfigurable[bool]([]ConfigurableCondition{{
1949*1fa6dee9SAndroid Build Coastguard Worker						functionName: "soong_config_variable",
1950*1fa6dee9SAndroid Build Coastguard Worker						args: []string{
1951*1fa6dee9SAndroid Build Coastguard Worker							"my_namespace",
1952*1fa6dee9SAndroid Build Coastguard Worker							"foo",
1953*1fa6dee9SAndroid Build Coastguard Worker						},
1954*1fa6dee9SAndroid Build Coastguard Worker					}},
1955*1fa6dee9SAndroid Build Coastguard Worker						[]ConfigurableCase[bool]{{
1956*1fa6dee9SAndroid Build Coastguard Worker							patterns: []ConfigurablePattern{{
1957*1fa6dee9SAndroid Build Coastguard Worker								typ:         configurablePatternTypeString,
1958*1fa6dee9SAndroid Build Coastguard Worker								stringValue: "a",
1959*1fa6dee9SAndroid Build Coastguard Worker							}},
1960*1fa6dee9SAndroid Build Coastguard Worker							value: &parser.Bool{Value: true},
1961*1fa6dee9SAndroid Build Coastguard Worker						}, {
1962*1fa6dee9SAndroid Build Coastguard Worker							patterns: []ConfigurablePattern{{
1963*1fa6dee9SAndroid Build Coastguard Worker								typ: configurablePatternTypeDefault,
1964*1fa6dee9SAndroid Build Coastguard Worker							}},
1965*1fa6dee9SAndroid Build Coastguard Worker							value: &parser.Bool{Value: false},
1966*1fa6dee9SAndroid Build Coastguard Worker						}},
1967*1fa6dee9SAndroid Build Coastguard Worker					),
1968*1fa6dee9SAndroid Build Coastguard Worker				},
1969*1fa6dee9SAndroid Build Coastguard Worker			},
1970*1fa6dee9SAndroid Build Coastguard Worker			src: &struct{ S bool }{
1971*1fa6dee9SAndroid Build Coastguard Worker				S: true,
1972*1fa6dee9SAndroid Build Coastguard Worker			},
1973*1fa6dee9SAndroid Build Coastguard Worker			out: []interface{}{
1974*1fa6dee9SAndroid Build Coastguard Worker				&struct{ S Configurable[bool] }{
1975*1fa6dee9SAndroid Build Coastguard Worker					S: func() Configurable[bool] {
1976*1fa6dee9SAndroid Build Coastguard Worker						result := NewConfigurable[bool](
1977*1fa6dee9SAndroid Build Coastguard Worker							[]ConfigurableCondition{{
1978*1fa6dee9SAndroid Build Coastguard Worker								functionName: "soong_config_variable",
1979*1fa6dee9SAndroid Build Coastguard Worker								args: []string{
1980*1fa6dee9SAndroid Build Coastguard Worker									"my_namespace",
1981*1fa6dee9SAndroid Build Coastguard Worker									"foo",
1982*1fa6dee9SAndroid Build Coastguard Worker								},
1983*1fa6dee9SAndroid Build Coastguard Worker							}},
1984*1fa6dee9SAndroid Build Coastguard Worker							[]ConfigurableCase[bool]{{
1985*1fa6dee9SAndroid Build Coastguard Worker								patterns: []ConfigurablePattern{{
1986*1fa6dee9SAndroid Build Coastguard Worker									typ:         configurablePatternTypeString,
1987*1fa6dee9SAndroid Build Coastguard Worker									stringValue: "a",
1988*1fa6dee9SAndroid Build Coastguard Worker								}},
1989*1fa6dee9SAndroid Build Coastguard Worker								value: &parser.Bool{Value: true},
1990*1fa6dee9SAndroid Build Coastguard Worker							}, {
1991*1fa6dee9SAndroid Build Coastguard Worker								patterns: []ConfigurablePattern{{
1992*1fa6dee9SAndroid Build Coastguard Worker									typ: configurablePatternTypeDefault,
1993*1fa6dee9SAndroid Build Coastguard Worker								}},
1994*1fa6dee9SAndroid Build Coastguard Worker								value: &parser.Bool{Value: false},
1995*1fa6dee9SAndroid Build Coastguard Worker							}},
1996*1fa6dee9SAndroid Build Coastguard Worker						)
1997*1fa6dee9SAndroid Build Coastguard Worker						result.AppendSimpleValue(true)
1998*1fa6dee9SAndroid Build Coastguard Worker						return result
1999*1fa6dee9SAndroid Build Coastguard Worker					}(),
2000*1fa6dee9SAndroid Build Coastguard Worker				},
2001*1fa6dee9SAndroid Build Coastguard Worker			},
2002*1fa6dee9SAndroid Build Coastguard Worker		},
2003*1fa6dee9SAndroid Build Coastguard Worker	}
2004*1fa6dee9SAndroid Build Coastguard Worker}
2005*1fa6dee9SAndroid Build Coastguard Worker
2006*1fa6dee9SAndroid Build Coastguard Workerfunc TestAppendMatchingProperties(t *testing.T) {
2007*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range appendMatchingPropertiesTestCases() {
2008*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.name, func(t *testing.T) {
2009*1fa6dee9SAndroid Build Coastguard Worker
2010*1fa6dee9SAndroid Build Coastguard Worker			got := testCase.dst
2011*1fa6dee9SAndroid Build Coastguard Worker			var err error
2012*1fa6dee9SAndroid Build Coastguard Worker			var testType string
2013*1fa6dee9SAndroid Build Coastguard Worker
2014*1fa6dee9SAndroid Build Coastguard Worker			switch testCase.order {
2015*1fa6dee9SAndroid Build Coastguard Worker			case Append:
2016*1fa6dee9SAndroid Build Coastguard Worker				testType = "append"
2017*1fa6dee9SAndroid Build Coastguard Worker				err = AppendMatchingProperties(got, testCase.src, testCase.filter)
2018*1fa6dee9SAndroid Build Coastguard Worker			case Prepend:
2019*1fa6dee9SAndroid Build Coastguard Worker				testType = "prepend"
2020*1fa6dee9SAndroid Build Coastguard Worker				err = PrependMatchingProperties(got, testCase.src, testCase.filter)
2021*1fa6dee9SAndroid Build Coastguard Worker			case Replace:
2022*1fa6dee9SAndroid Build Coastguard Worker				testType = "replace"
2023*1fa6dee9SAndroid Build Coastguard Worker				err = ExtendMatchingProperties(got, testCase.src, testCase.filter, OrderReplace)
2024*1fa6dee9SAndroid Build Coastguard Worker			}
2025*1fa6dee9SAndroid Build Coastguard Worker
2026*1fa6dee9SAndroid Build Coastguard Worker			check(t, testType, testCase.name, got, err, testCase.out, testCase.err)
2027*1fa6dee9SAndroid Build Coastguard Worker		})
2028*1fa6dee9SAndroid Build Coastguard Worker	}
2029*1fa6dee9SAndroid Build Coastguard Worker}
2030*1fa6dee9SAndroid Build Coastguard Worker
2031*1fa6dee9SAndroid Build Coastguard Workerfunc TestExtendMatchingProperties(t *testing.T) {
2032*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range appendMatchingPropertiesTestCases() {
2033*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.name, func(t *testing.T) {
2034*1fa6dee9SAndroid Build Coastguard Worker
2035*1fa6dee9SAndroid Build Coastguard Worker			got := testCase.dst
2036*1fa6dee9SAndroid Build Coastguard Worker			var err error
2037*1fa6dee9SAndroid Build Coastguard Worker			var testType string
2038*1fa6dee9SAndroid Build Coastguard Worker
2039*1fa6dee9SAndroid Build Coastguard Worker			order := func(dstField, srcField reflect.StructField) (Order, error) {
2040*1fa6dee9SAndroid Build Coastguard Worker				switch testCase.order {
2041*1fa6dee9SAndroid Build Coastguard Worker				case Append:
2042*1fa6dee9SAndroid Build Coastguard Worker					return Append, nil
2043*1fa6dee9SAndroid Build Coastguard Worker				case Prepend:
2044*1fa6dee9SAndroid Build Coastguard Worker					return Prepend, nil
2045*1fa6dee9SAndroid Build Coastguard Worker				case Replace:
2046*1fa6dee9SAndroid Build Coastguard Worker					return Replace, nil
2047*1fa6dee9SAndroid Build Coastguard Worker				}
2048*1fa6dee9SAndroid Build Coastguard Worker				return Append, errors.New("unknown order")
2049*1fa6dee9SAndroid Build Coastguard Worker			}
2050*1fa6dee9SAndroid Build Coastguard Worker
2051*1fa6dee9SAndroid Build Coastguard Worker			switch testCase.order {
2052*1fa6dee9SAndroid Build Coastguard Worker			case Append:
2053*1fa6dee9SAndroid Build Coastguard Worker				testType = "prepend matching"
2054*1fa6dee9SAndroid Build Coastguard Worker			case Prepend:
2055*1fa6dee9SAndroid Build Coastguard Worker				testType = "append matching"
2056*1fa6dee9SAndroid Build Coastguard Worker			case Replace:
2057*1fa6dee9SAndroid Build Coastguard Worker				testType = "replace matching"
2058*1fa6dee9SAndroid Build Coastguard Worker			}
2059*1fa6dee9SAndroid Build Coastguard Worker
2060*1fa6dee9SAndroid Build Coastguard Worker			err = ExtendMatchingProperties(got, testCase.src, testCase.filter, order)
2061*1fa6dee9SAndroid Build Coastguard Worker
2062*1fa6dee9SAndroid Build Coastguard Worker			check(t, testType, testCase.name, got, err, testCase.out, testCase.err)
2063*1fa6dee9SAndroid Build Coastguard Worker		})
2064*1fa6dee9SAndroid Build Coastguard Worker	}
2065*1fa6dee9SAndroid Build Coastguard Worker}
2066*1fa6dee9SAndroid Build Coastguard Worker
2067*1fa6dee9SAndroid Build Coastguard Workerfunc check(t *testing.T, testType, testString string,
2068*1fa6dee9SAndroid Build Coastguard Worker	got interface{}, err error,
2069*1fa6dee9SAndroid Build Coastguard Worker	expected interface{}, expectedErr error) {
2070*1fa6dee9SAndroid Build Coastguard Worker
2071*1fa6dee9SAndroid Build Coastguard Worker	printedTestCase := false
2072*1fa6dee9SAndroid Build Coastguard Worker	e := func(s string, expected, got interface{}) {
2073*1fa6dee9SAndroid Build Coastguard Worker		if !printedTestCase {
2074*1fa6dee9SAndroid Build Coastguard Worker			t.Errorf("test case %s: %s", testType, testString)
2075*1fa6dee9SAndroid Build Coastguard Worker			printedTestCase = true
2076*1fa6dee9SAndroid Build Coastguard Worker		}
2077*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("incorrect %s", s)
2078*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("  expected: %s", p(expected))
2079*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("       got: %s", p(got))
2080*1fa6dee9SAndroid Build Coastguard Worker	}
2081*1fa6dee9SAndroid Build Coastguard Worker
2082*1fa6dee9SAndroid Build Coastguard Worker	if err != nil {
2083*1fa6dee9SAndroid Build Coastguard Worker		if expectedErr != nil {
2084*1fa6dee9SAndroid Build Coastguard Worker			if err.Error() != expectedErr.Error() {
2085*1fa6dee9SAndroid Build Coastguard Worker				e("unexpected error", expectedErr.Error(), err.Error())
2086*1fa6dee9SAndroid Build Coastguard Worker			}
2087*1fa6dee9SAndroid Build Coastguard Worker		} else {
2088*1fa6dee9SAndroid Build Coastguard Worker			e("unexpected error", nil, err.Error())
2089*1fa6dee9SAndroid Build Coastguard Worker		}
2090*1fa6dee9SAndroid Build Coastguard Worker	} else {
2091*1fa6dee9SAndroid Build Coastguard Worker		if expectedErr != nil {
2092*1fa6dee9SAndroid Build Coastguard Worker			e("missing error", expectedErr, nil)
2093*1fa6dee9SAndroid Build Coastguard Worker		}
2094*1fa6dee9SAndroid Build Coastguard Worker	}
2095*1fa6dee9SAndroid Build Coastguard Worker
2096*1fa6dee9SAndroid Build Coastguard Worker	if !reflect.DeepEqual(expected, got) {
2097*1fa6dee9SAndroid Build Coastguard Worker		e("output:", expected, got)
2098*1fa6dee9SAndroid Build Coastguard Worker	}
2099*1fa6dee9SAndroid Build Coastguard Worker}
2100*1fa6dee9SAndroid Build Coastguard Worker
2101*1fa6dee9SAndroid Build Coastguard Workerfunc p(in interface{}) string {
2102*1fa6dee9SAndroid Build Coastguard Worker	if v, ok := in.([]interface{}); ok {
2103*1fa6dee9SAndroid Build Coastguard Worker		s := make([]string, len(v))
2104*1fa6dee9SAndroid Build Coastguard Worker		for i := range v {
2105*1fa6dee9SAndroid Build Coastguard Worker			s[i] = fmt.Sprintf("%#v", v[i])
2106*1fa6dee9SAndroid Build Coastguard Worker		}
2107*1fa6dee9SAndroid Build Coastguard Worker		return "[" + strings.Join(s, ", ") + "]"
2108*1fa6dee9SAndroid Build Coastguard Worker	} else {
2109*1fa6dee9SAndroid Build Coastguard Worker		return fmt.Sprintf("%#v", in)
2110*1fa6dee9SAndroid Build Coastguard Worker	}
2111*1fa6dee9SAndroid Build Coastguard Worker}
2112