// 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 blueprint import ( "reflect" "testing" ) var ninjaParseTestCases = []struct { input string vars []string strs []string err string }{ { input: "abc def $ghi jkl", vars: []string{"ghi"}, strs: []string{"abc def ", " jkl"}, }, { input: "abc def $ghi$jkl", vars: []string{"ghi", "jkl"}, strs: []string{"abc def ", "", ""}, }, { input: "foo $012_-345xyz_! bar", vars: []string{"012_-345xyz_"}, strs: []string{"foo ", "! bar"}, }, { input: "foo ${012_-345xyz_} bar", vars: []string{"012_-345xyz_"}, strs: []string{"foo ", " bar"}, }, { input: "foo ${012_-345xyz_} bar", vars: []string{"012_-345xyz_"}, strs: []string{"foo ", " bar"}, }, { input: "foo $$ bar", vars: nil, strs: []string{"foo $$ bar"}, }, { input: "$foo${bar}", vars: []string{"foo", "bar"}, strs: []string{"", "", ""}, }, { input: "$foo$$", vars: []string{"foo"}, strs: []string{"", "$$"}, }, { input: "foo bar", vars: nil, strs: []string{"foo bar"}, }, { input: " foo ", vars: nil, strs: []string{"$ foo "}, }, { input: "foo $ bar", err: "invalid character after '$' at byte offset 5", }, { input: "foo $", err: "unexpected end of string after '$'", }, { input: "foo ${} bar", err: "empty variable name at byte offset 6", }, { input: "foo ${abc!} bar", err: "invalid character in variable name at byte offset 9", }, { input: "foo ${abc", err: "unexpected end of string in variable name", }, } func TestParseNinjaString(t *testing.T) { for _, testCase := range ninjaParseTestCases { scope := newLocalScope(nil, "namespace") expectedVars := []Variable{} for _, varName := range testCase.vars { v, err := scope.LookupVariable(varName) if err != nil { v, err = scope.AddLocalVariable(varName, "") if err != nil { t.Fatalf("error creating scope: %s", err) } } expectedVars = append(expectedVars, v) } output, err := parseNinjaString(scope, testCase.input) if err == nil { if !reflect.DeepEqual(output.variables, expectedVars) { t.Errorf("incorrect variable list:") t.Errorf(" input: %q", testCase.input) t.Errorf(" expected: %#v", expectedVars) t.Errorf(" got: %#v", output.variables) } if !reflect.DeepEqual(output.strings, testCase.strs) { t.Errorf("incorrect string list:") t.Errorf(" input: %q", testCase.input) t.Errorf(" expected: %#v", testCase.strs) t.Errorf(" got: %#v", output.strings) } } var errStr string if err != nil { errStr = err.Error() } if err != nil && err.Error() != testCase.err { t.Errorf("unexpected error:") t.Errorf(" input: %q", testCase.input) t.Errorf(" expected: %q", testCase.err) t.Errorf(" got: %q", errStr) } } } func TestParseNinjaStringWithImportedVar(t *testing.T) { ImpVar := &staticVariable{name_: "ImpVar"} impScope := newScope(nil) impScope.AddVariable(ImpVar) scope := newScope(nil) scope.AddImport("impPkg", impScope) input := "abc def ${impPkg.ImpVar} ghi" output, err := parseNinjaString(scope, input) if err != nil { t.Fatalf("unexpected error: %s", err) } expect := []Variable{ImpVar} if !reflect.DeepEqual(output.variables, expect) { t.Errorf("incorrect output:") t.Errorf(" input: %q", input) t.Errorf(" expected: %#v", expect) t.Errorf(" got: %#v", output) } }