xref: /aosp_15_r20/build/soong/android/selects_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2024 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage android
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"reflect"
20*333d2b36SAndroid Build Coastguard Worker	"testing"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
23*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workerfunc TestSelects(t *testing.T) {
27*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
28*333d2b36SAndroid Build Coastguard Worker		name           string
29*333d2b36SAndroid Build Coastguard Worker		bp             string
30*333d2b36SAndroid Build Coastguard Worker		fs             MockFS
31*333d2b36SAndroid Build Coastguard Worker		provider       selectsTestProvider
32*333d2b36SAndroid Build Coastguard Worker		providers      map[string]selectsTestProvider
33*333d2b36SAndroid Build Coastguard Worker		vendorVars     map[string]map[string]string
34*333d2b36SAndroid Build Coastguard Worker		vendorVarTypes map[string]map[string]string
35*333d2b36SAndroid Build Coastguard Worker		expectedError  string
36*333d2b36SAndroid Build Coastguard Worker	}{
37*333d2b36SAndroid Build Coastguard Worker		{
38*333d2b36SAndroid Build Coastguard Worker			name: "basic string list",
39*333d2b36SAndroid Build Coastguard Worker			bp: `
40*333d2b36SAndroid Build Coastguard Worker			my_module_type {
41*333d2b36SAndroid Build Coastguard Worker				name: "foo",
42*333d2b36SAndroid Build Coastguard Worker				my_string_list: select(soong_config_variable("my_namespace", "my_variable"), {
43*333d2b36SAndroid Build Coastguard Worker					"a": ["a.cpp"],
44*333d2b36SAndroid Build Coastguard Worker					"b": ["b.cpp"],
45*333d2b36SAndroid Build Coastguard Worker					default: ["c.cpp"],
46*333d2b36SAndroid Build Coastguard Worker				}),
47*333d2b36SAndroid Build Coastguard Worker			}
48*333d2b36SAndroid Build Coastguard Worker			`,
49*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
50*333d2b36SAndroid Build Coastguard Worker				my_string_list: &[]string{"c.cpp"},
51*333d2b36SAndroid Build Coastguard Worker			},
52*333d2b36SAndroid Build Coastguard Worker		},
53*333d2b36SAndroid Build Coastguard Worker		{
54*333d2b36SAndroid Build Coastguard Worker			name: "basic string",
55*333d2b36SAndroid Build Coastguard Worker			bp: `
56*333d2b36SAndroid Build Coastguard Worker			my_module_type {
57*333d2b36SAndroid Build Coastguard Worker				name: "foo",
58*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
59*333d2b36SAndroid Build Coastguard Worker					"a": "a.cpp",
60*333d2b36SAndroid Build Coastguard Worker					"b": "b.cpp",
61*333d2b36SAndroid Build Coastguard Worker					default: "c.cpp",
62*333d2b36SAndroid Build Coastguard Worker				}),
63*333d2b36SAndroid Build Coastguard Worker			}
64*333d2b36SAndroid Build Coastguard Worker			`,
65*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
66*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("c.cpp"),
67*333d2b36SAndroid Build Coastguard Worker			},
68*333d2b36SAndroid Build Coastguard Worker		},
69*333d2b36SAndroid Build Coastguard Worker		{
70*333d2b36SAndroid Build Coastguard Worker			name: "basic bool",
71*333d2b36SAndroid Build Coastguard Worker			bp: `
72*333d2b36SAndroid Build Coastguard Worker			my_module_type {
73*333d2b36SAndroid Build Coastguard Worker				name: "foo",
74*333d2b36SAndroid Build Coastguard Worker				my_bool: select(soong_config_variable("my_namespace", "my_variable"), {
75*333d2b36SAndroid Build Coastguard Worker					"a": true,
76*333d2b36SAndroid Build Coastguard Worker					"b": false,
77*333d2b36SAndroid Build Coastguard Worker					default: true,
78*333d2b36SAndroid Build Coastguard Worker				}),
79*333d2b36SAndroid Build Coastguard Worker			}
80*333d2b36SAndroid Build Coastguard Worker			`,
81*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
82*333d2b36SAndroid Build Coastguard Worker				my_bool: proptools.BoolPtr(true),
83*333d2b36SAndroid Build Coastguard Worker			},
84*333d2b36SAndroid Build Coastguard Worker		},
85*333d2b36SAndroid Build Coastguard Worker		{
86*333d2b36SAndroid Build Coastguard Worker			name: "basic paths",
87*333d2b36SAndroid Build Coastguard Worker			bp: `
88*333d2b36SAndroid Build Coastguard Worker			my_module_type {
89*333d2b36SAndroid Build Coastguard Worker				name: "foo",
90*333d2b36SAndroid Build Coastguard Worker				my_paths: select(soong_config_variable("my_namespace", "my_variable"), {
91*333d2b36SAndroid Build Coastguard Worker					"a": ["foo.txt"],
92*333d2b36SAndroid Build Coastguard Worker					"b": ["bar.txt"],
93*333d2b36SAndroid Build Coastguard Worker					default: ["baz.txt"],
94*333d2b36SAndroid Build Coastguard Worker				}),
95*333d2b36SAndroid Build Coastguard Worker			}
96*333d2b36SAndroid Build Coastguard Worker			`,
97*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
98*333d2b36SAndroid Build Coastguard Worker				my_paths: &[]string{"baz.txt"},
99*333d2b36SAndroid Build Coastguard Worker			},
100*333d2b36SAndroid Build Coastguard Worker		},
101*333d2b36SAndroid Build Coastguard Worker		{
102*333d2b36SAndroid Build Coastguard Worker			name: "Expression in select",
103*333d2b36SAndroid Build Coastguard Worker			bp: `
104*333d2b36SAndroid Build Coastguard Worker			my_module_type {
105*333d2b36SAndroid Build Coastguard Worker				name: "foo",
106*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
107*333d2b36SAndroid Build Coastguard Worker					"a": "foo" + "bar",
108*333d2b36SAndroid Build Coastguard Worker					default: "baz",
109*333d2b36SAndroid Build Coastguard Worker				}),
110*333d2b36SAndroid Build Coastguard Worker			}
111*333d2b36SAndroid Build Coastguard Worker			`,
112*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
113*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("foobar"),
114*333d2b36SAndroid Build Coastguard Worker			},
115*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
116*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
117*333d2b36SAndroid Build Coastguard Worker					"my_variable": "a",
118*333d2b36SAndroid Build Coastguard Worker				},
119*333d2b36SAndroid Build Coastguard Worker			},
120*333d2b36SAndroid Build Coastguard Worker		},
121*333d2b36SAndroid Build Coastguard Worker		{
122*333d2b36SAndroid Build Coastguard Worker			name: "paths with module references",
123*333d2b36SAndroid Build Coastguard Worker			bp: `
124*333d2b36SAndroid Build Coastguard Worker			my_module_type {
125*333d2b36SAndroid Build Coastguard Worker				name: "foo",
126*333d2b36SAndroid Build Coastguard Worker				my_paths: select(soong_config_variable("my_namespace", "my_variable"), {
127*333d2b36SAndroid Build Coastguard Worker					"a": [":a"],
128*333d2b36SAndroid Build Coastguard Worker					"b": [":b"],
129*333d2b36SAndroid Build Coastguard Worker					default: [":c"],
130*333d2b36SAndroid Build Coastguard Worker				}),
131*333d2b36SAndroid Build Coastguard Worker			}
132*333d2b36SAndroid Build Coastguard Worker			`,
133*333d2b36SAndroid Build Coastguard Worker			expectedError: `"foo" depends on undefined module "c"`,
134*333d2b36SAndroid Build Coastguard Worker		},
135*333d2b36SAndroid Build Coastguard Worker		{
136*333d2b36SAndroid Build Coastguard Worker			name: "Select type doesn't match property type",
137*333d2b36SAndroid Build Coastguard Worker			bp: `
138*333d2b36SAndroid Build Coastguard Worker			my_module_type {
139*333d2b36SAndroid Build Coastguard Worker				name: "foo",
140*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
141*333d2b36SAndroid Build Coastguard Worker					"a": false,
142*333d2b36SAndroid Build Coastguard Worker					"b": true,
143*333d2b36SAndroid Build Coastguard Worker					default: true,
144*333d2b36SAndroid Build Coastguard Worker				}),
145*333d2b36SAndroid Build Coastguard Worker			}
146*333d2b36SAndroid Build Coastguard Worker			`,
147*333d2b36SAndroid Build Coastguard Worker			expectedError: `can't assign bool value to string property`,
148*333d2b36SAndroid Build Coastguard Worker		},
149*333d2b36SAndroid Build Coastguard Worker		{
150*333d2b36SAndroid Build Coastguard Worker			name: "String list non-default",
151*333d2b36SAndroid Build Coastguard Worker			bp: `
152*333d2b36SAndroid Build Coastguard Worker			my_module_type {
153*333d2b36SAndroid Build Coastguard Worker				name: "foo",
154*333d2b36SAndroid Build Coastguard Worker				my_string_list: select(soong_config_variable("my_namespace", "my_variable"), {
155*333d2b36SAndroid Build Coastguard Worker					"a": ["a.cpp"],
156*333d2b36SAndroid Build Coastguard Worker					"b": ["b.cpp"],
157*333d2b36SAndroid Build Coastguard Worker					default: ["c.cpp"],
158*333d2b36SAndroid Build Coastguard Worker				}),
159*333d2b36SAndroid Build Coastguard Worker			}
160*333d2b36SAndroid Build Coastguard Worker			`,
161*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
162*333d2b36SAndroid Build Coastguard Worker				my_string_list: &[]string{"a.cpp"},
163*333d2b36SAndroid Build Coastguard Worker			},
164*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
165*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
166*333d2b36SAndroid Build Coastguard Worker					"my_variable": "a",
167*333d2b36SAndroid Build Coastguard Worker				},
168*333d2b36SAndroid Build Coastguard Worker			},
169*333d2b36SAndroid Build Coastguard Worker		},
170*333d2b36SAndroid Build Coastguard Worker		{
171*333d2b36SAndroid Build Coastguard Worker			name: "String list append",
172*333d2b36SAndroid Build Coastguard Worker			bp: `
173*333d2b36SAndroid Build Coastguard Worker			my_module_type {
174*333d2b36SAndroid Build Coastguard Worker				name: "foo",
175*333d2b36SAndroid Build Coastguard Worker				my_string_list: select(soong_config_variable("my_namespace", "my_variable"), {
176*333d2b36SAndroid Build Coastguard Worker					"a": ["a.cpp"],
177*333d2b36SAndroid Build Coastguard Worker					"b": ["b.cpp"],
178*333d2b36SAndroid Build Coastguard Worker					default: ["c.cpp"],
179*333d2b36SAndroid Build Coastguard Worker				}) + select(soong_config_variable("my_namespace", "my_variable_2"), {
180*333d2b36SAndroid Build Coastguard Worker					"a2": ["a2.cpp"],
181*333d2b36SAndroid Build Coastguard Worker					"b2": ["b2.cpp"],
182*333d2b36SAndroid Build Coastguard Worker					default: ["c2.cpp"],
183*333d2b36SAndroid Build Coastguard Worker				}),
184*333d2b36SAndroid Build Coastguard Worker			}
185*333d2b36SAndroid Build Coastguard Worker			`,
186*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
187*333d2b36SAndroid Build Coastguard Worker				my_string_list: &[]string{"a.cpp", "c2.cpp"},
188*333d2b36SAndroid Build Coastguard Worker			},
189*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
190*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
191*333d2b36SAndroid Build Coastguard Worker					"my_variable": "a",
192*333d2b36SAndroid Build Coastguard Worker				},
193*333d2b36SAndroid Build Coastguard Worker			},
194*333d2b36SAndroid Build Coastguard Worker		},
195*333d2b36SAndroid Build Coastguard Worker		{
196*333d2b36SAndroid Build Coastguard Worker			name: "String list prepend literal",
197*333d2b36SAndroid Build Coastguard Worker			bp: `
198*333d2b36SAndroid Build Coastguard Worker			my_module_type {
199*333d2b36SAndroid Build Coastguard Worker				name: "foo",
200*333d2b36SAndroid Build Coastguard Worker				my_string_list: ["literal.cpp"] + select(soong_config_variable("my_namespace", "my_variable"), {
201*333d2b36SAndroid Build Coastguard Worker					"a2": ["a2.cpp"],
202*333d2b36SAndroid Build Coastguard Worker					"b2": ["b2.cpp"],
203*333d2b36SAndroid Build Coastguard Worker					default: ["c2.cpp"],
204*333d2b36SAndroid Build Coastguard Worker				}),
205*333d2b36SAndroid Build Coastguard Worker			}
206*333d2b36SAndroid Build Coastguard Worker			`,
207*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
208*333d2b36SAndroid Build Coastguard Worker				my_string_list: &[]string{"literal.cpp", "c2.cpp"},
209*333d2b36SAndroid Build Coastguard Worker			},
210*333d2b36SAndroid Build Coastguard Worker		},
211*333d2b36SAndroid Build Coastguard Worker		{
212*333d2b36SAndroid Build Coastguard Worker			name: "String list append literal",
213*333d2b36SAndroid Build Coastguard Worker			bp: `
214*333d2b36SAndroid Build Coastguard Worker			my_module_type {
215*333d2b36SAndroid Build Coastguard Worker				name: "foo",
216*333d2b36SAndroid Build Coastguard Worker				my_string_list: select(soong_config_variable("my_namespace", "my_variable"), {
217*333d2b36SAndroid Build Coastguard Worker					"a2": ["a2.cpp"],
218*333d2b36SAndroid Build Coastguard Worker					"b2": ["b2.cpp"],
219*333d2b36SAndroid Build Coastguard Worker					default: ["c2.cpp"],
220*333d2b36SAndroid Build Coastguard Worker				}) + ["literal.cpp"],
221*333d2b36SAndroid Build Coastguard Worker			}
222*333d2b36SAndroid Build Coastguard Worker			`,
223*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
224*333d2b36SAndroid Build Coastguard Worker				my_string_list: &[]string{"c2.cpp", "literal.cpp"},
225*333d2b36SAndroid Build Coastguard Worker			},
226*333d2b36SAndroid Build Coastguard Worker		},
227*333d2b36SAndroid Build Coastguard Worker		{
228*333d2b36SAndroid Build Coastguard Worker			name: "true + false = true",
229*333d2b36SAndroid Build Coastguard Worker			bp: `
230*333d2b36SAndroid Build Coastguard Worker			my_module_type {
231*333d2b36SAndroid Build Coastguard Worker				name: "foo",
232*333d2b36SAndroid Build Coastguard Worker				my_bool: select(soong_config_variable("my_namespace", "my_variable"), {
233*333d2b36SAndroid Build Coastguard Worker					"a": true,
234*333d2b36SAndroid Build Coastguard Worker					"b": false,
235*333d2b36SAndroid Build Coastguard Worker					default: true,
236*333d2b36SAndroid Build Coastguard Worker				}) + false,
237*333d2b36SAndroid Build Coastguard Worker			}
238*333d2b36SAndroid Build Coastguard Worker			`,
239*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
240*333d2b36SAndroid Build Coastguard Worker				my_bool: proptools.BoolPtr(true),
241*333d2b36SAndroid Build Coastguard Worker			},
242*333d2b36SAndroid Build Coastguard Worker		},
243*333d2b36SAndroid Build Coastguard Worker		{
244*333d2b36SAndroid Build Coastguard Worker			name: "false + false = false",
245*333d2b36SAndroid Build Coastguard Worker			bp: `
246*333d2b36SAndroid Build Coastguard Worker			my_module_type {
247*333d2b36SAndroid Build Coastguard Worker				name: "foo",
248*333d2b36SAndroid Build Coastguard Worker				my_bool: select(soong_config_variable("my_namespace", "my_variable"), {
249*333d2b36SAndroid Build Coastguard Worker					"a": true,
250*333d2b36SAndroid Build Coastguard Worker					"b": false,
251*333d2b36SAndroid Build Coastguard Worker					default: true,
252*333d2b36SAndroid Build Coastguard Worker				}) + false,
253*333d2b36SAndroid Build Coastguard Worker			}
254*333d2b36SAndroid Build Coastguard Worker			`,
255*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
256*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
257*333d2b36SAndroid Build Coastguard Worker					"my_variable": "b",
258*333d2b36SAndroid Build Coastguard Worker				},
259*333d2b36SAndroid Build Coastguard Worker			},
260*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
261*333d2b36SAndroid Build Coastguard Worker				my_bool: proptools.BoolPtr(false),
262*333d2b36SAndroid Build Coastguard Worker			},
263*333d2b36SAndroid Build Coastguard Worker		},
264*333d2b36SAndroid Build Coastguard Worker		{
265*333d2b36SAndroid Build Coastguard Worker			name: "Append string",
266*333d2b36SAndroid Build Coastguard Worker			bp: `
267*333d2b36SAndroid Build Coastguard Worker			my_module_type {
268*333d2b36SAndroid Build Coastguard Worker				name: "foo",
269*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
270*333d2b36SAndroid Build Coastguard Worker					"a": "a",
271*333d2b36SAndroid Build Coastguard Worker					"b": "b",
272*333d2b36SAndroid Build Coastguard Worker					default: "c",
273*333d2b36SAndroid Build Coastguard Worker				}) + ".cpp",
274*333d2b36SAndroid Build Coastguard Worker			}
275*333d2b36SAndroid Build Coastguard Worker			`,
276*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
277*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("c.cpp"),
278*333d2b36SAndroid Build Coastguard Worker			},
279*333d2b36SAndroid Build Coastguard Worker		},
280*333d2b36SAndroid Build Coastguard Worker		{
281*333d2b36SAndroid Build Coastguard Worker			name: "Select on arch",
282*333d2b36SAndroid Build Coastguard Worker			bp: `
283*333d2b36SAndroid Build Coastguard Worker			my_module_type {
284*333d2b36SAndroid Build Coastguard Worker				name: "foo",
285*333d2b36SAndroid Build Coastguard Worker				my_string: select(arch(), {
286*333d2b36SAndroid Build Coastguard Worker					"x86": "my_x86",
287*333d2b36SAndroid Build Coastguard Worker					"x86_64": "my_x86_64",
288*333d2b36SAndroid Build Coastguard Worker					"arm": "my_arm",
289*333d2b36SAndroid Build Coastguard Worker					"arm64": "my_arm64",
290*333d2b36SAndroid Build Coastguard Worker					default: "my_default",
291*333d2b36SAndroid Build Coastguard Worker				}),
292*333d2b36SAndroid Build Coastguard Worker			}
293*333d2b36SAndroid Build Coastguard Worker			`,
294*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
295*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("my_arm64"),
296*333d2b36SAndroid Build Coastguard Worker			},
297*333d2b36SAndroid Build Coastguard Worker		},
298*333d2b36SAndroid Build Coastguard Worker		{
299*333d2b36SAndroid Build Coastguard Worker			name: "Select on os",
300*333d2b36SAndroid Build Coastguard Worker			bp: `
301*333d2b36SAndroid Build Coastguard Worker			my_module_type {
302*333d2b36SAndroid Build Coastguard Worker				name: "foo",
303*333d2b36SAndroid Build Coastguard Worker				my_string: select(os(), {
304*333d2b36SAndroid Build Coastguard Worker					"android": "my_android",
305*333d2b36SAndroid Build Coastguard Worker					"linux": "my_linux",
306*333d2b36SAndroid Build Coastguard Worker					default: "my_default",
307*333d2b36SAndroid Build Coastguard Worker				}),
308*333d2b36SAndroid Build Coastguard Worker			}
309*333d2b36SAndroid Build Coastguard Worker			`,
310*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
311*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("my_android"),
312*333d2b36SAndroid Build Coastguard Worker			},
313*333d2b36SAndroid Build Coastguard Worker		},
314*333d2b36SAndroid Build Coastguard Worker		{
315*333d2b36SAndroid Build Coastguard Worker			name: "Unset value",
316*333d2b36SAndroid Build Coastguard Worker			bp: `
317*333d2b36SAndroid Build Coastguard Worker			my_module_type {
318*333d2b36SAndroid Build Coastguard Worker				name: "foo",
319*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
320*333d2b36SAndroid Build Coastguard Worker					"a": unset,
321*333d2b36SAndroid Build Coastguard Worker					"b": "b",
322*333d2b36SAndroid Build Coastguard Worker					default: "c",
323*333d2b36SAndroid Build Coastguard Worker				})
324*333d2b36SAndroid Build Coastguard Worker			}
325*333d2b36SAndroid Build Coastguard Worker			`,
326*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
327*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
328*333d2b36SAndroid Build Coastguard Worker					"my_variable": "a",
329*333d2b36SAndroid Build Coastguard Worker				},
330*333d2b36SAndroid Build Coastguard Worker			},
331*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{},
332*333d2b36SAndroid Build Coastguard Worker		},
333*333d2b36SAndroid Build Coastguard Worker		{
334*333d2b36SAndroid Build Coastguard Worker			name: "Unset value on different branch",
335*333d2b36SAndroid Build Coastguard Worker			bp: `
336*333d2b36SAndroid Build Coastguard Worker			my_module_type {
337*333d2b36SAndroid Build Coastguard Worker				name: "foo",
338*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
339*333d2b36SAndroid Build Coastguard Worker					"a": unset,
340*333d2b36SAndroid Build Coastguard Worker					"b": "b",
341*333d2b36SAndroid Build Coastguard Worker					default: "c",
342*333d2b36SAndroid Build Coastguard Worker				})
343*333d2b36SAndroid Build Coastguard Worker			}
344*333d2b36SAndroid Build Coastguard Worker			`,
345*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
346*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("c"),
347*333d2b36SAndroid Build Coastguard Worker			},
348*333d2b36SAndroid Build Coastguard Worker		},
349*333d2b36SAndroid Build Coastguard Worker		{
350*333d2b36SAndroid Build Coastguard Worker			name: "unset + unset = unset",
351*333d2b36SAndroid Build Coastguard Worker			bp: `
352*333d2b36SAndroid Build Coastguard Worker			my_module_type {
353*333d2b36SAndroid Build Coastguard Worker				name: "foo",
354*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
355*333d2b36SAndroid Build Coastguard Worker					"foo": "bar",
356*333d2b36SAndroid Build Coastguard Worker					default: unset,
357*333d2b36SAndroid Build Coastguard Worker				}) + select(soong_config_variable("my_namespace", "my_variable2"), {
358*333d2b36SAndroid Build Coastguard Worker					"baz": "qux",
359*333d2b36SAndroid Build Coastguard Worker					default: unset,
360*333d2b36SAndroid Build Coastguard Worker				})
361*333d2b36SAndroid Build Coastguard Worker			}
362*333d2b36SAndroid Build Coastguard Worker			`,
363*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{},
364*333d2b36SAndroid Build Coastguard Worker		},
365*333d2b36SAndroid Build Coastguard Worker		{
366*333d2b36SAndroid Build Coastguard Worker			name: "unset + string = string",
367*333d2b36SAndroid Build Coastguard Worker			bp: `
368*333d2b36SAndroid Build Coastguard Worker			my_module_type {
369*333d2b36SAndroid Build Coastguard Worker				name: "foo",
370*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
371*333d2b36SAndroid Build Coastguard Worker					"foo": "bar",
372*333d2b36SAndroid Build Coastguard Worker					default: unset,
373*333d2b36SAndroid Build Coastguard Worker				}) + select(soong_config_variable("my_namespace", "my_variable2"), {
374*333d2b36SAndroid Build Coastguard Worker					default: "a",
375*333d2b36SAndroid Build Coastguard Worker				})
376*333d2b36SAndroid Build Coastguard Worker			}
377*333d2b36SAndroid Build Coastguard Worker			`,
378*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
379*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("a"),
380*333d2b36SAndroid Build Coastguard Worker			},
381*333d2b36SAndroid Build Coastguard Worker		},
382*333d2b36SAndroid Build Coastguard Worker		{
383*333d2b36SAndroid Build Coastguard Worker			name: "unset + bool = bool",
384*333d2b36SAndroid Build Coastguard Worker			bp: `
385*333d2b36SAndroid Build Coastguard Worker			my_module_type {
386*333d2b36SAndroid Build Coastguard Worker				name: "foo",
387*333d2b36SAndroid Build Coastguard Worker				my_bool: select(soong_config_variable("my_namespace", "my_variable"), {
388*333d2b36SAndroid Build Coastguard Worker					"a": true,
389*333d2b36SAndroid Build Coastguard Worker					default: unset,
390*333d2b36SAndroid Build Coastguard Worker				}) + select(soong_config_variable("my_namespace", "my_variable2"), {
391*333d2b36SAndroid Build Coastguard Worker					default: true,
392*333d2b36SAndroid Build Coastguard Worker				})
393*333d2b36SAndroid Build Coastguard Worker			}
394*333d2b36SAndroid Build Coastguard Worker			`,
395*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
396*333d2b36SAndroid Build Coastguard Worker				my_bool: proptools.BoolPtr(true),
397*333d2b36SAndroid Build Coastguard Worker			},
398*333d2b36SAndroid Build Coastguard Worker		},
399*333d2b36SAndroid Build Coastguard Worker		{
400*333d2b36SAndroid Build Coastguard Worker			name: "defaults with lists are appended",
401*333d2b36SAndroid Build Coastguard Worker			bp: `
402*333d2b36SAndroid Build Coastguard Worker			my_module_type {
403*333d2b36SAndroid Build Coastguard Worker				name: "foo",
404*333d2b36SAndroid Build Coastguard Worker				defaults: ["bar"],
405*333d2b36SAndroid Build Coastguard Worker				my_string_list: select(soong_config_variable("my_namespace", "my_variable"), {
406*333d2b36SAndroid Build Coastguard Worker					"a": ["a1"],
407*333d2b36SAndroid Build Coastguard Worker					default: ["b1"],
408*333d2b36SAndroid Build Coastguard Worker				}),
409*333d2b36SAndroid Build Coastguard Worker			}
410*333d2b36SAndroid Build Coastguard Worker			my_defaults {
411*333d2b36SAndroid Build Coastguard Worker				name: "bar",
412*333d2b36SAndroid Build Coastguard Worker				my_string_list: select(soong_config_variable("my_namespace", "my_variable2"), {
413*333d2b36SAndroid Build Coastguard Worker					"a": ["a2"],
414*333d2b36SAndroid Build Coastguard Worker					default: ["b2"],
415*333d2b36SAndroid Build Coastguard Worker				}),
416*333d2b36SAndroid Build Coastguard Worker			}
417*333d2b36SAndroid Build Coastguard Worker			`,
418*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
419*333d2b36SAndroid Build Coastguard Worker				my_string_list: &[]string{"b2", "b1"},
420*333d2b36SAndroid Build Coastguard Worker			},
421*333d2b36SAndroid Build Coastguard Worker		},
422*333d2b36SAndroid Build Coastguard Worker		{
423*333d2b36SAndroid Build Coastguard Worker			name: "defaults applied to multiple modules",
424*333d2b36SAndroid Build Coastguard Worker			bp: `
425*333d2b36SAndroid Build Coastguard Worker			my_module_type {
426*333d2b36SAndroid Build Coastguard Worker				name: "foo2",
427*333d2b36SAndroid Build Coastguard Worker				defaults: ["bar"],
428*333d2b36SAndroid Build Coastguard Worker				my_string_list: select(soong_config_variable("my_namespace", "my_variable"), {
429*333d2b36SAndroid Build Coastguard Worker					"a": ["a1"],
430*333d2b36SAndroid Build Coastguard Worker					default: ["b1"],
431*333d2b36SAndroid Build Coastguard Worker				}),
432*333d2b36SAndroid Build Coastguard Worker			}
433*333d2b36SAndroid Build Coastguard Worker			my_module_type {
434*333d2b36SAndroid Build Coastguard Worker				name: "foo",
435*333d2b36SAndroid Build Coastguard Worker				defaults: ["bar"],
436*333d2b36SAndroid Build Coastguard Worker				my_string_list: select(soong_config_variable("my_namespace", "my_variable"), {
437*333d2b36SAndroid Build Coastguard Worker					"a": ["a1"],
438*333d2b36SAndroid Build Coastguard Worker					default: ["b1"],
439*333d2b36SAndroid Build Coastguard Worker				}),
440*333d2b36SAndroid Build Coastguard Worker			}
441*333d2b36SAndroid Build Coastguard Worker			my_defaults {
442*333d2b36SAndroid Build Coastguard Worker				name: "bar",
443*333d2b36SAndroid Build Coastguard Worker				my_string_list: select(soong_config_variable("my_namespace", "my_variable2"), {
444*333d2b36SAndroid Build Coastguard Worker					"a": ["a2"],
445*333d2b36SAndroid Build Coastguard Worker					default: ["b2"],
446*333d2b36SAndroid Build Coastguard Worker				}),
447*333d2b36SAndroid Build Coastguard Worker			}
448*333d2b36SAndroid Build Coastguard Worker			`,
449*333d2b36SAndroid Build Coastguard Worker			providers: map[string]selectsTestProvider{
450*333d2b36SAndroid Build Coastguard Worker				"foo": {
451*333d2b36SAndroid Build Coastguard Worker					my_string_list: &[]string{"b2", "b1"},
452*333d2b36SAndroid Build Coastguard Worker				},
453*333d2b36SAndroid Build Coastguard Worker				"foo2": {
454*333d2b36SAndroid Build Coastguard Worker					my_string_list: &[]string{"b2", "b1"},
455*333d2b36SAndroid Build Coastguard Worker				},
456*333d2b36SAndroid Build Coastguard Worker			},
457*333d2b36SAndroid Build Coastguard Worker		},
458*333d2b36SAndroid Build Coastguard Worker		{
459*333d2b36SAndroid Build Coastguard Worker			name: "Replacing string list",
460*333d2b36SAndroid Build Coastguard Worker			bp: `
461*333d2b36SAndroid Build Coastguard Worker			my_module_type {
462*333d2b36SAndroid Build Coastguard Worker				name: "foo",
463*333d2b36SAndroid Build Coastguard Worker				defaults: ["bar"],
464*333d2b36SAndroid Build Coastguard Worker				replacing_string_list: select(soong_config_variable("my_namespace", "my_variable"), {
465*333d2b36SAndroid Build Coastguard Worker					"a": ["a1"],
466*333d2b36SAndroid Build Coastguard Worker					default: ["b1"],
467*333d2b36SAndroid Build Coastguard Worker				}),
468*333d2b36SAndroid Build Coastguard Worker			}
469*333d2b36SAndroid Build Coastguard Worker			my_defaults {
470*333d2b36SAndroid Build Coastguard Worker				name: "bar",
471*333d2b36SAndroid Build Coastguard Worker				replacing_string_list: select(soong_config_variable("my_namespace", "my_variable2"), {
472*333d2b36SAndroid Build Coastguard Worker					"a": ["a2"],
473*333d2b36SAndroid Build Coastguard Worker					default: ["b2"],
474*333d2b36SAndroid Build Coastguard Worker				}),
475*333d2b36SAndroid Build Coastguard Worker			}
476*333d2b36SAndroid Build Coastguard Worker			`,
477*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
478*333d2b36SAndroid Build Coastguard Worker				replacing_string_list: &[]string{"b1"},
479*333d2b36SAndroid Build Coastguard Worker			},
480*333d2b36SAndroid Build Coastguard Worker		},
481*333d2b36SAndroid Build Coastguard Worker		{
482*333d2b36SAndroid Build Coastguard Worker			name: "Multi-condition string 1",
483*333d2b36SAndroid Build Coastguard Worker			bp: `
484*333d2b36SAndroid Build Coastguard Worker			my_module_type {
485*333d2b36SAndroid Build Coastguard Worker				name: "foo",
486*333d2b36SAndroid Build Coastguard Worker				my_string: select((
487*333d2b36SAndroid Build Coastguard Worker					soong_config_variable("my_namespace", "my_variable"),
488*333d2b36SAndroid Build Coastguard Worker					soong_config_variable("my_namespace", "my_variable2"),
489*333d2b36SAndroid Build Coastguard Worker				), {
490*333d2b36SAndroid Build Coastguard Worker					("a", "b"): "a+b",
491*333d2b36SAndroid Build Coastguard Worker					("a", default): "a+default",
492*333d2b36SAndroid Build Coastguard Worker					(default, default): "default",
493*333d2b36SAndroid Build Coastguard Worker				}),
494*333d2b36SAndroid Build Coastguard Worker			}
495*333d2b36SAndroid Build Coastguard Worker			`,
496*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
497*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
498*333d2b36SAndroid Build Coastguard Worker					"my_variable":  "a",
499*333d2b36SAndroid Build Coastguard Worker					"my_variable2": "b",
500*333d2b36SAndroid Build Coastguard Worker				},
501*333d2b36SAndroid Build Coastguard Worker			},
502*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
503*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("a+b"),
504*333d2b36SAndroid Build Coastguard Worker			},
505*333d2b36SAndroid Build Coastguard Worker		},
506*333d2b36SAndroid Build Coastguard Worker		{
507*333d2b36SAndroid Build Coastguard Worker			name: "Multi-condition string 2",
508*333d2b36SAndroid Build Coastguard Worker			bp: `
509*333d2b36SAndroid Build Coastguard Worker			my_module_type {
510*333d2b36SAndroid Build Coastguard Worker				name: "foo",
511*333d2b36SAndroid Build Coastguard Worker				my_string: select((
512*333d2b36SAndroid Build Coastguard Worker					soong_config_variable("my_namespace", "my_variable"),
513*333d2b36SAndroid Build Coastguard Worker					soong_config_variable("my_namespace", "my_variable2"),
514*333d2b36SAndroid Build Coastguard Worker				), {
515*333d2b36SAndroid Build Coastguard Worker					("a", "b"): "a+b",
516*333d2b36SAndroid Build Coastguard Worker					("a", default): "a+default",
517*333d2b36SAndroid Build Coastguard Worker					(default, default): "default",
518*333d2b36SAndroid Build Coastguard Worker				}),
519*333d2b36SAndroid Build Coastguard Worker			}
520*333d2b36SAndroid Build Coastguard Worker			`,
521*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
522*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
523*333d2b36SAndroid Build Coastguard Worker					"my_variable":  "a",
524*333d2b36SAndroid Build Coastguard Worker					"my_variable2": "c",
525*333d2b36SAndroid Build Coastguard Worker				},
526*333d2b36SAndroid Build Coastguard Worker			},
527*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
528*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("a+default"),
529*333d2b36SAndroid Build Coastguard Worker			},
530*333d2b36SAndroid Build Coastguard Worker		},
531*333d2b36SAndroid Build Coastguard Worker		{
532*333d2b36SAndroid Build Coastguard Worker			name: "Multi-condition string 3",
533*333d2b36SAndroid Build Coastguard Worker			bp: `
534*333d2b36SAndroid Build Coastguard Worker			my_module_type {
535*333d2b36SAndroid Build Coastguard Worker				name: "foo",
536*333d2b36SAndroid Build Coastguard Worker				my_string: select((
537*333d2b36SAndroid Build Coastguard Worker					soong_config_variable("my_namespace", "my_variable"),
538*333d2b36SAndroid Build Coastguard Worker					soong_config_variable("my_namespace", "my_variable2"),
539*333d2b36SAndroid Build Coastguard Worker				), {
540*333d2b36SAndroid Build Coastguard Worker					("a", "b"): "a+b",
541*333d2b36SAndroid Build Coastguard Worker					("a", default): "a+default",
542*333d2b36SAndroid Build Coastguard Worker					(default, default): "default",
543*333d2b36SAndroid Build Coastguard Worker				}),
544*333d2b36SAndroid Build Coastguard Worker			}
545*333d2b36SAndroid Build Coastguard Worker			`,
546*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
547*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
548*333d2b36SAndroid Build Coastguard Worker					"my_variable":  "c",
549*333d2b36SAndroid Build Coastguard Worker					"my_variable2": "b",
550*333d2b36SAndroid Build Coastguard Worker				},
551*333d2b36SAndroid Build Coastguard Worker			},
552*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
553*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("default"),
554*333d2b36SAndroid Build Coastguard Worker			},
555*333d2b36SAndroid Build Coastguard Worker		},
556*333d2b36SAndroid Build Coastguard Worker		{
557*333d2b36SAndroid Build Coastguard Worker			name: "Unhandled string value",
558*333d2b36SAndroid Build Coastguard Worker			bp: `
559*333d2b36SAndroid Build Coastguard Worker			my_module_type {
560*333d2b36SAndroid Build Coastguard Worker				name: "foo",
561*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
562*333d2b36SAndroid Build Coastguard Worker					"foo": "a",
563*333d2b36SAndroid Build Coastguard Worker					"bar": "b",
564*333d2b36SAndroid Build Coastguard Worker				}),
565*333d2b36SAndroid Build Coastguard Worker			}
566*333d2b36SAndroid Build Coastguard Worker			`,
567*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
568*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
569*333d2b36SAndroid Build Coastguard Worker					"my_variable": "baz",
570*333d2b36SAndroid Build Coastguard Worker				},
571*333d2b36SAndroid Build Coastguard Worker			},
572*333d2b36SAndroid Build Coastguard Worker			expectedError: `my_string: soong_config_variable\("my_namespace", "my_variable"\) had value "baz", which was not handled by the select statement`,
573*333d2b36SAndroid Build Coastguard Worker		},
574*333d2b36SAndroid Build Coastguard Worker		{
575*333d2b36SAndroid Build Coastguard Worker			name: "Select on boolean",
576*333d2b36SAndroid Build Coastguard Worker			bp: `
577*333d2b36SAndroid Build Coastguard Worker			my_module_type {
578*333d2b36SAndroid Build Coastguard Worker				name: "foo",
579*333d2b36SAndroid Build Coastguard Worker				my_string: select(boolean_var_for_testing(), {
580*333d2b36SAndroid Build Coastguard Worker					true: "t",
581*333d2b36SAndroid Build Coastguard Worker					false: "f",
582*333d2b36SAndroid Build Coastguard Worker				}),
583*333d2b36SAndroid Build Coastguard Worker			}
584*333d2b36SAndroid Build Coastguard Worker			`,
585*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
586*333d2b36SAndroid Build Coastguard Worker				"boolean_var": {
587*333d2b36SAndroid Build Coastguard Worker					"for_testing": "true",
588*333d2b36SAndroid Build Coastguard Worker				},
589*333d2b36SAndroid Build Coastguard Worker			},
590*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
591*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("t"),
592*333d2b36SAndroid Build Coastguard Worker			},
593*333d2b36SAndroid Build Coastguard Worker		},
594*333d2b36SAndroid Build Coastguard Worker		{
595*333d2b36SAndroid Build Coastguard Worker			name: "Select on boolean soong config variable",
596*333d2b36SAndroid Build Coastguard Worker			bp: `
597*333d2b36SAndroid Build Coastguard Worker			my_module_type {
598*333d2b36SAndroid Build Coastguard Worker				name: "foo",
599*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
600*333d2b36SAndroid Build Coastguard Worker					true: "t",
601*333d2b36SAndroid Build Coastguard Worker					false: "f",
602*333d2b36SAndroid Build Coastguard Worker				}),
603*333d2b36SAndroid Build Coastguard Worker			}
604*333d2b36SAndroid Build Coastguard Worker			`,
605*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
606*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
607*333d2b36SAndroid Build Coastguard Worker					"my_variable": "true",
608*333d2b36SAndroid Build Coastguard Worker				},
609*333d2b36SAndroid Build Coastguard Worker			},
610*333d2b36SAndroid Build Coastguard Worker			vendorVarTypes: map[string]map[string]string{
611*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
612*333d2b36SAndroid Build Coastguard Worker					"my_variable": "bool",
613*333d2b36SAndroid Build Coastguard Worker				},
614*333d2b36SAndroid Build Coastguard Worker			},
615*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
616*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("t"),
617*333d2b36SAndroid Build Coastguard Worker			},
618*333d2b36SAndroid Build Coastguard Worker		},
619*333d2b36SAndroid Build Coastguard Worker		{
620*333d2b36SAndroid Build Coastguard Worker			name: "Select on boolean false",
621*333d2b36SAndroid Build Coastguard Worker			bp: `
622*333d2b36SAndroid Build Coastguard Worker			my_module_type {
623*333d2b36SAndroid Build Coastguard Worker				name: "foo",
624*333d2b36SAndroid Build Coastguard Worker				my_string: select(boolean_var_for_testing(), {
625*333d2b36SAndroid Build Coastguard Worker					true: "t",
626*333d2b36SAndroid Build Coastguard Worker					false: "f",
627*333d2b36SAndroid Build Coastguard Worker				}),
628*333d2b36SAndroid Build Coastguard Worker			}
629*333d2b36SAndroid Build Coastguard Worker			`,
630*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
631*333d2b36SAndroid Build Coastguard Worker				"boolean_var": {
632*333d2b36SAndroid Build Coastguard Worker					"for_testing": "false",
633*333d2b36SAndroid Build Coastguard Worker				},
634*333d2b36SAndroid Build Coastguard Worker			},
635*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
636*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("f"),
637*333d2b36SAndroid Build Coastguard Worker			},
638*333d2b36SAndroid Build Coastguard Worker		},
639*333d2b36SAndroid Build Coastguard Worker		{
640*333d2b36SAndroid Build Coastguard Worker			name: "Select on boolean undefined",
641*333d2b36SAndroid Build Coastguard Worker			bp: `
642*333d2b36SAndroid Build Coastguard Worker			my_module_type {
643*333d2b36SAndroid Build Coastguard Worker				name: "foo",
644*333d2b36SAndroid Build Coastguard Worker				my_string: select(boolean_var_for_testing(), {
645*333d2b36SAndroid Build Coastguard Worker					true: "t",
646*333d2b36SAndroid Build Coastguard Worker					false: "f",
647*333d2b36SAndroid Build Coastguard Worker				}),
648*333d2b36SAndroid Build Coastguard Worker			}
649*333d2b36SAndroid Build Coastguard Worker			`,
650*333d2b36SAndroid Build Coastguard Worker			expectedError: `my_string: boolean_var_for_testing\(\) had value undefined, which was not handled by the select statement`,
651*333d2b36SAndroid Build Coastguard Worker		},
652*333d2b36SAndroid Build Coastguard Worker		{
653*333d2b36SAndroid Build Coastguard Worker			name: "Select on boolean undefined with default",
654*333d2b36SAndroid Build Coastguard Worker			bp: `
655*333d2b36SAndroid Build Coastguard Worker			my_module_type {
656*333d2b36SAndroid Build Coastguard Worker				name: "foo",
657*333d2b36SAndroid Build Coastguard Worker				my_string: select(boolean_var_for_testing(), {
658*333d2b36SAndroid Build Coastguard Worker					true: "t",
659*333d2b36SAndroid Build Coastguard Worker					false: "f",
660*333d2b36SAndroid Build Coastguard Worker					default: "default",
661*333d2b36SAndroid Build Coastguard Worker				}),
662*333d2b36SAndroid Build Coastguard Worker			}
663*333d2b36SAndroid Build Coastguard Worker			`,
664*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
665*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("default"),
666*333d2b36SAndroid Build Coastguard Worker			},
667*333d2b36SAndroid Build Coastguard Worker		},
668*333d2b36SAndroid Build Coastguard Worker		{
669*333d2b36SAndroid Build Coastguard Worker			name: "Mismatched condition types",
670*333d2b36SAndroid Build Coastguard Worker			bp: `
671*333d2b36SAndroid Build Coastguard Worker			my_module_type {
672*333d2b36SAndroid Build Coastguard Worker				name: "foo",
673*333d2b36SAndroid Build Coastguard Worker				my_string: select(boolean_var_for_testing(), {
674*333d2b36SAndroid Build Coastguard Worker					"true": "t",
675*333d2b36SAndroid Build Coastguard Worker					"false": "f",
676*333d2b36SAndroid Build Coastguard Worker					default: "default",
677*333d2b36SAndroid Build Coastguard Worker				}),
678*333d2b36SAndroid Build Coastguard Worker			}
679*333d2b36SAndroid Build Coastguard Worker			`,
680*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
681*333d2b36SAndroid Build Coastguard Worker				"boolean_var": {
682*333d2b36SAndroid Build Coastguard Worker					"for_testing": "false",
683*333d2b36SAndroid Build Coastguard Worker				},
684*333d2b36SAndroid Build Coastguard Worker			},
685*333d2b36SAndroid Build Coastguard Worker			expectedError: "Expected all branches of a select on condition boolean_var_for_testing\\(\\) to have type bool, found string",
686*333d2b36SAndroid Build Coastguard Worker		},
687*333d2b36SAndroid Build Coastguard Worker		{
688*333d2b36SAndroid Build Coastguard Worker			name: "Assigning select to nonconfigurable bool",
689*333d2b36SAndroid Build Coastguard Worker			bp: `
690*333d2b36SAndroid Build Coastguard Worker			my_module_type {
691*333d2b36SAndroid Build Coastguard Worker				name: "foo",
692*333d2b36SAndroid Build Coastguard Worker				my_nonconfigurable_bool: select(arch(), {
693*333d2b36SAndroid Build Coastguard Worker					"x86_64": true,
694*333d2b36SAndroid Build Coastguard Worker					default: false,
695*333d2b36SAndroid Build Coastguard Worker				}),
696*333d2b36SAndroid Build Coastguard Worker			}
697*333d2b36SAndroid Build Coastguard Worker			`,
698*333d2b36SAndroid Build Coastguard Worker			expectedError: `can't assign select statement to non-configurable property "my_nonconfigurable_bool"`,
699*333d2b36SAndroid Build Coastguard Worker		},
700*333d2b36SAndroid Build Coastguard Worker		{
701*333d2b36SAndroid Build Coastguard Worker			name: "Assigning select to nonconfigurable string",
702*333d2b36SAndroid Build Coastguard Worker			bp: `
703*333d2b36SAndroid Build Coastguard Worker			my_module_type {
704*333d2b36SAndroid Build Coastguard Worker				name: "foo",
705*333d2b36SAndroid Build Coastguard Worker				my_nonconfigurable_string: select(arch(), {
706*333d2b36SAndroid Build Coastguard Worker					"x86_64": "x86!",
707*333d2b36SAndroid Build Coastguard Worker					default: "unknown!",
708*333d2b36SAndroid Build Coastguard Worker				}),
709*333d2b36SAndroid Build Coastguard Worker			}
710*333d2b36SAndroid Build Coastguard Worker			`,
711*333d2b36SAndroid Build Coastguard Worker			expectedError: `can't assign select statement to non-configurable property "my_nonconfigurable_string"`,
712*333d2b36SAndroid Build Coastguard Worker		},
713*333d2b36SAndroid Build Coastguard Worker		{
714*333d2b36SAndroid Build Coastguard Worker			name: "Assigning appended selects to nonconfigurable string",
715*333d2b36SAndroid Build Coastguard Worker			bp: `
716*333d2b36SAndroid Build Coastguard Worker			my_module_type {
717*333d2b36SAndroid Build Coastguard Worker				name: "foo",
718*333d2b36SAndroid Build Coastguard Worker				my_nonconfigurable_string: select(arch(), {
719*333d2b36SAndroid Build Coastguard Worker					"x86_64": "x86!",
720*333d2b36SAndroid Build Coastguard Worker					default: "unknown!",
721*333d2b36SAndroid Build Coastguard Worker				}) + select(os(), {
722*333d2b36SAndroid Build Coastguard Worker					"darwin": "_darwin!",
723*333d2b36SAndroid Build Coastguard Worker					default: "unknown!",
724*333d2b36SAndroid Build Coastguard Worker				}),
725*333d2b36SAndroid Build Coastguard Worker			}
726*333d2b36SAndroid Build Coastguard Worker			`,
727*333d2b36SAndroid Build Coastguard Worker			expectedError: `can't assign select statement to non-configurable property "my_nonconfigurable_string"`,
728*333d2b36SAndroid Build Coastguard Worker		},
729*333d2b36SAndroid Build Coastguard Worker		{
730*333d2b36SAndroid Build Coastguard Worker			name: "Assigning select to nonconfigurable string list",
731*333d2b36SAndroid Build Coastguard Worker			bp: `
732*333d2b36SAndroid Build Coastguard Worker			my_module_type {
733*333d2b36SAndroid Build Coastguard Worker				name: "foo",
734*333d2b36SAndroid Build Coastguard Worker				my_nonconfigurable_string_list: select(arch(), {
735*333d2b36SAndroid Build Coastguard Worker					"x86_64": ["foo", "bar"],
736*333d2b36SAndroid Build Coastguard Worker					default: ["baz", "qux"],
737*333d2b36SAndroid Build Coastguard Worker				}),
738*333d2b36SAndroid Build Coastguard Worker			}
739*333d2b36SAndroid Build Coastguard Worker			`,
740*333d2b36SAndroid Build Coastguard Worker			expectedError: `can't assign select statement to non-configurable property "my_nonconfigurable_string_list"`,
741*333d2b36SAndroid Build Coastguard Worker		},
742*333d2b36SAndroid Build Coastguard Worker		{
743*333d2b36SAndroid Build Coastguard Worker			name: "Select in variable",
744*333d2b36SAndroid Build Coastguard Worker			bp: `
745*333d2b36SAndroid Build Coastguard Worker			my_second_variable = ["after.cpp"]
746*333d2b36SAndroid Build Coastguard Worker			my_variable = select(soong_config_variable("my_namespace", "my_variable"), {
747*333d2b36SAndroid Build Coastguard Worker				"a": ["a.cpp"],
748*333d2b36SAndroid Build Coastguard Worker				"b": ["b.cpp"],
749*333d2b36SAndroid Build Coastguard Worker				default: ["c.cpp"],
750*333d2b36SAndroid Build Coastguard Worker			}) + my_second_variable
751*333d2b36SAndroid Build Coastguard Worker			my_module_type {
752*333d2b36SAndroid Build Coastguard Worker				name: "foo",
753*333d2b36SAndroid Build Coastguard Worker				my_string_list: ["before.cpp"] + my_variable,
754*333d2b36SAndroid Build Coastguard Worker			}
755*333d2b36SAndroid Build Coastguard Worker			`,
756*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
757*333d2b36SAndroid Build Coastguard Worker				my_string_list: &[]string{"before.cpp", "a.cpp", "after.cpp"},
758*333d2b36SAndroid Build Coastguard Worker			},
759*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
760*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
761*333d2b36SAndroid Build Coastguard Worker					"my_variable": "a",
762*333d2b36SAndroid Build Coastguard Worker				},
763*333d2b36SAndroid Build Coastguard Worker			},
764*333d2b36SAndroid Build Coastguard Worker		},
765*333d2b36SAndroid Build Coastguard Worker		{
766*333d2b36SAndroid Build Coastguard Worker			name: "Soong config value variable on configurable property",
767*333d2b36SAndroid Build Coastguard Worker			bp: `
768*333d2b36SAndroid Build Coastguard Worker			soong_config_module_type {
769*333d2b36SAndroid Build Coastguard Worker				name: "soong_config_my_module_type",
770*333d2b36SAndroid Build Coastguard Worker				module_type: "my_module_type",
771*333d2b36SAndroid Build Coastguard Worker				config_namespace: "my_namespace",
772*333d2b36SAndroid Build Coastguard Worker				value_variables: ["my_variable"],
773*333d2b36SAndroid Build Coastguard Worker				properties: ["my_string", "my_string_list"],
774*333d2b36SAndroid Build Coastguard Worker			}
775*333d2b36SAndroid Build Coastguard Worker
776*333d2b36SAndroid Build Coastguard Worker			soong_config_my_module_type {
777*333d2b36SAndroid Build Coastguard Worker				name: "foo",
778*333d2b36SAndroid Build Coastguard Worker				my_string_list: ["before.cpp"],
779*333d2b36SAndroid Build Coastguard Worker				soong_config_variables: {
780*333d2b36SAndroid Build Coastguard Worker					my_variable: {
781*333d2b36SAndroid Build Coastguard Worker						my_string_list: ["after_%s.cpp"],
782*333d2b36SAndroid Build Coastguard Worker						my_string: "%s.cpp",
783*333d2b36SAndroid Build Coastguard Worker					},
784*333d2b36SAndroid Build Coastguard Worker				},
785*333d2b36SAndroid Build Coastguard Worker			}
786*333d2b36SAndroid Build Coastguard Worker			`,
787*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
788*333d2b36SAndroid Build Coastguard Worker				my_string:      proptools.StringPtr("foo.cpp"),
789*333d2b36SAndroid Build Coastguard Worker				my_string_list: &[]string{"before.cpp", "after_foo.cpp"},
790*333d2b36SAndroid Build Coastguard Worker			},
791*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
792*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
793*333d2b36SAndroid Build Coastguard Worker					"my_variable": "foo",
794*333d2b36SAndroid Build Coastguard Worker				},
795*333d2b36SAndroid Build Coastguard Worker			},
796*333d2b36SAndroid Build Coastguard Worker		},
797*333d2b36SAndroid Build Coastguard Worker		{
798*333d2b36SAndroid Build Coastguard Worker			name: "Property appending with variable",
799*333d2b36SAndroid Build Coastguard Worker			bp: `
800*333d2b36SAndroid Build Coastguard Worker			my_variable = ["b.cpp"]
801*333d2b36SAndroid Build Coastguard Worker			my_module_type {
802*333d2b36SAndroid Build Coastguard Worker				name: "foo",
803*333d2b36SAndroid Build Coastguard Worker				my_string_list: ["a.cpp"] + my_variable + select(soong_config_variable("my_namespace", "my_variable"), {
804*333d2b36SAndroid Build Coastguard Worker					"a": ["a.cpp"],
805*333d2b36SAndroid Build Coastguard Worker					"b": ["b.cpp"],
806*333d2b36SAndroid Build Coastguard Worker					default: ["c.cpp"],
807*333d2b36SAndroid Build Coastguard Worker				}),
808*333d2b36SAndroid Build Coastguard Worker			}
809*333d2b36SAndroid Build Coastguard Worker			`,
810*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
811*333d2b36SAndroid Build Coastguard Worker				my_string_list: &[]string{"a.cpp", "b.cpp", "c.cpp"},
812*333d2b36SAndroid Build Coastguard Worker			},
813*333d2b36SAndroid Build Coastguard Worker		},
814*333d2b36SAndroid Build Coastguard Worker		{
815*333d2b36SAndroid Build Coastguard Worker			name: "Test AppendSimpleValue",
816*333d2b36SAndroid Build Coastguard Worker			bp: `
817*333d2b36SAndroid Build Coastguard Worker			my_module_type {
818*333d2b36SAndroid Build Coastguard Worker				name: "foo",
819*333d2b36SAndroid Build Coastguard Worker				my_string_list: ["a.cpp"] + select(soong_config_variable("my_namespace", "my_variable"), {
820*333d2b36SAndroid Build Coastguard Worker					"a": ["a.cpp"],
821*333d2b36SAndroid Build Coastguard Worker					"b": ["b.cpp"],
822*333d2b36SAndroid Build Coastguard Worker					default: ["c.cpp"],
823*333d2b36SAndroid Build Coastguard Worker				}),
824*333d2b36SAndroid Build Coastguard Worker			}
825*333d2b36SAndroid Build Coastguard Worker			`,
826*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
827*333d2b36SAndroid Build Coastguard Worker				"selects_test": {
828*333d2b36SAndroid Build Coastguard Worker					"append_to_string_list": "foo.cpp",
829*333d2b36SAndroid Build Coastguard Worker				},
830*333d2b36SAndroid Build Coastguard Worker			},
831*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
832*333d2b36SAndroid Build Coastguard Worker				my_string_list: &[]string{"a.cpp", "c.cpp", "foo.cpp"},
833*333d2b36SAndroid Build Coastguard Worker			},
834*333d2b36SAndroid Build Coastguard Worker		},
835*333d2b36SAndroid Build Coastguard Worker		{
836*333d2b36SAndroid Build Coastguard Worker			name: "Arch variant bool",
837*333d2b36SAndroid Build Coastguard Worker			bp: `
838*333d2b36SAndroid Build Coastguard Worker			my_variable = ["b.cpp"]
839*333d2b36SAndroid Build Coastguard Worker			my_module_type {
840*333d2b36SAndroid Build Coastguard Worker				name: "foo",
841*333d2b36SAndroid Build Coastguard Worker				arch_variant_configurable_bool: false,
842*333d2b36SAndroid Build Coastguard Worker				target: {
843*333d2b36SAndroid Build Coastguard Worker					bionic_arm64: {
844*333d2b36SAndroid Build Coastguard Worker						enabled: true,
845*333d2b36SAndroid Build Coastguard Worker					},
846*333d2b36SAndroid Build Coastguard Worker				},
847*333d2b36SAndroid Build Coastguard Worker			}
848*333d2b36SAndroid Build Coastguard Worker			`,
849*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
850*333d2b36SAndroid Build Coastguard Worker				arch_variant_configurable_bool: proptools.BoolPtr(false),
851*333d2b36SAndroid Build Coastguard Worker			},
852*333d2b36SAndroid Build Coastguard Worker		},
853*333d2b36SAndroid Build Coastguard Worker		{
854*333d2b36SAndroid Build Coastguard Worker			name: "Simple string binding",
855*333d2b36SAndroid Build Coastguard Worker			bp: `
856*333d2b36SAndroid Build Coastguard Worker			my_module_type {
857*333d2b36SAndroid Build Coastguard Worker				name: "foo",
858*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
859*333d2b36SAndroid Build Coastguard Worker					any @ my_binding: "hello " + my_binding,
860*333d2b36SAndroid Build Coastguard Worker					default: "goodbye",
861*333d2b36SAndroid Build Coastguard Worker				})
862*333d2b36SAndroid Build Coastguard Worker			}
863*333d2b36SAndroid Build Coastguard Worker			`,
864*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
865*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
866*333d2b36SAndroid Build Coastguard Worker					"my_variable": "world!",
867*333d2b36SAndroid Build Coastguard Worker				},
868*333d2b36SAndroid Build Coastguard Worker			},
869*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
870*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("hello world!"),
871*333d2b36SAndroid Build Coastguard Worker			},
872*333d2b36SAndroid Build Coastguard Worker		},
873*333d2b36SAndroid Build Coastguard Worker		{
874*333d2b36SAndroid Build Coastguard Worker			name: "Any branch with binding not taken",
875*333d2b36SAndroid Build Coastguard Worker			bp: `
876*333d2b36SAndroid Build Coastguard Worker			my_module_type {
877*333d2b36SAndroid Build Coastguard Worker				name: "foo",
878*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
879*333d2b36SAndroid Build Coastguard Worker					any @ my_binding: "hello " + my_binding,
880*333d2b36SAndroid Build Coastguard Worker					default: "goodbye",
881*333d2b36SAndroid Build Coastguard Worker				})
882*333d2b36SAndroid Build Coastguard Worker			}
883*333d2b36SAndroid Build Coastguard Worker			`,
884*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
885*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("goodbye"),
886*333d2b36SAndroid Build Coastguard Worker			},
887*333d2b36SAndroid Build Coastguard Worker		},
888*333d2b36SAndroid Build Coastguard Worker		{
889*333d2b36SAndroid Build Coastguard Worker			name: "Any branch without binding",
890*333d2b36SAndroid Build Coastguard Worker			bp: `
891*333d2b36SAndroid Build Coastguard Worker			my_module_type {
892*333d2b36SAndroid Build Coastguard Worker				name: "foo",
893*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
894*333d2b36SAndroid Build Coastguard Worker					any: "hello",
895*333d2b36SAndroid Build Coastguard Worker					default: "goodbye",
896*333d2b36SAndroid Build Coastguard Worker				})
897*333d2b36SAndroid Build Coastguard Worker			}
898*333d2b36SAndroid Build Coastguard Worker			`,
899*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
900*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
901*333d2b36SAndroid Build Coastguard Worker					"my_variable": "world!",
902*333d2b36SAndroid Build Coastguard Worker				},
903*333d2b36SAndroid Build Coastguard Worker			},
904*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
905*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("hello"),
906*333d2b36SAndroid Build Coastguard Worker			},
907*333d2b36SAndroid Build Coastguard Worker		},
908*333d2b36SAndroid Build Coastguard Worker		{
909*333d2b36SAndroid Build Coastguard Worker			name: "Binding conflicts with file-level variable",
910*333d2b36SAndroid Build Coastguard Worker			bp: `
911*333d2b36SAndroid Build Coastguard Worker			my_binding = "asdf"
912*333d2b36SAndroid Build Coastguard Worker			my_module_type {
913*333d2b36SAndroid Build Coastguard Worker				name: "foo",
914*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
915*333d2b36SAndroid Build Coastguard Worker					any @ my_binding: "hello",
916*333d2b36SAndroid Build Coastguard Worker					default: "goodbye",
917*333d2b36SAndroid Build Coastguard Worker				})
918*333d2b36SAndroid Build Coastguard Worker			}
919*333d2b36SAndroid Build Coastguard Worker			`,
920*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
921*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
922*333d2b36SAndroid Build Coastguard Worker					"my_variable": "world!",
923*333d2b36SAndroid Build Coastguard Worker				},
924*333d2b36SAndroid Build Coastguard Worker			},
925*333d2b36SAndroid Build Coastguard Worker			expectedError: "variable already set in inherited scope, previous assignment",
926*333d2b36SAndroid Build Coastguard Worker		},
927*333d2b36SAndroid Build Coastguard Worker		{
928*333d2b36SAndroid Build Coastguard Worker			name: "Binding in combination with file-level variable",
929*333d2b36SAndroid Build Coastguard Worker			bp: `
930*333d2b36SAndroid Build Coastguard Worker			my_var = " there "
931*333d2b36SAndroid Build Coastguard Worker			my_module_type {
932*333d2b36SAndroid Build Coastguard Worker				name: "foo",
933*333d2b36SAndroid Build Coastguard Worker				my_string: select(soong_config_variable("my_namespace", "my_variable"), {
934*333d2b36SAndroid Build Coastguard Worker					any @ my_binding: "hello" + my_var + my_binding,
935*333d2b36SAndroid Build Coastguard Worker					default: "goodbye",
936*333d2b36SAndroid Build Coastguard Worker				})
937*333d2b36SAndroid Build Coastguard Worker			}
938*333d2b36SAndroid Build Coastguard Worker			`,
939*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
940*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
941*333d2b36SAndroid Build Coastguard Worker					"my_variable": "world!",
942*333d2b36SAndroid Build Coastguard Worker				},
943*333d2b36SAndroid Build Coastguard Worker			},
944*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
945*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("hello there world!"),
946*333d2b36SAndroid Build Coastguard Worker			},
947*333d2b36SAndroid Build Coastguard Worker		},
948*333d2b36SAndroid Build Coastguard Worker		{
949*333d2b36SAndroid Build Coastguard Worker			name: "Bindings in subdirectory inherits variable",
950*333d2b36SAndroid Build Coastguard Worker			fs: map[string][]byte{
951*333d2b36SAndroid Build Coastguard Worker				"Android.bp": []byte(`
952*333d2b36SAndroid Build Coastguard Workermy_var = "abcd"
953*333d2b36SAndroid Build Coastguard Worker`),
954*333d2b36SAndroid Build Coastguard Worker				"directoryB/Android.bp": []byte(`
955*333d2b36SAndroid Build Coastguard Workermy_module_type {
956*333d2b36SAndroid Build Coastguard Worker	name: "foo",
957*333d2b36SAndroid Build Coastguard Worker	my_string: select(soong_config_variable("my_namespace", "variable_a"), {
958*333d2b36SAndroid Build Coastguard Worker		any @ my_binding: my_var + my_binding,
959*333d2b36SAndroid Build Coastguard Worker		default: "",
960*333d2b36SAndroid Build Coastguard Worker	}),
961*333d2b36SAndroid Build Coastguard Worker}
962*333d2b36SAndroid Build Coastguard Worker`),
963*333d2b36SAndroid Build Coastguard Worker			},
964*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
965*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
966*333d2b36SAndroid Build Coastguard Worker					"variable_a": "e",
967*333d2b36SAndroid Build Coastguard Worker				},
968*333d2b36SAndroid Build Coastguard Worker			},
969*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
970*333d2b36SAndroid Build Coastguard Worker				my_string: proptools.StringPtr("abcde"),
971*333d2b36SAndroid Build Coastguard Worker			},
972*333d2b36SAndroid Build Coastguard Worker		},
973*333d2b36SAndroid Build Coastguard Worker		{
974*333d2b36SAndroid Build Coastguard Worker			name: "Cannot modify variable after referenced by select",
975*333d2b36SAndroid Build Coastguard Worker			bp: `
976*333d2b36SAndroid Build Coastguard Workermy_var = "foo"
977*333d2b36SAndroid Build Coastguard Workermy_module_type {
978*333d2b36SAndroid Build Coastguard Worker	name: "foo",
979*333d2b36SAndroid Build Coastguard Worker	my_string: select(soong_config_variable("my_namespace", "variable_a"), {
980*333d2b36SAndroid Build Coastguard Worker		"a": my_var,
981*333d2b36SAndroid Build Coastguard Worker		default: "",
982*333d2b36SAndroid Build Coastguard Worker	}),
983*333d2b36SAndroid Build Coastguard Worker}
984*333d2b36SAndroid Build Coastguard Workermy_var += "bar"
985*333d2b36SAndroid Build Coastguard Worker`,
986*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
987*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
988*333d2b36SAndroid Build Coastguard Worker					"variable_a": "b", // notably not the value that causes my_var to be referenced
989*333d2b36SAndroid Build Coastguard Worker				},
990*333d2b36SAndroid Build Coastguard Worker			},
991*333d2b36SAndroid Build Coastguard Worker			expectedError: `modified variable "my_var" with \+= after referencing`,
992*333d2b36SAndroid Build Coastguard Worker		},
993*333d2b36SAndroid Build Coastguard Worker		{
994*333d2b36SAndroid Build Coastguard Worker			name: "Cannot shadow variable with binding",
995*333d2b36SAndroid Build Coastguard Worker			bp: `
996*333d2b36SAndroid Build Coastguard Workermy_var = "foo"
997*333d2b36SAndroid Build Coastguard Workermy_module_type {
998*333d2b36SAndroid Build Coastguard Worker	name: "foo",
999*333d2b36SAndroid Build Coastguard Worker	my_string: select(soong_config_variable("my_namespace", "variable_a"), {
1000*333d2b36SAndroid Build Coastguard Worker		any @ my_var: my_var,
1001*333d2b36SAndroid Build Coastguard Worker		default: "",
1002*333d2b36SAndroid Build Coastguard Worker	}),
1003*333d2b36SAndroid Build Coastguard Worker}
1004*333d2b36SAndroid Build Coastguard Worker`,
1005*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
1006*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
1007*333d2b36SAndroid Build Coastguard Worker					"variable_a": "a",
1008*333d2b36SAndroid Build Coastguard Worker				},
1009*333d2b36SAndroid Build Coastguard Worker			},
1010*333d2b36SAndroid Build Coastguard Worker			expectedError: `variable already set in inherited scope, previous assignment:`,
1011*333d2b36SAndroid Build Coastguard Worker		},
1012*333d2b36SAndroid Build Coastguard Worker		{
1013*333d2b36SAndroid Build Coastguard Worker			name: "Basic string list postprocessor",
1014*333d2b36SAndroid Build Coastguard Worker			bp: `
1015*333d2b36SAndroid Build Coastguard Workermy_defaults {
1016*333d2b36SAndroid Build Coastguard Worker	name: "defaults_a",
1017*333d2b36SAndroid Build Coastguard Worker	my_string_list: ["a", "b", "c"],
1018*333d2b36SAndroid Build Coastguard Worker	string_list_postprocessor_add_to_elements: "1",
1019*333d2b36SAndroid Build Coastguard Worker}
1020*333d2b36SAndroid Build Coastguard Workermy_defaults {
1021*333d2b36SAndroid Build Coastguard Worker	name: "defaults_b",
1022*333d2b36SAndroid Build Coastguard Worker	my_string_list: ["d", "e", "f"],
1023*333d2b36SAndroid Build Coastguard Worker	string_list_postprocessor_add_to_elements: "2",
1024*333d2b36SAndroid Build Coastguard Worker}
1025*333d2b36SAndroid Build Coastguard Workermy_module_type {
1026*333d2b36SAndroid Build Coastguard Worker	name: "foo",
1027*333d2b36SAndroid Build Coastguard Worker	defaults: ["defaults_a", "defaults_b"],
1028*333d2b36SAndroid Build Coastguard Worker}
1029*333d2b36SAndroid Build Coastguard Worker`,
1030*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
1031*333d2b36SAndroid Build Coastguard Worker				my_string_list: &[]string{"d2", "e2", "f2", "a1", "b1", "c1"},
1032*333d2b36SAndroid Build Coastguard Worker			},
1033*333d2b36SAndroid Build Coastguard Worker		},
1034*333d2b36SAndroid Build Coastguard Worker		{
1035*333d2b36SAndroid Build Coastguard Worker			name: "string list variables",
1036*333d2b36SAndroid Build Coastguard Worker			bp: `
1037*333d2b36SAndroid Build Coastguard Workermy_module_type {
1038*333d2b36SAndroid Build Coastguard Worker	name: "foo",
1039*333d2b36SAndroid Build Coastguard Worker	my_string_list: ["a"] + select(soong_config_variable("my_namespace", "my_var"), {
1040*333d2b36SAndroid Build Coastguard Worker		any @ my_var: my_var,
1041*333d2b36SAndroid Build Coastguard Worker		default: [],
1042*333d2b36SAndroid Build Coastguard Worker	}),
1043*333d2b36SAndroid Build Coastguard Worker}
1044*333d2b36SAndroid Build Coastguard Worker`,
1045*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
1046*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
1047*333d2b36SAndroid Build Coastguard Worker					"my_var": "b c",
1048*333d2b36SAndroid Build Coastguard Worker				},
1049*333d2b36SAndroid Build Coastguard Worker			},
1050*333d2b36SAndroid Build Coastguard Worker			vendorVarTypes: map[string]map[string]string{
1051*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
1052*333d2b36SAndroid Build Coastguard Worker					"my_var": "string_list",
1053*333d2b36SAndroid Build Coastguard Worker				},
1054*333d2b36SAndroid Build Coastguard Worker			},
1055*333d2b36SAndroid Build Coastguard Worker			provider: selectsTestProvider{
1056*333d2b36SAndroid Build Coastguard Worker				my_string_list: &[]string{"a", "b", "c"},
1057*333d2b36SAndroid Build Coastguard Worker			},
1058*333d2b36SAndroid Build Coastguard Worker		},
1059*333d2b36SAndroid Build Coastguard Worker		{
1060*333d2b36SAndroid Build Coastguard Worker			name: "string list variables don't match string matchers",
1061*333d2b36SAndroid Build Coastguard Worker			bp: `
1062*333d2b36SAndroid Build Coastguard Workermy_module_type {
1063*333d2b36SAndroid Build Coastguard Worker	name: "foo",
1064*333d2b36SAndroid Build Coastguard Worker	my_string_list: ["a"] + select(soong_config_variable("my_namespace", "my_var"), {
1065*333d2b36SAndroid Build Coastguard Worker		"foo": ["b"],
1066*333d2b36SAndroid Build Coastguard Worker		default: [],
1067*333d2b36SAndroid Build Coastguard Worker	}),
1068*333d2b36SAndroid Build Coastguard Worker}
1069*333d2b36SAndroid Build Coastguard Worker`,
1070*333d2b36SAndroid Build Coastguard Worker			vendorVars: map[string]map[string]string{
1071*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
1072*333d2b36SAndroid Build Coastguard Worker					"my_var": "b c",
1073*333d2b36SAndroid Build Coastguard Worker				},
1074*333d2b36SAndroid Build Coastguard Worker			},
1075*333d2b36SAndroid Build Coastguard Worker			vendorVarTypes: map[string]map[string]string{
1076*333d2b36SAndroid Build Coastguard Worker				"my_namespace": {
1077*333d2b36SAndroid Build Coastguard Worker					"my_var": "string_list",
1078*333d2b36SAndroid Build Coastguard Worker				},
1079*333d2b36SAndroid Build Coastguard Worker			},
1080*333d2b36SAndroid Build Coastguard Worker			expectedError: `Expected all branches of a select on condition soong_config_variable\("my_namespace", "my_var"\) to have type string_list, found string`,
1081*333d2b36SAndroid Build Coastguard Worker		},
1082*333d2b36SAndroid Build Coastguard Worker	}
1083*333d2b36SAndroid Build Coastguard Worker
1084*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
1085*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
1086*333d2b36SAndroid Build Coastguard Worker			fs := tc.fs
1087*333d2b36SAndroid Build Coastguard Worker			if fs == nil {
1088*333d2b36SAndroid Build Coastguard Worker				fs = make(MockFS)
1089*333d2b36SAndroid Build Coastguard Worker			}
1090*333d2b36SAndroid Build Coastguard Worker			if tc.bp != "" {
1091*333d2b36SAndroid Build Coastguard Worker				fs["Android.bp"] = []byte(tc.bp)
1092*333d2b36SAndroid Build Coastguard Worker			}
1093*333d2b36SAndroid Build Coastguard Worker			fixtures := GroupFixturePreparers(
1094*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithDefaults,
1095*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithArchMutator,
1096*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithSoongConfigModuleBuildComponents,
1097*333d2b36SAndroid Build Coastguard Worker				FixtureRegisterWithContext(func(ctx RegistrationContext) {
1098*333d2b36SAndroid Build Coastguard Worker					ctx.RegisterModuleType("my_module_type", newSelectsMockModule)
1099*333d2b36SAndroid Build Coastguard Worker					ctx.RegisterModuleType("my_defaults", newSelectsMockModuleDefaults)
1100*333d2b36SAndroid Build Coastguard Worker				}),
1101*333d2b36SAndroid Build Coastguard Worker				FixtureModifyProductVariables(func(variables FixtureProductVariables) {
1102*333d2b36SAndroid Build Coastguard Worker					variables.VendorVars = tc.vendorVars
1103*333d2b36SAndroid Build Coastguard Worker					variables.VendorVarTypes = tc.vendorVarTypes
1104*333d2b36SAndroid Build Coastguard Worker				}),
1105*333d2b36SAndroid Build Coastguard Worker				FixtureMergeMockFs(fs),
1106*333d2b36SAndroid Build Coastguard Worker			)
1107*333d2b36SAndroid Build Coastguard Worker			if tc.expectedError != "" {
1108*333d2b36SAndroid Build Coastguard Worker				fixtures = fixtures.ExtendWithErrorHandler(FixtureExpectsOneErrorPattern(tc.expectedError))
1109*333d2b36SAndroid Build Coastguard Worker			}
1110*333d2b36SAndroid Build Coastguard Worker			result := fixtures.RunTest(t)
1111*333d2b36SAndroid Build Coastguard Worker
1112*333d2b36SAndroid Build Coastguard Worker			if tc.expectedError == "" {
1113*333d2b36SAndroid Build Coastguard Worker				if len(tc.providers) == 0 {
1114*333d2b36SAndroid Build Coastguard Worker					tc.providers = map[string]selectsTestProvider{
1115*333d2b36SAndroid Build Coastguard Worker						"foo": tc.provider,
1116*333d2b36SAndroid Build Coastguard Worker					}
1117*333d2b36SAndroid Build Coastguard Worker				}
1118*333d2b36SAndroid Build Coastguard Worker
1119*333d2b36SAndroid Build Coastguard Worker				for moduleName := range tc.providers {
1120*333d2b36SAndroid Build Coastguard Worker					expected := tc.providers[moduleName]
1121*333d2b36SAndroid Build Coastguard Worker					m := result.ModuleForTests(moduleName, "android_arm64_armv8-a")
1122*333d2b36SAndroid Build Coastguard Worker					p, _ := OtherModuleProvider(result.testContext.OtherModuleProviderAdaptor(), m.Module(), selectsTestProviderKey)
1123*333d2b36SAndroid Build Coastguard Worker					if !reflect.DeepEqual(p, expected) {
1124*333d2b36SAndroid Build Coastguard Worker						t.Errorf("Expected:\n  %q\ngot:\n  %q", expected.String(), p.String())
1125*333d2b36SAndroid Build Coastguard Worker					}
1126*333d2b36SAndroid Build Coastguard Worker				}
1127*333d2b36SAndroid Build Coastguard Worker			}
1128*333d2b36SAndroid Build Coastguard Worker		})
1129*333d2b36SAndroid Build Coastguard Worker	}
1130*333d2b36SAndroid Build Coastguard Worker}
1131*333d2b36SAndroid Build Coastguard Worker
1132*333d2b36SAndroid Build Coastguard Workertype selectsTestProvider struct {
1133*333d2b36SAndroid Build Coastguard Worker	my_bool                        *bool
1134*333d2b36SAndroid Build Coastguard Worker	my_string                      *string
1135*333d2b36SAndroid Build Coastguard Worker	my_string_list                 *[]string
1136*333d2b36SAndroid Build Coastguard Worker	my_paths                       *[]string
1137*333d2b36SAndroid Build Coastguard Worker	replacing_string_list          *[]string
1138*333d2b36SAndroid Build Coastguard Worker	arch_variant_configurable_bool *bool
1139*333d2b36SAndroid Build Coastguard Worker	my_nonconfigurable_bool        *bool
1140*333d2b36SAndroid Build Coastguard Worker	my_nonconfigurable_string      *string
1141*333d2b36SAndroid Build Coastguard Worker	my_nonconfigurable_string_list []string
1142*333d2b36SAndroid Build Coastguard Worker}
1143*333d2b36SAndroid Build Coastguard Worker
1144*333d2b36SAndroid Build Coastguard Workerfunc (p *selectsTestProvider) String() string {
1145*333d2b36SAndroid Build Coastguard Worker	myBoolStr := "nil"
1146*333d2b36SAndroid Build Coastguard Worker	if p.my_bool != nil {
1147*333d2b36SAndroid Build Coastguard Worker		myBoolStr = fmt.Sprintf("%t", *p.my_bool)
1148*333d2b36SAndroid Build Coastguard Worker	}
1149*333d2b36SAndroid Build Coastguard Worker	myStringStr := "nil"
1150*333d2b36SAndroid Build Coastguard Worker	if p.my_string != nil {
1151*333d2b36SAndroid Build Coastguard Worker		myStringStr = *p.my_string
1152*333d2b36SAndroid Build Coastguard Worker	}
1153*333d2b36SAndroid Build Coastguard Worker	myNonconfigurableStringStr := "nil"
1154*333d2b36SAndroid Build Coastguard Worker	if p.my_nonconfigurable_string != nil {
1155*333d2b36SAndroid Build Coastguard Worker		myNonconfigurableStringStr = *p.my_nonconfigurable_string
1156*333d2b36SAndroid Build Coastguard Worker	}
1157*333d2b36SAndroid Build Coastguard Worker	return fmt.Sprintf(`selectsTestProvider {
1158*333d2b36SAndroid Build Coastguard Worker	my_bool: %v,
1159*333d2b36SAndroid Build Coastguard Worker	my_string: %s,
1160*333d2b36SAndroid Build Coastguard Worker    my_string_list: %s,
1161*333d2b36SAndroid Build Coastguard Worker    my_paths: %s,
1162*333d2b36SAndroid Build Coastguard Worker	replacing_string_list %s,
1163*333d2b36SAndroid Build Coastguard Worker	arch_variant_configurable_bool %v
1164*333d2b36SAndroid Build Coastguard Worker	my_nonconfigurable_bool: %v,
1165*333d2b36SAndroid Build Coastguard Worker	my_nonconfigurable_string: %s,
1166*333d2b36SAndroid Build Coastguard Worker	my_nonconfigurable_string_list: %s,
1167*333d2b36SAndroid Build Coastguard Worker}`,
1168*333d2b36SAndroid Build Coastguard Worker		myBoolStr,
1169*333d2b36SAndroid Build Coastguard Worker		myStringStr,
1170*333d2b36SAndroid Build Coastguard Worker		p.my_string_list,
1171*333d2b36SAndroid Build Coastguard Worker		p.my_paths,
1172*333d2b36SAndroid Build Coastguard Worker		p.replacing_string_list,
1173*333d2b36SAndroid Build Coastguard Worker		p.arch_variant_configurable_bool,
1174*333d2b36SAndroid Build Coastguard Worker		p.my_nonconfigurable_bool,
1175*333d2b36SAndroid Build Coastguard Worker		myNonconfigurableStringStr,
1176*333d2b36SAndroid Build Coastguard Worker		p.my_nonconfigurable_string_list,
1177*333d2b36SAndroid Build Coastguard Worker	)
1178*333d2b36SAndroid Build Coastguard Worker}
1179*333d2b36SAndroid Build Coastguard Worker
1180*333d2b36SAndroid Build Coastguard Workervar selectsTestProviderKey = blueprint.NewProvider[selectsTestProvider]()
1181*333d2b36SAndroid Build Coastguard Worker
1182*333d2b36SAndroid Build Coastguard Workertype selectsMockModuleProperties struct {
1183*333d2b36SAndroid Build Coastguard Worker	My_bool                        proptools.Configurable[bool]
1184*333d2b36SAndroid Build Coastguard Worker	My_string                      proptools.Configurable[string]
1185*333d2b36SAndroid Build Coastguard Worker	My_string_list                 proptools.Configurable[[]string]
1186*333d2b36SAndroid Build Coastguard Worker	My_paths                       proptools.Configurable[[]string] `android:"path"`
1187*333d2b36SAndroid Build Coastguard Worker	Replacing_string_list          proptools.Configurable[[]string] `android:"replace_instead_of_append,arch_variant"`
1188*333d2b36SAndroid Build Coastguard Worker	Arch_variant_configurable_bool proptools.Configurable[bool]     `android:"replace_instead_of_append,arch_variant"`
1189*333d2b36SAndroid Build Coastguard Worker	My_nonconfigurable_bool        *bool
1190*333d2b36SAndroid Build Coastguard Worker	My_nonconfigurable_string      *string
1191*333d2b36SAndroid Build Coastguard Worker	My_nonconfigurable_string_list []string
1192*333d2b36SAndroid Build Coastguard Worker}
1193*333d2b36SAndroid Build Coastguard Worker
1194*333d2b36SAndroid Build Coastguard Workertype selectsMockModule struct {
1195*333d2b36SAndroid Build Coastguard Worker	ModuleBase
1196*333d2b36SAndroid Build Coastguard Worker	DefaultableModuleBase
1197*333d2b36SAndroid Build Coastguard Worker	properties selectsMockModuleProperties
1198*333d2b36SAndroid Build Coastguard Worker}
1199*333d2b36SAndroid Build Coastguard Worker
1200*333d2b36SAndroid Build Coastguard Workerfunc optionalToPtr[T any](o proptools.ConfigurableOptional[T]) *T {
1201*333d2b36SAndroid Build Coastguard Worker	if o.IsEmpty() {
1202*333d2b36SAndroid Build Coastguard Worker		return nil
1203*333d2b36SAndroid Build Coastguard Worker	}
1204*333d2b36SAndroid Build Coastguard Worker	x := o.Get()
1205*333d2b36SAndroid Build Coastguard Worker	return &x
1206*333d2b36SAndroid Build Coastguard Worker}
1207*333d2b36SAndroid Build Coastguard Worker
1208*333d2b36SAndroid Build Coastguard Workerfunc (p *selectsMockModule) GenerateAndroidBuildActions(ctx ModuleContext) {
1209*333d2b36SAndroid Build Coastguard Worker	toAppend := ctx.Config().VendorConfig("selects_test").String("append_to_string_list")
1210*333d2b36SAndroid Build Coastguard Worker	if toAppend != "" {
1211*333d2b36SAndroid Build Coastguard Worker		p.properties.My_string_list.AppendSimpleValue([]string{toAppend})
1212*333d2b36SAndroid Build Coastguard Worker	}
1213*333d2b36SAndroid Build Coastguard Worker	SetProvider(ctx, selectsTestProviderKey, selectsTestProvider{
1214*333d2b36SAndroid Build Coastguard Worker		my_bool:                        optionalToPtr(p.properties.My_bool.Get(ctx)),
1215*333d2b36SAndroid Build Coastguard Worker		my_string:                      optionalToPtr(p.properties.My_string.Get(ctx)),
1216*333d2b36SAndroid Build Coastguard Worker		my_string_list:                 optionalToPtr(p.properties.My_string_list.Get(ctx)),
1217*333d2b36SAndroid Build Coastguard Worker		my_paths:                       optionalToPtr(p.properties.My_paths.Get(ctx)),
1218*333d2b36SAndroid Build Coastguard Worker		replacing_string_list:          optionalToPtr(p.properties.Replacing_string_list.Get(ctx)),
1219*333d2b36SAndroid Build Coastguard Worker		arch_variant_configurable_bool: optionalToPtr(p.properties.Arch_variant_configurable_bool.Get(ctx)),
1220*333d2b36SAndroid Build Coastguard Worker		my_nonconfigurable_bool:        p.properties.My_nonconfigurable_bool,
1221*333d2b36SAndroid Build Coastguard Worker		my_nonconfigurable_string:      p.properties.My_nonconfigurable_string,
1222*333d2b36SAndroid Build Coastguard Worker		my_nonconfigurable_string_list: p.properties.My_nonconfigurable_string_list,
1223*333d2b36SAndroid Build Coastguard Worker	})
1224*333d2b36SAndroid Build Coastguard Worker}
1225*333d2b36SAndroid Build Coastguard Worker
1226*333d2b36SAndroid Build Coastguard Workerfunc newSelectsMockModule() Module {
1227*333d2b36SAndroid Build Coastguard Worker	m := &selectsMockModule{}
1228*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
1229*333d2b36SAndroid Build Coastguard Worker	InitAndroidArchModule(m, HostAndDeviceSupported, MultilibFirst)
1230*333d2b36SAndroid Build Coastguard Worker	InitDefaultableModule(m)
1231*333d2b36SAndroid Build Coastguard Worker	return m
1232*333d2b36SAndroid Build Coastguard Worker}
1233*333d2b36SAndroid Build Coastguard Worker
1234*333d2b36SAndroid Build Coastguard Workertype selectsMockDefaultsProperties struct {
1235*333d2b36SAndroid Build Coastguard Worker	String_list_postprocessor_add_to_elements string
1236*333d2b36SAndroid Build Coastguard Worker}
1237*333d2b36SAndroid Build Coastguard Worker
1238*333d2b36SAndroid Build Coastguard Workertype selectsMockModuleDefaults struct {
1239*333d2b36SAndroid Build Coastguard Worker	ModuleBase
1240*333d2b36SAndroid Build Coastguard Worker	DefaultsModuleBase
1241*333d2b36SAndroid Build Coastguard Worker	myProperties       selectsMockModuleProperties
1242*333d2b36SAndroid Build Coastguard Worker	defaultsProperties selectsMockDefaultsProperties
1243*333d2b36SAndroid Build Coastguard Worker}
1244*333d2b36SAndroid Build Coastguard Worker
1245*333d2b36SAndroid Build Coastguard Workerfunc (d *selectsMockModuleDefaults) GenerateAndroidBuildActions(ctx ModuleContext) {
1246*333d2b36SAndroid Build Coastguard Worker}
1247*333d2b36SAndroid Build Coastguard Worker
1248*333d2b36SAndroid Build Coastguard Workerfunc newSelectsMockModuleDefaults() Module {
1249*333d2b36SAndroid Build Coastguard Worker	module := &selectsMockModuleDefaults{}
1250*333d2b36SAndroid Build Coastguard Worker
1251*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(
1252*333d2b36SAndroid Build Coastguard Worker		&module.myProperties,
1253*333d2b36SAndroid Build Coastguard Worker		&module.defaultsProperties,
1254*333d2b36SAndroid Build Coastguard Worker	)
1255*333d2b36SAndroid Build Coastguard Worker
1256*333d2b36SAndroid Build Coastguard Worker	InitDefaultsModule(module)
1257*333d2b36SAndroid Build Coastguard Worker
1258*333d2b36SAndroid Build Coastguard Worker	AddLoadHook(module, func(lhc LoadHookContext) {
1259*333d2b36SAndroid Build Coastguard Worker		if module.defaultsProperties.String_list_postprocessor_add_to_elements != "" {
1260*333d2b36SAndroid Build Coastguard Worker			module.myProperties.My_string_list.AddPostProcessor(func(x []string) []string {
1261*333d2b36SAndroid Build Coastguard Worker				for i := range x {
1262*333d2b36SAndroid Build Coastguard Worker					x[i] = x[i] + module.defaultsProperties.String_list_postprocessor_add_to_elements
1263*333d2b36SAndroid Build Coastguard Worker				}
1264*333d2b36SAndroid Build Coastguard Worker				return x
1265*333d2b36SAndroid Build Coastguard Worker			})
1266*333d2b36SAndroid Build Coastguard Worker		}
1267*333d2b36SAndroid Build Coastguard Worker	})
1268*333d2b36SAndroid Build Coastguard Worker
1269*333d2b36SAndroid Build Coastguard Worker	return module
1270*333d2b36SAndroid Build Coastguard Worker}
1271