blob: 077a782b35440bc9ff8fd43d05a5c9b8d9f23739 [file] [log] [blame]
Colin Cross8e0c5112015-01-23 14:15:10 -08001// Copyright 2014 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Cross5ad47f42015-01-08 19:35:10 -080015package parser
16
17import (
18 "bytes"
19 "testing"
20)
21
22var validPrinterTestCases = []struct {
23 input string
24 output string
25}{
26 {
27 input: `
Colin Crosscb7b9ad2015-03-02 15:32:36 -080028foo {}
Colin Cross5ad47f42015-01-08 19:35:10 -080029`,
30 output: `
Colin Crosscb7b9ad2015-03-02 15:32:36 -080031foo {}
Colin Cross5ad47f42015-01-08 19:35:10 -080032`,
33 },
34 {
35 input: `
Logan Chien3deba3d2018-06-25 11:52:48 +080036foo(name= "abc",num= 4,)
Colin Cross5ad47f42015-01-08 19:35:10 -080037`,
38 output: `
Colin Crosscb7b9ad2015-03-02 15:32:36 -080039foo {
40 name: "abc",
Nan Zhangf5865442017-11-01 14:03:28 -070041 num: 4,
Colin Crosscb7b9ad2015-03-02 15:32:36 -080042}
Colin Cross5ad47f42015-01-08 19:35:10 -080043`,
44 },
45 {
46 input: `
Colin Crosscb7b9ad2015-03-02 15:32:36 -080047 foo {
48 stuff: ["asdf", "jkl;", "qwert",
Colin Cross5ad47f42015-01-08 19:35:10 -080049 "uiop", "bnm,"]
Colin Crosscb7b9ad2015-03-02 15:32:36 -080050 }
Colin Cross5ad47f42015-01-08 19:35:10 -080051 `,
52 output: `
Colin Crosscb7b9ad2015-03-02 15:32:36 -080053foo {
54 stuff: [
Colin Cross5ad47f42015-01-08 19:35:10 -080055 "asdf",
56 "bnm,",
57 "jkl;",
58 "qwert",
59 "uiop",
60 ],
Colin Crosscb7b9ad2015-03-02 15:32:36 -080061}
Colin Cross5ad47f42015-01-08 19:35:10 -080062`,
63 },
64 {
65 input: `
Colin Crosse32cc802016-06-07 12:28:16 -070066 var = "asdf"
67 foo {
68 stuff: ["asdf"] + var,
69 }`,
70 output: `
71var = "asdf"
72foo {
73 stuff: ["asdf"] + var,
74}
75`,
76 },
77 {
78 input: `
79 var = "asdf"
80 foo {
81 stuff: [
82 "asdf"
83 ] + var,
84 }`,
85 output: `
86var = "asdf"
87foo {
88 stuff: [
89 "asdf",
90 ] + var,
91}
92`,
93 },
94 {
95 input: `
96 var = "asdf"
97 foo {
98 stuff: ["asdf"] + var + ["qwert"],
99 }`,
100 output: `
101var = "asdf"
102foo {
103 stuff: ["asdf"] + var + ["qwert"],
104}
105`,
106 },
107 {
108 input: `
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800109 foo {
110 stuff: {
Colin Cross5ad47f42015-01-08 19:35:10 -0800111 isGood: true,
Nan Zhangf5865442017-11-01 14:03:28 -0700112 name: "bar",
113 num: 4,
Colin Cross5ad47f42015-01-08 19:35:10 -0800114 }
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800115 }
Colin Cross5ad47f42015-01-08 19:35:10 -0800116 `,
117 output: `
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800118foo {
119 stuff: {
Colin Cross5ad47f42015-01-08 19:35:10 -0800120 isGood: true,
121 name: "bar",
Nan Zhangf5865442017-11-01 14:03:28 -0700122 num: 4,
Colin Cross5ad47f42015-01-08 19:35:10 -0800123 },
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800124}
Colin Cross5ad47f42015-01-08 19:35:10 -0800125`,
126 },
127 {
128 input: `
129// comment1
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800130foo {
Colin Cross5ad47f42015-01-08 19:35:10 -0800131 // comment2
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800132 isGood: true, // comment3
133}
Colin Cross5ad47f42015-01-08 19:35:10 -0800134`,
135 output: `
136// comment1
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800137foo {
Colin Cross5ad47f42015-01-08 19:35:10 -0800138 // comment2
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800139 isGood: true, // comment3
140}
Colin Cross5ad47f42015-01-08 19:35:10 -0800141`,
142 },
143 {
144 input: `
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800145foo {
146 name: "abc",
Nan Zhangf5865442017-11-01 14:03:28 -0700147 num: 4,
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800148}
Colin Cross5ad47f42015-01-08 19:35:10 -0800149
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800150bar {
151 name: "def",
Nan Zhangf5865442017-11-01 14:03:28 -0700152 num: 5,
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800153}
Colin Cross5ad47f42015-01-08 19:35:10 -0800154 `,
155 output: `
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800156foo {
157 name: "abc",
Nan Zhangf5865442017-11-01 14:03:28 -0700158 num: 4,
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800159}
Colin Cross5ad47f42015-01-08 19:35:10 -0800160
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800161bar {
162 name: "def",
Nan Zhangf5865442017-11-01 14:03:28 -0700163 num: 5,
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800164}
Colin Cross5ad47f42015-01-08 19:35:10 -0800165`,
166 },
167 {
168 input: `
Dan Willemsend2c81622018-05-07 16:11:42 -0700169foo {
170 bar: "b" +
171 "a" +
172 "z",
173}
174`,
175 output: `
176foo {
177 bar: "b" +
178 "a" +
179 "z",
180}
181`,
182 },
183 {
184 input: `
Colin Cross5ad47f42015-01-08 19:35:10 -0800185foo = "stuff"
186bar = foo
187baz = foo + bar
Colin Crossb274e6c2015-02-04 10:50:22 -0800188baz += foo
Colin Cross5ad47f42015-01-08 19:35:10 -0800189`,
190 output: `
191foo = "stuff"
192bar = foo
193baz = foo + bar
Colin Crossb274e6c2015-02-04 10:50:22 -0800194baz += foo
Colin Cross5ad47f42015-01-08 19:35:10 -0800195`,
196 },
197 {
198 input: `
Nan Zhangf5865442017-11-01 14:03:28 -0700199foo = 100
200bar = foo
201baz = foo + bar
202baz += foo
203`,
204 output: `
205foo = 100
206bar = foo
207baz = foo + bar
208baz += foo
209`,
210 },
211 {
212 input: `
Dan Willemsend2c81622018-05-07 16:11:42 -0700213foo = "bar " +
214 "" +
215 "baz"
216`,
217 output: `
218foo = "bar " +
219 "" +
220 "baz"
221`,
222 },
223 {
224 input: `
Colin Cross5ad47f42015-01-08 19:35:10 -0800225//test
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800226test /* test */ {
227 srcs: [
Jamie Gennis6cafc2c2015-03-20 22:39:29 -0400228 /*"bootstrap/bootstrap.go",
229 "bootstrap/cleanup.go",*/
230 "bootstrap/command.go",
231 "bootstrap/doc.go", //doc.go
232 "bootstrap/config.go", //config.go
Colin Cross5ad47f42015-01-08 19:35:10 -0800233 ],
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800234 deps: ["libabc"],
235 incs: []
236} //test
Colin Cross5ad47f42015-01-08 19:35:10 -0800237//test
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800238test2 {
239}
Colin Cross5ad47f42015-01-08 19:35:10 -0800240
241
242//test3
243`,
244 output: `
245//test
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800246test /* test */ {
247 srcs: [
Jamie Gennis6cafc2c2015-03-20 22:39:29 -0400248 /*"bootstrap/bootstrap.go",
249 "bootstrap/cleanup.go",*/
250 "bootstrap/command.go",
251 "bootstrap/config.go", //config.go
252 "bootstrap/doc.go", //doc.go
Colin Cross5ad47f42015-01-08 19:35:10 -0800253 ],
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800254 deps: ["libabc"],
255 incs: [],
256} //test
Colin Cross5ad47f42015-01-08 19:35:10 -0800257//test
Colin Cross1e737942016-06-10 17:27:12 -0700258
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800259test2 {
260}
Colin Cross5ad47f42015-01-08 19:35:10 -0800261
262//test3
263`,
264 },
Colin Cross9a103c02015-01-30 16:38:08 -0800265 {
266 input: `
267// test
268module // test
269
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800270 {
Colin Cross9a103c02015-01-30 16:38:08 -0800271 srcs
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800272 : [
Colin Cross9a103c02015-01-30 16:38:08 -0800273 "src1.c",
274 "src2.c",
275 ],
276//test
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800277}
Colin Cross9a103c02015-01-30 16:38:08 -0800278//test2
279`,
280 output: `
281// test
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800282module { // test
Colin Cross9a103c02015-01-30 16:38:08 -0800283
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800284 srcs: [
Colin Cross9a103c02015-01-30 16:38:08 -0800285 "src1.c",
286 "src2.c",
287 ],
288 //test
Colin Crosscb7b9ad2015-03-02 15:32:36 -0800289}
Colin Cross85398a92015-03-19 14:49:38 -0700290
Colin Cross9a103c02015-01-30 16:38:08 -0800291//test2
292`,
293 },
Colin Cross85398a92015-03-19 14:49:38 -0700294 {
295 input: `
296/*test {
297 test: true,
298}*/
299
300test {
301/*test: true,*/
302}
303
304// This
Colin Cross1e737942016-06-10 17:27:12 -0700305/* Is *//* A */ // A
Colin Cross85398a92015-03-19 14:49:38 -0700306// A
307
308// Multiline
309// Comment
310
311test {}
312
313// This
314/* Is */
315// A
316// Trailing
317
318// Multiline
319// Comment
320`,
321 output: `
322/*test {
323 test: true,
324}*/
325
326test {
327 /*test: true,*/
328}
329
330// This
Colin Cross1e737942016-06-10 17:27:12 -0700331/* Is */ /* A */ // A
Colin Cross85398a92015-03-19 14:49:38 -0700332// A
333
334// Multiline
335// Comment
336
337test {}
338
339// This
340/* Is */
341// A
342// Trailing
343
344// Multiline
345// Comment
346`,
347 },
Colin Cross6b6735d2016-07-12 16:03:08 -0700348 {
349 input: `
350test // test
351
352// test
353{
354}
355`,
356 output: `
357test { // test
358
359// test
360
361}
362`,
363 },
Sasha Smundak29fdcad2020-02-11 22:39:47 -0800364 {
365 input: `
366// test
367stuff {
368 namespace: "google",
369 string_vars: [
370 {
371 var: "one",
372 values: [ "one_a", "one_b",],
373 },
374 {
375 var: "two",
376 values: [ "two_a", "two_b", ],
377 },
378 ],
379}`,
380 output: `
381// test
382stuff {
383 namespace: "google",
384 string_vars: [
385 {
386 var: "one",
387 values: [
388 "one_a",
389 "one_b",
390 ],
391 },
392 {
393 var: "two",
394 values: [
395 "two_a",
396 "two_b",
397 ],
398 },
399 ],
400}
401`,
402 },
403 {
404 input: `
405// test
406stuff {
407 namespace: "google",
408 list_of_lists: [
409 [ "a", "b" ],
410 [ "c", "d" ],
411 ],
412}
413`,
414 output: `
415// test
416stuff {
417 namespace: "google",
418 list_of_lists: [
419 [
420 "a",
421 "b",
422 ],
423 [
424 "c",
425 "d",
426 ],
427 ],
428}
429`,
430 },
Colin Cross5ad47f42015-01-08 19:35:10 -0800431}
432
433func TestPrinter(t *testing.T) {
434 for _, testCase := range validPrinterTestCases {
435 in := testCase.input[1:]
436 expected := testCase.output[1:]
437
438 r := bytes.NewBufferString(in)
439 file, errs := Parse("", r, NewScope(nil))
440 if len(errs) != 0 {
441 t.Errorf("test case: %s", in)
442 t.Errorf("unexpected errors:")
443 for _, err := range errs {
444 t.Errorf(" %s", err)
445 }
446 t.FailNow()
447 }
448
449 SortLists(file)
450
451 got, err := Print(file)
452 if err != nil {
453 t.Errorf("test case: %s", in)
454 t.Errorf("unexpected error: %s", err)
455 t.FailNow()
456 }
457
458 if string(got) != expected {
459 t.Errorf("test case: %s", in)
460 t.Errorf(" expected: %s", expected)
461 t.Errorf(" got: %s", string(got))
462 }
463 }
464}