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