xref: /aosp_15_r20/build/blueprint/ninja_writer_test.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
1*1fa6dee9SAndroid Build Coastguard Worker// Copyright 2014 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 blueprint
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
23*1fa6dee9SAndroid Build Coastguard Workerfunc ck(err error) {
24*1fa6dee9SAndroid Build Coastguard Worker	if err != nil {
25*1fa6dee9SAndroid Build Coastguard Worker		panic(err)
26*1fa6dee9SAndroid Build Coastguard Worker	}
27*1fa6dee9SAndroid Build Coastguard Worker}
28*1fa6dee9SAndroid Build Coastguard Worker
29*1fa6dee9SAndroid Build Coastguard Workervar ninjaWriterTestCases = []struct {
30*1fa6dee9SAndroid Build Coastguard Worker	input  func(w *ninjaWriter)
31*1fa6dee9SAndroid Build Coastguard Worker	output string
32*1fa6dee9SAndroid Build Coastguard Worker}{
33*1fa6dee9SAndroid Build Coastguard Worker	{
34*1fa6dee9SAndroid Build Coastguard Worker		input: func(w *ninjaWriter) {
35*1fa6dee9SAndroid Build Coastguard Worker			ck(w.Comment("foo"))
36*1fa6dee9SAndroid Build Coastguard Worker		},
37*1fa6dee9SAndroid Build Coastguard Worker		output: "# foo\n",
38*1fa6dee9SAndroid Build Coastguard Worker	},
39*1fa6dee9SAndroid Build Coastguard Worker	{
40*1fa6dee9SAndroid Build Coastguard Worker		input: func(w *ninjaWriter) {
41*1fa6dee9SAndroid Build Coastguard Worker			ck(w.Pool("foo"))
42*1fa6dee9SAndroid Build Coastguard Worker		},
43*1fa6dee9SAndroid Build Coastguard Worker		output: "pool foo\n",
44*1fa6dee9SAndroid Build Coastguard Worker	},
45*1fa6dee9SAndroid Build Coastguard Worker	{
46*1fa6dee9SAndroid Build Coastguard Worker		input: func(w *ninjaWriter) {
47*1fa6dee9SAndroid Build Coastguard Worker			ck(w.Rule("foo"))
48*1fa6dee9SAndroid Build Coastguard Worker		},
49*1fa6dee9SAndroid Build Coastguard Worker		output: "rule foo\n",
50*1fa6dee9SAndroid Build Coastguard Worker	},
51*1fa6dee9SAndroid Build Coastguard Worker	{
52*1fa6dee9SAndroid Build Coastguard Worker		input: func(w *ninjaWriter) {
53*1fa6dee9SAndroid Build Coastguard Worker			ck(w.Build("foo comment", "foo", testNinjaStrings("o3", "o4"),
54*1fa6dee9SAndroid Build Coastguard Worker				testNinjaStrings("io3", "io4"), testNinjaStrings("e3", "e4"),
55*1fa6dee9SAndroid Build Coastguard Worker				testNinjaStrings("i3", "i4"), testNinjaStrings("oo3", "oo4"),
56*1fa6dee9SAndroid Build Coastguard Worker				testNinjaStrings("v3", "v4"), []string{"o1", "o2"},
57*1fa6dee9SAndroid Build Coastguard Worker				[]string{"io1", "io2"}, []string{"e1", "e2"},
58*1fa6dee9SAndroid Build Coastguard Worker				[]string{"i1", "i2"}, []string{"oo1", "oo2"},
59*1fa6dee9SAndroid Build Coastguard Worker				[]string{"v1", "v2"}, nil))
60*1fa6dee9SAndroid Build Coastguard Worker		},
61*1fa6dee9SAndroid Build Coastguard Worker		output: "# foo comment\nbuild o1 o2 o3 o4 | io1 io2 io3 io4: foo e1 e2 e3 e4 | i1 i2 i3 i4 || oo1 oo2 $\n        oo3 oo4 |@ v1 v2 v3 v4\n",
62*1fa6dee9SAndroid Build Coastguard Worker	},
63*1fa6dee9SAndroid Build Coastguard Worker	{
64*1fa6dee9SAndroid Build Coastguard Worker		input: func(w *ninjaWriter) {
65*1fa6dee9SAndroid Build Coastguard Worker			ck(w.Build("foo comment", "foo",
66*1fa6dee9SAndroid Build Coastguard Worker				testNinjaStrings(strings.Repeat("o", lineWidth)),
67*1fa6dee9SAndroid Build Coastguard Worker				nil,
68*1fa6dee9SAndroid Build Coastguard Worker				testNinjaStrings(strings.Repeat("i", lineWidth)),
69*1fa6dee9SAndroid Build Coastguard Worker				nil, nil, nil, nil, nil, nil, nil, nil, nil, nil))
70*1fa6dee9SAndroid Build Coastguard Worker		},
71*1fa6dee9SAndroid Build Coastguard Worker		output: "# foo comment\nbuild $\n        " + strings.Repeat("o", lineWidth) + ": $\n        foo $\n        " + strings.Repeat("i", lineWidth) + "\n",
72*1fa6dee9SAndroid Build Coastguard Worker	},
73*1fa6dee9SAndroid Build Coastguard Worker	{
74*1fa6dee9SAndroid Build Coastguard Worker		input: func(w *ninjaWriter) {
75*1fa6dee9SAndroid Build Coastguard Worker			ck(w.Default(nil, testNinjaStrings("foo"), []string{"bar"}))
76*1fa6dee9SAndroid Build Coastguard Worker		},
77*1fa6dee9SAndroid Build Coastguard Worker		output: "default bar foo\n",
78*1fa6dee9SAndroid Build Coastguard Worker	},
79*1fa6dee9SAndroid Build Coastguard Worker	{
80*1fa6dee9SAndroid Build Coastguard Worker		input: func(w *ninjaWriter) {
81*1fa6dee9SAndroid Build Coastguard Worker			ck(w.Assign("foo", "bar"))
82*1fa6dee9SAndroid Build Coastguard Worker		},
83*1fa6dee9SAndroid Build Coastguard Worker		output: "foo = bar\n",
84*1fa6dee9SAndroid Build Coastguard Worker	},
85*1fa6dee9SAndroid Build Coastguard Worker	{
86*1fa6dee9SAndroid Build Coastguard Worker		input: func(w *ninjaWriter) {
87*1fa6dee9SAndroid Build Coastguard Worker			ck(w.ScopedAssign("foo", "bar"))
88*1fa6dee9SAndroid Build Coastguard Worker		},
89*1fa6dee9SAndroid Build Coastguard Worker		output: "    foo = bar\n",
90*1fa6dee9SAndroid Build Coastguard Worker	},
91*1fa6dee9SAndroid Build Coastguard Worker	{
92*1fa6dee9SAndroid Build Coastguard Worker		input: func(w *ninjaWriter) {
93*1fa6dee9SAndroid Build Coastguard Worker			ck(w.Subninja("build.ninja"))
94*1fa6dee9SAndroid Build Coastguard Worker		},
95*1fa6dee9SAndroid Build Coastguard Worker		output: "subninja build.ninja\n",
96*1fa6dee9SAndroid Build Coastguard Worker	},
97*1fa6dee9SAndroid Build Coastguard Worker	{
98*1fa6dee9SAndroid Build Coastguard Worker		input: func(w *ninjaWriter) {
99*1fa6dee9SAndroid Build Coastguard Worker			ck(w.BlankLine())
100*1fa6dee9SAndroid Build Coastguard Worker		},
101*1fa6dee9SAndroid Build Coastguard Worker		output: "\n",
102*1fa6dee9SAndroid Build Coastguard Worker	},
103*1fa6dee9SAndroid Build Coastguard Worker	{
104*1fa6dee9SAndroid Build Coastguard Worker		input: func(w *ninjaWriter) {
105*1fa6dee9SAndroid Build Coastguard Worker			ck(w.Pool("p"))
106*1fa6dee9SAndroid Build Coastguard Worker			ck(w.ScopedAssign("depth", "3"))
107*1fa6dee9SAndroid Build Coastguard Worker			ck(w.BlankLine())
108*1fa6dee9SAndroid Build Coastguard Worker			ck(w.Comment("here comes a rule"))
109*1fa6dee9SAndroid Build Coastguard Worker			ck(w.Rule("r"))
110*1fa6dee9SAndroid Build Coastguard Worker			ck(w.ScopedAssign("command", "echo out: $out in: $in _arg: $_arg"))
111*1fa6dee9SAndroid Build Coastguard Worker			ck(w.ScopedAssign("pool", "p"))
112*1fa6dee9SAndroid Build Coastguard Worker			ck(w.BlankLine())
113*1fa6dee9SAndroid Build Coastguard Worker			ck(w.Build("r comment", "r", testNinjaStrings("foo.o"),
114*1fa6dee9SAndroid Build Coastguard Worker				nil, testNinjaStrings("foo.in"), nil, nil, nil, nil,
115*1fa6dee9SAndroid Build Coastguard Worker				nil, nil, nil, nil, nil, nil))
116*1fa6dee9SAndroid Build Coastguard Worker			ck(w.ScopedAssign("_arg", "arg value"))
117*1fa6dee9SAndroid Build Coastguard Worker		},
118*1fa6dee9SAndroid Build Coastguard Worker		output: `pool p
119*1fa6dee9SAndroid Build Coastguard Worker    depth = 3
120*1fa6dee9SAndroid Build Coastguard Worker
121*1fa6dee9SAndroid Build Coastguard Worker# here comes a rule
122*1fa6dee9SAndroid Build Coastguard Workerrule r
123*1fa6dee9SAndroid Build Coastguard Worker    command = echo out: $out in: $in _arg: $_arg
124*1fa6dee9SAndroid Build Coastguard Worker    pool = p
125*1fa6dee9SAndroid Build Coastguard Worker
126*1fa6dee9SAndroid Build Coastguard Worker# r comment
127*1fa6dee9SAndroid Build Coastguard Workerbuild foo.o: r foo.in
128*1fa6dee9SAndroid Build Coastguard Worker    _arg = arg value
129*1fa6dee9SAndroid Build Coastguard Worker`,
130*1fa6dee9SAndroid Build Coastguard Worker	},
131*1fa6dee9SAndroid Build Coastguard Worker}
132*1fa6dee9SAndroid Build Coastguard Worker
133*1fa6dee9SAndroid Build Coastguard Workerfunc TestNinjaWriter(t *testing.T) {
134*1fa6dee9SAndroid Build Coastguard Worker	for i, testCase := range ninjaWriterTestCases {
135*1fa6dee9SAndroid Build Coastguard Worker		buf := bytes.NewBuffer(nil)
136*1fa6dee9SAndroid Build Coastguard Worker		w := newNinjaWriter(buf)
137*1fa6dee9SAndroid Build Coastguard Worker		testCase.input(w)
138*1fa6dee9SAndroid Build Coastguard Worker		if buf.String() != testCase.output {
139*1fa6dee9SAndroid Build Coastguard Worker			t.Errorf("incorrect output for test case %d", i)
140*1fa6dee9SAndroid Build Coastguard Worker			t.Errorf("  expected: %q", testCase.output)
141*1fa6dee9SAndroid Build Coastguard Worker			t.Errorf("       got: %q", buf.String())
142*1fa6dee9SAndroid Build Coastguard Worker		}
143*1fa6dee9SAndroid Build Coastguard Worker	}
144*1fa6dee9SAndroid Build Coastguard Worker}
145*1fa6dee9SAndroid Build Coastguard Worker
146*1fa6dee9SAndroid Build Coastguard Workerfunc testNinjaStrings(s ...string) []*ninjaString {
147*1fa6dee9SAndroid Build Coastguard Worker	ret, _ := parseNinjaStrings(nil, s)
148*1fa6dee9SAndroid Build Coastguard Worker	return ret
149*1fa6dee9SAndroid Build Coastguard Worker}
150