xref: /aosp_15_r20/build/blueprint/bpmodify/cmd/main_test.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
1*1fa6dee9SAndroid Build Coastguard Worker// Copyright 2024 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 main
16*1fa6dee9SAndroid Build Coastguard Worker
17*1fa6dee9SAndroid Build Coastguard Workerimport (
18*1fa6dee9SAndroid Build Coastguard Worker	"bytes"
19*1fa6dee9SAndroid Build Coastguard Worker	"strings"
20*1fa6dee9SAndroid Build Coastguard Worker	"testing"
21*1fa6dee9SAndroid Build Coastguard Worker
22*1fa6dee9SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
23*1fa6dee9SAndroid Build Coastguard Worker)
24*1fa6dee9SAndroid Build Coastguard Worker
25*1fa6dee9SAndroid Build Coastguard Workervar testCases = []struct {
26*1fa6dee9SAndroid Build Coastguard Worker	name            string
27*1fa6dee9SAndroid Build Coastguard Worker	input           string
28*1fa6dee9SAndroid Build Coastguard Worker	output          string
29*1fa6dee9SAndroid Build Coastguard Worker	property        string
30*1fa6dee9SAndroid Build Coastguard Worker	addSet          string
31*1fa6dee9SAndroid Build Coastguard Worker	removeSet       string
32*1fa6dee9SAndroid Build Coastguard Worker	addLiteral      *string
33*1fa6dee9SAndroid Build Coastguard Worker	setString       *string
34*1fa6dee9SAndroid Build Coastguard Worker	setBool         *string
35*1fa6dee9SAndroid Build Coastguard Worker	removeProperty  bool
36*1fa6dee9SAndroid Build Coastguard Worker	replaceProperty string
37*1fa6dee9SAndroid Build Coastguard Worker	moveProperty    bool
38*1fa6dee9SAndroid Build Coastguard Worker	newLocation     string
39*1fa6dee9SAndroid Build Coastguard Worker}{
40*1fa6dee9SAndroid Build Coastguard Worker	{
41*1fa6dee9SAndroid Build Coastguard Worker		name: "add",
42*1fa6dee9SAndroid Build Coastguard Worker		input: `
43*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
44*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
45*1fa6dee9SAndroid Build Coastguard Worker			}
46*1fa6dee9SAndroid Build Coastguard Worker		`,
47*1fa6dee9SAndroid Build Coastguard Worker		output: `
48*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
49*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
50*1fa6dee9SAndroid Build Coastguard Worker				deps: ["bar"],
51*1fa6dee9SAndroid Build Coastguard Worker			}
52*1fa6dee9SAndroid Build Coastguard Worker		`,
53*1fa6dee9SAndroid Build Coastguard Worker		property: "deps",
54*1fa6dee9SAndroid Build Coastguard Worker		addSet:   "bar",
55*1fa6dee9SAndroid Build Coastguard Worker	},
56*1fa6dee9SAndroid Build Coastguard Worker	{
57*1fa6dee9SAndroid Build Coastguard Worker		name: "remove",
58*1fa6dee9SAndroid Build Coastguard Worker		input: `
59*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
60*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
61*1fa6dee9SAndroid Build Coastguard Worker				deps: ["bar"],
62*1fa6dee9SAndroid Build Coastguard Worker			}
63*1fa6dee9SAndroid Build Coastguard Worker		`,
64*1fa6dee9SAndroid Build Coastguard Worker		output: `
65*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
66*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
67*1fa6dee9SAndroid Build Coastguard Worker				deps: [],
68*1fa6dee9SAndroid Build Coastguard Worker			}
69*1fa6dee9SAndroid Build Coastguard Worker		`,
70*1fa6dee9SAndroid Build Coastguard Worker		property:  "deps",
71*1fa6dee9SAndroid Build Coastguard Worker		removeSet: "bar",
72*1fa6dee9SAndroid Build Coastguard Worker	},
73*1fa6dee9SAndroid Build Coastguard Worker	{
74*1fa6dee9SAndroid Build Coastguard Worker		name: "nested add",
75*1fa6dee9SAndroid Build Coastguard Worker		input: `
76*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
77*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
78*1fa6dee9SAndroid Build Coastguard Worker			}
79*1fa6dee9SAndroid Build Coastguard Worker		`,
80*1fa6dee9SAndroid Build Coastguard Worker		output: `
81*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
82*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
83*1fa6dee9SAndroid Build Coastguard Worker				arch: {
84*1fa6dee9SAndroid Build Coastguard Worker					arm: {
85*1fa6dee9SAndroid Build Coastguard Worker						deps: [
86*1fa6dee9SAndroid Build Coastguard Worker							"dep2",
87*1fa6dee9SAndroid Build Coastguard Worker							"nested_dep",],
88*1fa6dee9SAndroid Build Coastguard Worker					},
89*1fa6dee9SAndroid Build Coastguard Worker				},
90*1fa6dee9SAndroid Build Coastguard Worker			}
91*1fa6dee9SAndroid Build Coastguard Worker		`,
92*1fa6dee9SAndroid Build Coastguard Worker		property: "arch.arm.deps",
93*1fa6dee9SAndroid Build Coastguard Worker		addSet:   "nested_dep,dep2",
94*1fa6dee9SAndroid Build Coastguard Worker	},
95*1fa6dee9SAndroid Build Coastguard Worker	{
96*1fa6dee9SAndroid Build Coastguard Worker		name: "nested remove",
97*1fa6dee9SAndroid Build Coastguard Worker		input: `
98*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
99*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
100*1fa6dee9SAndroid Build Coastguard Worker				arch: {
101*1fa6dee9SAndroid Build Coastguard Worker					arm: {
102*1fa6dee9SAndroid Build Coastguard Worker						deps: [
103*1fa6dee9SAndroid Build Coastguard Worker							"dep2",
104*1fa6dee9SAndroid Build Coastguard Worker							"nested_dep",
105*1fa6dee9SAndroid Build Coastguard Worker						],
106*1fa6dee9SAndroid Build Coastguard Worker					},
107*1fa6dee9SAndroid Build Coastguard Worker				},
108*1fa6dee9SAndroid Build Coastguard Worker			}
109*1fa6dee9SAndroid Build Coastguard Worker		`,
110*1fa6dee9SAndroid Build Coastguard Worker		output: `
111*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
112*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
113*1fa6dee9SAndroid Build Coastguard Worker				arch: {
114*1fa6dee9SAndroid Build Coastguard Worker					arm: {
115*1fa6dee9SAndroid Build Coastguard Worker						deps: [
116*1fa6dee9SAndroid Build Coastguard Worker						],
117*1fa6dee9SAndroid Build Coastguard Worker					},
118*1fa6dee9SAndroid Build Coastguard Worker				},
119*1fa6dee9SAndroid Build Coastguard Worker			}
120*1fa6dee9SAndroid Build Coastguard Worker		`,
121*1fa6dee9SAndroid Build Coastguard Worker		property:  "arch.arm.deps",
122*1fa6dee9SAndroid Build Coastguard Worker		removeSet: "nested_dep,dep2",
123*1fa6dee9SAndroid Build Coastguard Worker	},
124*1fa6dee9SAndroid Build Coastguard Worker	{
125*1fa6dee9SAndroid Build Coastguard Worker		name: "add existing",
126*1fa6dee9SAndroid Build Coastguard Worker		input: `
127*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
128*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
129*1fa6dee9SAndroid Build Coastguard Worker				arch: {
130*1fa6dee9SAndroid Build Coastguard Worker					arm: {
131*1fa6dee9SAndroid Build Coastguard Worker						deps: [
132*1fa6dee9SAndroid Build Coastguard Worker							"nested_dep",
133*1fa6dee9SAndroid Build Coastguard Worker							"dep2",
134*1fa6dee9SAndroid Build Coastguard Worker						],
135*1fa6dee9SAndroid Build Coastguard Worker					},
136*1fa6dee9SAndroid Build Coastguard Worker				},
137*1fa6dee9SAndroid Build Coastguard Worker			}
138*1fa6dee9SAndroid Build Coastguard Worker		`,
139*1fa6dee9SAndroid Build Coastguard Worker		output: `
140*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
141*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
142*1fa6dee9SAndroid Build Coastguard Worker				arch: {
143*1fa6dee9SAndroid Build Coastguard Worker					arm: {
144*1fa6dee9SAndroid Build Coastguard Worker						deps: [
145*1fa6dee9SAndroid Build Coastguard Worker							"nested_dep",
146*1fa6dee9SAndroid Build Coastguard Worker							"dep2",
147*1fa6dee9SAndroid Build Coastguard Worker						],
148*1fa6dee9SAndroid Build Coastguard Worker					},
149*1fa6dee9SAndroid Build Coastguard Worker				},
150*1fa6dee9SAndroid Build Coastguard Worker			}
151*1fa6dee9SAndroid Build Coastguard Worker		`,
152*1fa6dee9SAndroid Build Coastguard Worker		property: "arch.arm.deps",
153*1fa6dee9SAndroid Build Coastguard Worker		addSet:   "dep2,dep2",
154*1fa6dee9SAndroid Build Coastguard Worker	},
155*1fa6dee9SAndroid Build Coastguard Worker	{
156*1fa6dee9SAndroid Build Coastguard Worker		name: "remove missing",
157*1fa6dee9SAndroid Build Coastguard Worker		input: `
158*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
159*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
160*1fa6dee9SAndroid Build Coastguard Worker				arch: {
161*1fa6dee9SAndroid Build Coastguard Worker					arm: {
162*1fa6dee9SAndroid Build Coastguard Worker						deps: [
163*1fa6dee9SAndroid Build Coastguard Worker							"nested_dep",
164*1fa6dee9SAndroid Build Coastguard Worker							"dep2",
165*1fa6dee9SAndroid Build Coastguard Worker						],
166*1fa6dee9SAndroid Build Coastguard Worker					},
167*1fa6dee9SAndroid Build Coastguard Worker				},
168*1fa6dee9SAndroid Build Coastguard Worker			}
169*1fa6dee9SAndroid Build Coastguard Worker		`,
170*1fa6dee9SAndroid Build Coastguard Worker		output: `
171*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
172*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
173*1fa6dee9SAndroid Build Coastguard Worker				arch: {
174*1fa6dee9SAndroid Build Coastguard Worker					arm: {
175*1fa6dee9SAndroid Build Coastguard Worker						deps: [
176*1fa6dee9SAndroid Build Coastguard Worker							"nested_dep",
177*1fa6dee9SAndroid Build Coastguard Worker							"dep2",
178*1fa6dee9SAndroid Build Coastguard Worker						],
179*1fa6dee9SAndroid Build Coastguard Worker					},
180*1fa6dee9SAndroid Build Coastguard Worker				},
181*1fa6dee9SAndroid Build Coastguard Worker			}
182*1fa6dee9SAndroid Build Coastguard Worker		`,
183*1fa6dee9SAndroid Build Coastguard Worker		property:  "arch.arm.deps",
184*1fa6dee9SAndroid Build Coastguard Worker		removeSet: "dep3,dep4",
185*1fa6dee9SAndroid Build Coastguard Worker	},
186*1fa6dee9SAndroid Build Coastguard Worker	{
187*1fa6dee9SAndroid Build Coastguard Worker		name: "remove non existent",
188*1fa6dee9SAndroid Build Coastguard Worker		input: `
189*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
190*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
191*1fa6dee9SAndroid Build Coastguard Worker			}
192*1fa6dee9SAndroid Build Coastguard Worker		`,
193*1fa6dee9SAndroid Build Coastguard Worker		output: `
194*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
195*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
196*1fa6dee9SAndroid Build Coastguard Worker			}
197*1fa6dee9SAndroid Build Coastguard Worker		`,
198*1fa6dee9SAndroid Build Coastguard Worker		property:  "deps",
199*1fa6dee9SAndroid Build Coastguard Worker		removeSet: "bar",
200*1fa6dee9SAndroid Build Coastguard Worker	},
201*1fa6dee9SAndroid Build Coastguard Worker	{
202*1fa6dee9SAndroid Build Coastguard Worker		name: "remove non existent nested",
203*1fa6dee9SAndroid Build Coastguard Worker		input: `
204*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
205*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
206*1fa6dee9SAndroid Build Coastguard Worker				arch: {},
207*1fa6dee9SAndroid Build Coastguard Worker			}
208*1fa6dee9SAndroid Build Coastguard Worker		`,
209*1fa6dee9SAndroid Build Coastguard Worker		output: `
210*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
211*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
212*1fa6dee9SAndroid Build Coastguard Worker				arch: {},
213*1fa6dee9SAndroid Build Coastguard Worker			}
214*1fa6dee9SAndroid Build Coastguard Worker		`,
215*1fa6dee9SAndroid Build Coastguard Worker		property:  "arch.arm.deps",
216*1fa6dee9SAndroid Build Coastguard Worker		removeSet: "dep3,dep4",
217*1fa6dee9SAndroid Build Coastguard Worker	},
218*1fa6dee9SAndroid Build Coastguard Worker	{
219*1fa6dee9SAndroid Build Coastguard Worker		name: "add numeric sorted",
220*1fa6dee9SAndroid Build Coastguard Worker		input: `
221*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
222*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
223*1fa6dee9SAndroid Build Coastguard Worker				versions: ["1", "2"],
224*1fa6dee9SAndroid Build Coastguard Worker			}
225*1fa6dee9SAndroid Build Coastguard Worker		`,
226*1fa6dee9SAndroid Build Coastguard Worker		output: `
227*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
228*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
229*1fa6dee9SAndroid Build Coastguard Worker				versions: [
230*1fa6dee9SAndroid Build Coastguard Worker					"1",
231*1fa6dee9SAndroid Build Coastguard Worker					"2",
232*1fa6dee9SAndroid Build Coastguard Worker					"10",
233*1fa6dee9SAndroid Build Coastguard Worker				],
234*1fa6dee9SAndroid Build Coastguard Worker			}
235*1fa6dee9SAndroid Build Coastguard Worker		`,
236*1fa6dee9SAndroid Build Coastguard Worker		property: "versions",
237*1fa6dee9SAndroid Build Coastguard Worker		addSet:   "10",
238*1fa6dee9SAndroid Build Coastguard Worker	},
239*1fa6dee9SAndroid Build Coastguard Worker	{
240*1fa6dee9SAndroid Build Coastguard Worker		name: "add mixed sorted",
241*1fa6dee9SAndroid Build Coastguard Worker		input: `
242*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
243*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
244*1fa6dee9SAndroid Build Coastguard Worker				deps: ["bar-v1-bar", "bar-v2-bar"],
245*1fa6dee9SAndroid Build Coastguard Worker			}
246*1fa6dee9SAndroid Build Coastguard Worker		`,
247*1fa6dee9SAndroid Build Coastguard Worker		output: `
248*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
249*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
250*1fa6dee9SAndroid Build Coastguard Worker				deps: [
251*1fa6dee9SAndroid Build Coastguard Worker					"bar-v1-bar",
252*1fa6dee9SAndroid Build Coastguard Worker					"bar-v2-bar",
253*1fa6dee9SAndroid Build Coastguard Worker					"bar-v10-bar",
254*1fa6dee9SAndroid Build Coastguard Worker				],
255*1fa6dee9SAndroid Build Coastguard Worker			}
256*1fa6dee9SAndroid Build Coastguard Worker		`,
257*1fa6dee9SAndroid Build Coastguard Worker		property: "deps",
258*1fa6dee9SAndroid Build Coastguard Worker		addSet:   "bar-v10-bar",
259*1fa6dee9SAndroid Build Coastguard Worker	},
260*1fa6dee9SAndroid Build Coastguard Worker	{
261*1fa6dee9SAndroid Build Coastguard Worker		name:  "add a struct with literal",
262*1fa6dee9SAndroid Build Coastguard Worker		input: `cc_foo {name: "foo"}`,
263*1fa6dee9SAndroid Build Coastguard Worker		output: `cc_foo {
264*1fa6dee9SAndroid Build Coastguard Worker    name: "foo",
265*1fa6dee9SAndroid Build Coastguard Worker    structs: [
266*1fa6dee9SAndroid Build Coastguard Worker        {
267*1fa6dee9SAndroid Build Coastguard Worker            version: "1",
268*1fa6dee9SAndroid Build Coastguard Worker            imports: [
269*1fa6dee9SAndroid Build Coastguard Worker                "bar1",
270*1fa6dee9SAndroid Build Coastguard Worker                "bar2",
271*1fa6dee9SAndroid Build Coastguard Worker            ],
272*1fa6dee9SAndroid Build Coastguard Worker        },
273*1fa6dee9SAndroid Build Coastguard Worker    ],
274*1fa6dee9SAndroid Build Coastguard Worker}
275*1fa6dee9SAndroid Build Coastguard Worker`,
276*1fa6dee9SAndroid Build Coastguard Worker		property:   "structs",
277*1fa6dee9SAndroid Build Coastguard Worker		addLiteral: proptools.StringPtr(`{version: "1", imports: ["bar1", "bar2"]}`),
278*1fa6dee9SAndroid Build Coastguard Worker	},
279*1fa6dee9SAndroid Build Coastguard Worker	{
280*1fa6dee9SAndroid Build Coastguard Worker		name: "set string",
281*1fa6dee9SAndroid Build Coastguard Worker		input: `
282*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
283*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
284*1fa6dee9SAndroid Build Coastguard Worker			}
285*1fa6dee9SAndroid Build Coastguard Worker		`,
286*1fa6dee9SAndroid Build Coastguard Worker		output: `
287*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
288*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
289*1fa6dee9SAndroid Build Coastguard Worker				foo: "bar",
290*1fa6dee9SAndroid Build Coastguard Worker			}
291*1fa6dee9SAndroid Build Coastguard Worker		`,
292*1fa6dee9SAndroid Build Coastguard Worker		property:  "foo",
293*1fa6dee9SAndroid Build Coastguard Worker		setString: proptools.StringPtr("bar"),
294*1fa6dee9SAndroid Build Coastguard Worker	},
295*1fa6dee9SAndroid Build Coastguard Worker	{
296*1fa6dee9SAndroid Build Coastguard Worker		name: "set existing string",
297*1fa6dee9SAndroid Build Coastguard Worker		input: `
298*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
299*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
300*1fa6dee9SAndroid Build Coastguard Worker				foo: "baz",
301*1fa6dee9SAndroid Build Coastguard Worker			}
302*1fa6dee9SAndroid Build Coastguard Worker		`,
303*1fa6dee9SAndroid Build Coastguard Worker		output: `
304*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
305*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
306*1fa6dee9SAndroid Build Coastguard Worker				foo: "bar",
307*1fa6dee9SAndroid Build Coastguard Worker			}
308*1fa6dee9SAndroid Build Coastguard Worker		`,
309*1fa6dee9SAndroid Build Coastguard Worker		property:  "foo",
310*1fa6dee9SAndroid Build Coastguard Worker		setString: proptools.StringPtr("bar"),
311*1fa6dee9SAndroid Build Coastguard Worker	},
312*1fa6dee9SAndroid Build Coastguard Worker	{
313*1fa6dee9SAndroid Build Coastguard Worker		name: "set bool",
314*1fa6dee9SAndroid Build Coastguard Worker		input: `
315*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
316*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
317*1fa6dee9SAndroid Build Coastguard Worker			}
318*1fa6dee9SAndroid Build Coastguard Worker		`,
319*1fa6dee9SAndroid Build Coastguard Worker		output: `
320*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
321*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
322*1fa6dee9SAndroid Build Coastguard Worker				foo: true,
323*1fa6dee9SAndroid Build Coastguard Worker			}
324*1fa6dee9SAndroid Build Coastguard Worker		`,
325*1fa6dee9SAndroid Build Coastguard Worker		property: "foo",
326*1fa6dee9SAndroid Build Coastguard Worker		setBool:  proptools.StringPtr("true"),
327*1fa6dee9SAndroid Build Coastguard Worker	},
328*1fa6dee9SAndroid Build Coastguard Worker	{
329*1fa6dee9SAndroid Build Coastguard Worker		name: "set existing bool",
330*1fa6dee9SAndroid Build Coastguard Worker		input: `
331*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
332*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
333*1fa6dee9SAndroid Build Coastguard Worker				foo: true,
334*1fa6dee9SAndroid Build Coastguard Worker			}
335*1fa6dee9SAndroid Build Coastguard Worker		`,
336*1fa6dee9SAndroid Build Coastguard Worker		output: `
337*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
338*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
339*1fa6dee9SAndroid Build Coastguard Worker				foo: false,
340*1fa6dee9SAndroid Build Coastguard Worker			}
341*1fa6dee9SAndroid Build Coastguard Worker		`,
342*1fa6dee9SAndroid Build Coastguard Worker		property: "foo",
343*1fa6dee9SAndroid Build Coastguard Worker		setBool:  proptools.StringPtr("false"),
344*1fa6dee9SAndroid Build Coastguard Worker	},
345*1fa6dee9SAndroid Build Coastguard Worker	{
346*1fa6dee9SAndroid Build Coastguard Worker		name: "remove existing property",
347*1fa6dee9SAndroid Build Coastguard Worker		input: `
348*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
349*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
350*1fa6dee9SAndroid Build Coastguard Worker				foo: "baz",
351*1fa6dee9SAndroid Build Coastguard Worker			}
352*1fa6dee9SAndroid Build Coastguard Worker		`,
353*1fa6dee9SAndroid Build Coastguard Worker		output: `
354*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
355*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
356*1fa6dee9SAndroid Build Coastguard Worker			}
357*1fa6dee9SAndroid Build Coastguard Worker		`,
358*1fa6dee9SAndroid Build Coastguard Worker		property:       "foo",
359*1fa6dee9SAndroid Build Coastguard Worker		removeProperty: true,
360*1fa6dee9SAndroid Build Coastguard Worker	}, {
361*1fa6dee9SAndroid Build Coastguard Worker		name: "remove nested property",
362*1fa6dee9SAndroid Build Coastguard Worker		input: `
363*1fa6dee9SAndroid Build Coastguard Worker		cc_foo {
364*1fa6dee9SAndroid Build Coastguard Worker			name: "foo",
365*1fa6dee9SAndroid Build Coastguard Worker			foo: {
366*1fa6dee9SAndroid Build Coastguard Worker				bar: "baz",
367*1fa6dee9SAndroid Build Coastguard Worker			},
368*1fa6dee9SAndroid Build Coastguard Worker		}
369*1fa6dee9SAndroid Build Coastguard Worker	`,
370*1fa6dee9SAndroid Build Coastguard Worker		output: `
371*1fa6dee9SAndroid Build Coastguard Worker		cc_foo {
372*1fa6dee9SAndroid Build Coastguard Worker			name: "foo",
373*1fa6dee9SAndroid Build Coastguard Worker			foo: {},
374*1fa6dee9SAndroid Build Coastguard Worker		}
375*1fa6dee9SAndroid Build Coastguard Worker	`,
376*1fa6dee9SAndroid Build Coastguard Worker		property:       "foo.bar",
377*1fa6dee9SAndroid Build Coastguard Worker		removeProperty: true,
378*1fa6dee9SAndroid Build Coastguard Worker	}, {
379*1fa6dee9SAndroid Build Coastguard Worker		name: "remove non-existing property",
380*1fa6dee9SAndroid Build Coastguard Worker		input: `
381*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
382*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
383*1fa6dee9SAndroid Build Coastguard Worker				foo: "baz",
384*1fa6dee9SAndroid Build Coastguard Worker			}
385*1fa6dee9SAndroid Build Coastguard Worker		`,
386*1fa6dee9SAndroid Build Coastguard Worker		output: `
387*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
388*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
389*1fa6dee9SAndroid Build Coastguard Worker				foo: "baz",
390*1fa6dee9SAndroid Build Coastguard Worker			}
391*1fa6dee9SAndroid Build Coastguard Worker		`,
392*1fa6dee9SAndroid Build Coastguard Worker		property:       "bar",
393*1fa6dee9SAndroid Build Coastguard Worker		removeProperty: true,
394*1fa6dee9SAndroid Build Coastguard Worker	}, {
395*1fa6dee9SAndroid Build Coastguard Worker		name:     "replace property",
396*1fa6dee9SAndroid Build Coastguard Worker		property: "deps",
397*1fa6dee9SAndroid Build Coastguard Worker		input: `
398*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
399*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
400*1fa6dee9SAndroid Build Coastguard Worker				deps: ["baz", "unchanged"],
401*1fa6dee9SAndroid Build Coastguard Worker			}
402*1fa6dee9SAndroid Build Coastguard Worker		`,
403*1fa6dee9SAndroid Build Coastguard Worker		output: `
404*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
405*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
406*1fa6dee9SAndroid Build Coastguard Worker				deps: [
407*1fa6dee9SAndroid Build Coastguard Worker                "baz_lib",
408*1fa6dee9SAndroid Build Coastguard Worker                "unchanged",
409*1fa6dee9SAndroid Build Coastguard Worker				],
410*1fa6dee9SAndroid Build Coastguard Worker			}
411*1fa6dee9SAndroid Build Coastguard Worker		`,
412*1fa6dee9SAndroid Build Coastguard Worker		replaceProperty: "baz=baz_lib,foobar=foobar_lib",
413*1fa6dee9SAndroid Build Coastguard Worker	}, {
414*1fa6dee9SAndroid Build Coastguard Worker		name:     "replace property multiple modules",
415*1fa6dee9SAndroid Build Coastguard Worker		property: "deps,required",
416*1fa6dee9SAndroid Build Coastguard Worker		input: `
417*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
418*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
419*1fa6dee9SAndroid Build Coastguard Worker				deps: ["baz", "unchanged"],
420*1fa6dee9SAndroid Build Coastguard Worker				unchanged: ["baz"],
421*1fa6dee9SAndroid Build Coastguard Worker				required: ["foobar"],
422*1fa6dee9SAndroid Build Coastguard Worker			}
423*1fa6dee9SAndroid Build Coastguard Worker		`,
424*1fa6dee9SAndroid Build Coastguard Worker		output: `
425*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
426*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
427*1fa6dee9SAndroid Build Coastguard Worker				deps: [
428*1fa6dee9SAndroid Build Coastguard Worker								"baz_lib",
429*1fa6dee9SAndroid Build Coastguard Worker								"unchanged",
430*1fa6dee9SAndroid Build Coastguard Worker				],
431*1fa6dee9SAndroid Build Coastguard Worker				unchanged: ["baz"],
432*1fa6dee9SAndroid Build Coastguard Worker				required: ["foobar_lib"],
433*1fa6dee9SAndroid Build Coastguard Worker			}
434*1fa6dee9SAndroid Build Coastguard Worker		`,
435*1fa6dee9SAndroid Build Coastguard Worker		replaceProperty: "baz=baz_lib,foobar=foobar_lib",
436*1fa6dee9SAndroid Build Coastguard Worker	}, {
437*1fa6dee9SAndroid Build Coastguard Worker		name:     "replace property string value",
438*1fa6dee9SAndroid Build Coastguard Worker		property: "name",
439*1fa6dee9SAndroid Build Coastguard Worker		input: `
440*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
441*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
442*1fa6dee9SAndroid Build Coastguard Worker				deps: ["baz"],
443*1fa6dee9SAndroid Build Coastguard Worker				unchanged: ["baz"],
444*1fa6dee9SAndroid Build Coastguard Worker				required: ["foobar"],
445*1fa6dee9SAndroid Build Coastguard Worker			}
446*1fa6dee9SAndroid Build Coastguard Worker		`,
447*1fa6dee9SAndroid Build Coastguard Worker		output: `
448*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
449*1fa6dee9SAndroid Build Coastguard Worker				name: "foo_lib",
450*1fa6dee9SAndroid Build Coastguard Worker				deps: ["baz"],
451*1fa6dee9SAndroid Build Coastguard Worker				unchanged: ["baz"],
452*1fa6dee9SAndroid Build Coastguard Worker				required: ["foobar"],
453*1fa6dee9SAndroid Build Coastguard Worker			}
454*1fa6dee9SAndroid Build Coastguard Worker		`,
455*1fa6dee9SAndroid Build Coastguard Worker		replaceProperty: "foo=foo_lib",
456*1fa6dee9SAndroid Build Coastguard Worker	}, {
457*1fa6dee9SAndroid Build Coastguard Worker		name:     "replace property string and list values",
458*1fa6dee9SAndroid Build Coastguard Worker		property: "name,deps",
459*1fa6dee9SAndroid Build Coastguard Worker		input: `
460*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
461*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
462*1fa6dee9SAndroid Build Coastguard Worker				deps: ["baz"],
463*1fa6dee9SAndroid Build Coastguard Worker				unchanged: ["baz"],
464*1fa6dee9SAndroid Build Coastguard Worker				required: ["foobar"],
465*1fa6dee9SAndroid Build Coastguard Worker			}
466*1fa6dee9SAndroid Build Coastguard Worker		`,
467*1fa6dee9SAndroid Build Coastguard Worker		output: `
468*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
469*1fa6dee9SAndroid Build Coastguard Worker				name: "foo_lib",
470*1fa6dee9SAndroid Build Coastguard Worker				deps: ["baz_lib"],
471*1fa6dee9SAndroid Build Coastguard Worker				unchanged: ["baz"],
472*1fa6dee9SAndroid Build Coastguard Worker				required: ["foobar"],
473*1fa6dee9SAndroid Build Coastguard Worker			}
474*1fa6dee9SAndroid Build Coastguard Worker		`,
475*1fa6dee9SAndroid Build Coastguard Worker		replaceProperty: "foo=foo_lib,baz=baz_lib",
476*1fa6dee9SAndroid Build Coastguard Worker	}, {
477*1fa6dee9SAndroid Build Coastguard Worker		name: "move contents of property into non-existing property",
478*1fa6dee9SAndroid Build Coastguard Worker		input: `
479*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
480*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
481*1fa6dee9SAndroid Build Coastguard Worker				bar: ["barContents"],
482*1fa6dee9SAndroid Build Coastguard Worker				}
483*1fa6dee9SAndroid Build Coastguard Worker`,
484*1fa6dee9SAndroid Build Coastguard Worker		output: `
485*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
486*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
487*1fa6dee9SAndroid Build Coastguard Worker				baz: ["barContents"],
488*1fa6dee9SAndroid Build Coastguard Worker			}
489*1fa6dee9SAndroid Build Coastguard Worker		`,
490*1fa6dee9SAndroid Build Coastguard Worker		property:     "bar",
491*1fa6dee9SAndroid Build Coastguard Worker		moveProperty: true,
492*1fa6dee9SAndroid Build Coastguard Worker		newLocation:  "baz",
493*1fa6dee9SAndroid Build Coastguard Worker	}, {
494*1fa6dee9SAndroid Build Coastguard Worker		name: "move contents of property into existing property",
495*1fa6dee9SAndroid Build Coastguard Worker		input: `
496*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
497*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
498*1fa6dee9SAndroid Build Coastguard Worker				baz: ["bazContents"],
499*1fa6dee9SAndroid Build Coastguard Worker				bar: ["barContents"],
500*1fa6dee9SAndroid Build Coastguard Worker			}
501*1fa6dee9SAndroid Build Coastguard Worker		`,
502*1fa6dee9SAndroid Build Coastguard Worker		output: `
503*1fa6dee9SAndroid Build Coastguard Worker			cc_foo {
504*1fa6dee9SAndroid Build Coastguard Worker				name: "foo",
505*1fa6dee9SAndroid Build Coastguard Worker				baz: [
506*1fa6dee9SAndroid Build Coastguard Worker					"bazContents",
507*1fa6dee9SAndroid Build Coastguard Worker					"barContents",
508*1fa6dee9SAndroid Build Coastguard Worker				],
509*1fa6dee9SAndroid Build Coastguard Worker
510*1fa6dee9SAndroid Build Coastguard Worker			}
511*1fa6dee9SAndroid Build Coastguard Worker		`,
512*1fa6dee9SAndroid Build Coastguard Worker		property:     "bar",
513*1fa6dee9SAndroid Build Coastguard Worker		moveProperty: true,
514*1fa6dee9SAndroid Build Coastguard Worker		newLocation:  "baz",
515*1fa6dee9SAndroid Build Coastguard Worker	}, {
516*1fa6dee9SAndroid Build Coastguard Worker		name: "replace nested",
517*1fa6dee9SAndroid Build Coastguard Worker		input: `
518*1fa6dee9SAndroid Build Coastguard Worker		cc_foo {
519*1fa6dee9SAndroid Build Coastguard Worker			name: "foo",
520*1fa6dee9SAndroid Build Coastguard Worker			foo: {
521*1fa6dee9SAndroid Build Coastguard Worker				bar: "baz",
522*1fa6dee9SAndroid Build Coastguard Worker			},
523*1fa6dee9SAndroid Build Coastguard Worker		}
524*1fa6dee9SAndroid Build Coastguard Worker	`,
525*1fa6dee9SAndroid Build Coastguard Worker		output: `
526*1fa6dee9SAndroid Build Coastguard Worker		cc_foo {
527*1fa6dee9SAndroid Build Coastguard Worker			name: "foo",
528*1fa6dee9SAndroid Build Coastguard Worker			foo: {
529*1fa6dee9SAndroid Build Coastguard Worker				bar: "baz2",
530*1fa6dee9SAndroid Build Coastguard Worker			},
531*1fa6dee9SAndroid Build Coastguard Worker		}
532*1fa6dee9SAndroid Build Coastguard Worker	`,
533*1fa6dee9SAndroid Build Coastguard Worker		property:        "foo.bar",
534*1fa6dee9SAndroid Build Coastguard Worker		replaceProperty: "baz=baz2",
535*1fa6dee9SAndroid Build Coastguard Worker	},
536*1fa6dee9SAndroid Build Coastguard Worker}
537*1fa6dee9SAndroid Build Coastguard Worker
538*1fa6dee9SAndroid Build Coastguard Workerfunc simplifyModuleDefinition(def string) string {
539*1fa6dee9SAndroid Build Coastguard Worker	var result string
540*1fa6dee9SAndroid Build Coastguard Worker	for _, line := range strings.Split(def, "\n") {
541*1fa6dee9SAndroid Build Coastguard Worker		result += strings.TrimSpace(line)
542*1fa6dee9SAndroid Build Coastguard Worker	}
543*1fa6dee9SAndroid Build Coastguard Worker	return result
544*1fa6dee9SAndroid Build Coastguard Worker}
545*1fa6dee9SAndroid Build Coastguard Workerfunc TestProcessModule(t *testing.T) {
546*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range testCases {
547*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.name, func(t *testing.T) {
548*1fa6dee9SAndroid Build Coastguard Worker			targetedProperties.Set(testCase.property)
549*1fa6dee9SAndroid Build Coastguard Worker			addIdents.Set(testCase.addSet)
550*1fa6dee9SAndroid Build Coastguard Worker			removeIdents.Set(testCase.removeSet)
551*1fa6dee9SAndroid Build Coastguard Worker			removeProperty = &testCase.removeProperty
552*1fa6dee9SAndroid Build Coastguard Worker			moveProperty = &testCase.moveProperty
553*1fa6dee9SAndroid Build Coastguard Worker			newLocation = testCase.newLocation
554*1fa6dee9SAndroid Build Coastguard Worker			setString = testCase.setString
555*1fa6dee9SAndroid Build Coastguard Worker			setBool = testCase.setBool
556*1fa6dee9SAndroid Build Coastguard Worker			addLiteral = testCase.addLiteral
557*1fa6dee9SAndroid Build Coastguard Worker			replaceProperty.Set(testCase.replaceProperty)
558*1fa6dee9SAndroid Build Coastguard Worker
559*1fa6dee9SAndroid Build Coastguard Worker			targetedModules.Set("foo")
560*1fa6dee9SAndroid Build Coastguard Worker
561*1fa6dee9SAndroid Build Coastguard Worker			out := &bytes.Buffer{}
562*1fa6dee9SAndroid Build Coastguard Worker			err := processFile("", strings.NewReader(testCase.input), out)
563*1fa6dee9SAndroid Build Coastguard Worker			if err != nil {
564*1fa6dee9SAndroid Build Coastguard Worker				t.Fatalf("unexpected error: %s", err.Error())
565*1fa6dee9SAndroid Build Coastguard Worker			}
566*1fa6dee9SAndroid Build Coastguard Worker			if simplifyModuleDefinition(out.String()) != simplifyModuleDefinition(testCase.output) {
567*1fa6dee9SAndroid Build Coastguard Worker				t.Errorf("expected module definition:")
568*1fa6dee9SAndroid Build Coastguard Worker				t.Errorf("  %s", testCase.output)
569*1fa6dee9SAndroid Build Coastguard Worker				t.Errorf("actual module definition:")
570*1fa6dee9SAndroid Build Coastguard Worker				t.Errorf("  %s", out.String())
571*1fa6dee9SAndroid Build Coastguard Worker			}
572*1fa6dee9SAndroid Build Coastguard Worker		})
573*1fa6dee9SAndroid Build Coastguard Worker	}
574*1fa6dee9SAndroid Build Coastguard Worker}
575*1fa6dee9SAndroid Build Coastguard Worker
576*1fa6dee9SAndroid Build Coastguard Workerfunc TestReplacementsCycleError(t *testing.T) {
577*1fa6dee9SAndroid Build Coastguard Worker	cycleString := "old1=new1,new1=old1"
578*1fa6dee9SAndroid Build Coastguard Worker	err := replaceProperty.Set(cycleString)
579*1fa6dee9SAndroid Build Coastguard Worker
580*1fa6dee9SAndroid Build Coastguard Worker	if err.Error() != "Duplicated replacement name new1" {
581*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("Error message did not match")
582*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("Expected ")
583*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf(" Duplicated replacement name new1")
584*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("actual error:")
585*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("  %s", err.Error())
586*1fa6dee9SAndroid Build Coastguard Worker		t.FailNow()
587*1fa6dee9SAndroid Build Coastguard Worker	}
588*1fa6dee9SAndroid Build Coastguard Worker}
589*1fa6dee9SAndroid Build Coastguard Worker
590*1fa6dee9SAndroid Build Coastguard Workerfunc TestReplacementsDuplicatedError(t *testing.T) {
591*1fa6dee9SAndroid Build Coastguard Worker	cycleString := "a=b,a=c"
592*1fa6dee9SAndroid Build Coastguard Worker	err := replaceProperty.Set(cycleString)
593*1fa6dee9SAndroid Build Coastguard Worker
594*1fa6dee9SAndroid Build Coastguard Worker	if err.Error() != "Duplicated replacement name a" {
595*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("Error message did not match")
596*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("Expected ")
597*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf(" Duplicated replacement name a")
598*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("actual error:")
599*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("  %s", err.Error())
600*1fa6dee9SAndroid Build Coastguard Worker		t.FailNow()
601*1fa6dee9SAndroid Build Coastguard Worker	}
602*1fa6dee9SAndroid Build Coastguard Worker}
603*1fa6dee9SAndroid Build Coastguard Worker
604*1fa6dee9SAndroid Build Coastguard Workerfunc TestReplacementsMultipleReplacedToSame(t *testing.T) {
605*1fa6dee9SAndroid Build Coastguard Worker	cycleString := "a=c,d=c"
606*1fa6dee9SAndroid Build Coastguard Worker	err := replaceProperty.Set(cycleString)
607*1fa6dee9SAndroid Build Coastguard Worker
608*1fa6dee9SAndroid Build Coastguard Worker	if err.Error() != "Duplicated replacement name c" {
609*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("Error message did not match")
610*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("Expected ")
611*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf(" Duplicated replacement name c")
612*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("actual error:")
613*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("  %s", err.Error())
614*1fa6dee9SAndroid Build Coastguard Worker		t.FailNow()
615*1fa6dee9SAndroid Build Coastguard Worker	}
616*1fa6dee9SAndroid Build Coastguard Worker}
617