// Copyright 2014 Google Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package parser import ( "bytes" "testing" ) var validPrinterTestCases = []struct { input string output string }{ { input: ` foo {} `, output: ` foo {} `, }, { input: ` foo(name= "abc",num= 4,) `, output: ` foo { name: "abc", num: 4, } `, }, { input: ` foo { stuff: ["asdf", "jkl;", "qwert", "uiop", "bnm,"] } `, output: ` foo { stuff: [ "asdf", "bnm,", "jkl;", "qwert", "uiop", ], } `, }, { input: ` var = "asdf" foo { stuff: ["asdf"] + var, }`, output: ` var = "asdf" foo { stuff: ["asdf"] + var, } `, }, { input: ` var = "asdf" foo { stuff: [ "asdf" ] + var, }`, output: ` var = "asdf" foo { stuff: [ "asdf", ] + var, } `, }, { input: ` var = "asdf" foo { stuff: ["asdf"] + var + ["qwert"], }`, output: ` var = "asdf" foo { stuff: ["asdf"] + var + ["qwert"], } `, }, { input: ` foo { stuff: { isGood: true, name: "bar", num: 4, } } `, output: ` foo { stuff: { isGood: true, name: "bar", num: 4, }, } `, }, { input: ` // comment1 foo { // comment2 isGood: true, // comment3 } `, output: ` // comment1 foo { // comment2 isGood: true, // comment3 } `, }, { input: ` foo { name: "abc", num: 4, } bar { name: "def", num: 5, } `, output: ` foo { name: "abc", num: 4, } bar { name: "def", num: 5, } `, }, { input: ` foo { bar: "b" + "a" + "z", } `, output: ` foo { bar: "b" + "a" + "z", } `, }, { input: ` foo = "stuff" bar = foo baz = foo + bar baz += foo `, output: ` foo = "stuff" bar = foo baz = foo + bar baz += foo `, }, { input: ` foo = 100 bar = foo baz = foo + bar baz += foo `, output: ` foo = 100 bar = foo baz = foo + bar baz += foo `, }, { input: ` foo = "bar " + "" + "baz" `, output: ` foo = "bar " + "" + "baz" `, }, { input: ` //test test /* test */ { srcs: [ /*"bootstrap/bootstrap.go", "bootstrap/cleanup.go",*/ "bootstrap/command.go", "bootstrap/doc.go", //doc.go "bootstrap/config.go", //config.go ], deps: ["libabc"], incs: [] } //test //test test2 { } //test3 `, output: ` //test test /* test */ { srcs: [ /*"bootstrap/bootstrap.go", "bootstrap/cleanup.go",*/ "bootstrap/command.go", "bootstrap/config.go", //config.go "bootstrap/doc.go", //doc.go ], deps: ["libabc"], incs: [], } //test //test test2 { } //test3 `, }, { input: ` // test module // test { srcs : [ "src1.c", "src2.c", ], //test } //test2 `, output: ` // test module { // test srcs: [ "src1.c", "src2.c", ], //test } //test2 `, }, { input: ` /*test { test: true, }*/ test { /*test: true,*/ } // This /* Is *//* A */ // A // A // Multiline // Comment test {} // This /* Is */ // A // Trailing // Multiline // Comment `, output: ` /*test { test: true, }*/ test { /*test: true,*/ } // This /* Is */ /* A */ // A // A // Multiline // Comment test {} // This /* Is */ // A // Trailing // Multiline // Comment `, }, { input: ` test // test // test { } `, output: ` test { // test // test } `, }, { input: ` // test stuff { namespace: "google", string_vars: [ { var: "one", values: [ "one_a", "one_b",], }, { var: "two", values: [ "two_a", "two_b", ], }, ], }`, output: ` // test stuff { namespace: "google", string_vars: [ { var: "one", values: [ "one_a", "one_b", ], }, { var: "two", values: [ "two_a", "two_b", ], }, ], } `, }, { input: ` // test stuff { namespace: "google", list_of_lists: [ [ "a", "b" ], [ "c", "d" ], ], } `, output: ` // test stuff { namespace: "google", list_of_lists: [ [ "a", "b", ], [ "c", "d", ], ], } `, }, { input: ` // test stuff { namespace: "google", list_of_structs: [{ key1: "a", key2: "b" }], } `, output: ` // test stuff { namespace: "google", list_of_structs: [ { key1: "a", key2: "b", }, ], } `, }, { input: ` // test foo { stuff: [ "a", // great comment "b", ], } `, output: ` // test foo { stuff: [ "a", // great comment "b", ], } `, }, { input: ` // test foo { stuff: [ "a", // b comment "b", ], } `, output: ` // test foo { stuff: [ "a", // b comment "b", ], } `, }, { input: ` // test foo { stuff: [ "a", // a comment // b comment "b", ], } `, output: ` // test foo { stuff: [ "a", // a comment // b comment "b", ], } `, }, { input: ` // test foo { stuff: [ "a", // b comment // on multiline "b", ], } `, output: ` // test foo { stuff: [ "a", // b comment // on multiline "b", ], } `, }, { // Line comment are treat as groups separator input: ` // test foo { stuff: [ "b", // a comment "a", ], } `, output: ` // test foo { stuff: [ "b", // a comment "a", ], } `, }, } func TestPrinter(t *testing.T) { for _, testCase := range validPrinterTestCases { in := testCase.input[1:] expected := testCase.output[1:] r := bytes.NewBufferString(in) file, errs := Parse("", r, NewScope(nil)) if len(errs) != 0 { t.Errorf("test case: %s", in) t.Errorf("unexpected errors:") for _, err := range errs { t.Errorf(" %s", err) } t.FailNow() } SortLists(file) got, err := Print(file) if err != nil { t.Errorf("test case: %s", in) t.Errorf("unexpected error: %s", err) t.FailNow() } if string(got) != expected { t.Errorf("test case: %s", in) t.Errorf(" expected: %s", expected) t.Errorf(" got: %s", string(got)) } } }