Build self-consistent graphs for dupe edges with multiple outputs.
[platform/upstream/ninja.git] / src / manifest_parser_test.cc
1 // Copyright 2011 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
15 #include "manifest_parser.h"
16
17 #include <map>
18 #include <vector>
19
20 #include "graph.h"
21 #include "state.h"
22 #include "test.h"
23
24 struct ParserTest : public testing::Test,
25                     public ManifestParser::FileReader {
26   void AssertParse(const char* input) {
27     ManifestParser parser(&state, this);
28     string err;
29     EXPECT_TRUE(parser.ParseTest(input, &err));
30     ASSERT_EQ("", err);
31     VerifyGraph(state);
32   }
33
34   virtual bool ReadFile(const string& path, string* content, string* err) {
35     files_read_.push_back(path);
36     map<string, string>::iterator i = files_.find(path);
37     if (i == files_.end()) {
38       *err = "No such file or directory";  // Match strerror() for ENOENT.
39       return false;
40     }
41     *content = i->second;
42     return true;
43   }
44
45   State state;
46   map<string, string> files_;
47   vector<string> files_read_;
48 };
49
50 TEST_F(ParserTest, Empty) {
51   ASSERT_NO_FATAL_FAILURE(AssertParse(""));
52 }
53
54 TEST_F(ParserTest, Rules) {
55   ASSERT_NO_FATAL_FAILURE(AssertParse(
56 "rule cat\n"
57 "  command = cat $in > $out\n"
58 "\n"
59 "rule date\n"
60 "  command = date > $out\n"
61 "\n"
62 "build result: cat in_1.cc in-2.O\n"));
63
64   ASSERT_EQ(3u, state.bindings_.GetRules().size());
65   const Rule* rule = state.bindings_.GetRules().begin()->second;
66   EXPECT_EQ("cat", rule->name());
67   EXPECT_EQ("[cat ][$in][ > ][$out]",
68             rule->GetBinding("command")->Serialize());
69 }
70
71 TEST_F(ParserTest, RuleAttributes) {
72   // Check that all of the allowed rule attributes are parsed ok.
73   ASSERT_NO_FATAL_FAILURE(AssertParse(
74 "rule cat\n"
75 "  command = a\n"
76 "  depfile = a\n"
77 "  deps = a\n"
78 "  description = a\n"
79 "  generator = a\n"
80 "  restat = a\n"
81 "  rspfile = a\n"
82 "  rspfile_content = a\n"
83 ));
84 }
85
86 TEST_F(ParserTest, IgnoreIndentedComments) {
87   ASSERT_NO_FATAL_FAILURE(AssertParse(
88 "  #indented comment\n"
89 "rule cat\n"
90 "  command = cat $in > $out\n"
91 "  #generator = 1\n"
92 "  restat = 1 # comment\n"
93 "  #comment\n"
94 "build result: cat in_1.cc in-2.O\n"
95 "  #comment\n"));
96
97   ASSERT_EQ(2u, state.bindings_.GetRules().size());
98   const Rule* rule = state.bindings_.GetRules().begin()->second;
99   EXPECT_EQ("cat", rule->name());
100   Edge* edge = state.GetNode("result", 0)->in_edge();
101   EXPECT_TRUE(edge->GetBindingBool("restat"));
102   EXPECT_FALSE(edge->GetBindingBool("generator"));
103 }
104
105 TEST_F(ParserTest, IgnoreIndentedBlankLines) {
106   // the indented blanks used to cause parse errors
107   ASSERT_NO_FATAL_FAILURE(AssertParse(
108 "  \n"
109 "rule cat\n"
110 "  command = cat $in > $out\n"
111 "  \n"
112 "build result: cat in_1.cc in-2.O\n"
113 "  \n"
114 "variable=1\n"));
115
116   // the variable must be in the top level environment
117   EXPECT_EQ("1", state.bindings_.LookupVariable("variable"));
118 }
119
120 TEST_F(ParserTest, ResponseFiles) {
121   ASSERT_NO_FATAL_FAILURE(AssertParse(
122 "rule cat_rsp\n"
123 "  command = cat $rspfile > $out\n"
124 "  rspfile = $rspfile\n"
125 "  rspfile_content = $in\n"
126 "\n"
127 "build out: cat_rsp in\n"
128 "  rspfile=out.rsp\n"));
129
130   ASSERT_EQ(2u, state.bindings_.GetRules().size());
131   const Rule* rule = state.bindings_.GetRules().begin()->second;
132   EXPECT_EQ("cat_rsp", rule->name());
133   EXPECT_EQ("[cat ][$rspfile][ > ][$out]",
134             rule->GetBinding("command")->Serialize());
135   EXPECT_EQ("[$rspfile]", rule->GetBinding("rspfile")->Serialize());
136   EXPECT_EQ("[$in]", rule->GetBinding("rspfile_content")->Serialize());
137 }
138
139 TEST_F(ParserTest, InNewline) {
140   ASSERT_NO_FATAL_FAILURE(AssertParse(
141 "rule cat_rsp\n"
142 "  command = cat $in_newline > $out\n"
143 "\n"
144 "build out: cat_rsp in in2\n"
145 "  rspfile=out.rsp\n"));
146
147   ASSERT_EQ(2u, state.bindings_.GetRules().size());
148   const Rule* rule = state.bindings_.GetRules().begin()->second;
149   EXPECT_EQ("cat_rsp", rule->name());
150   EXPECT_EQ("[cat ][$in_newline][ > ][$out]",
151             rule->GetBinding("command")->Serialize());
152
153   Edge* edge = state.edges_[0];
154   EXPECT_EQ("cat in\nin2 > out", edge->EvaluateCommand());
155 }
156
157 TEST_F(ParserTest, Variables) {
158   ASSERT_NO_FATAL_FAILURE(AssertParse(
159 "l = one-letter-test\n"
160 "rule link\n"
161 "  command = ld $l $extra $with_under -o $out $in\n"
162 "\n"
163 "extra = -pthread\n"
164 "with_under = -under\n"
165 "build a: link b c\n"
166 "nested1 = 1\n"
167 "nested2 = $nested1/2\n"
168 "build supernested: link x\n"
169 "  extra = $nested2/3\n"));
170
171   ASSERT_EQ(2u, state.edges_.size());
172   Edge* edge = state.edges_[0];
173   EXPECT_EQ("ld one-letter-test -pthread -under -o a b c",
174             edge->EvaluateCommand());
175   EXPECT_EQ("1/2", state.bindings_.LookupVariable("nested2"));
176
177   edge = state.edges_[1];
178   EXPECT_EQ("ld one-letter-test 1/2/3 -under -o supernested x",
179             edge->EvaluateCommand());
180 }
181
182 TEST_F(ParserTest, VariableScope) {
183   ASSERT_NO_FATAL_FAILURE(AssertParse(
184 "foo = bar\n"
185 "rule cmd\n"
186 "  command = cmd $foo $in $out\n"
187 "\n"
188 "build inner: cmd a\n"
189 "  foo = baz\n"
190 "build outer: cmd b\n"
191 "\n"  // Extra newline after build line tickles a regression.
192 ));
193
194   ASSERT_EQ(2u, state.edges_.size());
195   EXPECT_EQ("cmd baz a inner", state.edges_[0]->EvaluateCommand());
196   EXPECT_EQ("cmd bar b outer", state.edges_[1]->EvaluateCommand());
197 }
198
199 TEST_F(ParserTest, Continuation) {
200   ASSERT_NO_FATAL_FAILURE(AssertParse(
201 "rule link\n"
202 "  command = foo bar $\n"
203 "    baz\n"
204 "\n"
205 "build a: link c $\n"
206 " d e f\n"));
207
208   ASSERT_EQ(2u, state.bindings_.GetRules().size());
209   const Rule* rule = state.bindings_.GetRules().begin()->second;
210   EXPECT_EQ("link", rule->name());
211   EXPECT_EQ("[foo bar baz]", rule->GetBinding("command")->Serialize());
212 }
213
214 TEST_F(ParserTest, Backslash) {
215   ASSERT_NO_FATAL_FAILURE(AssertParse(
216 "foo = bar\\baz\n"
217 "foo2 = bar\\ baz\n"
218 ));
219   EXPECT_EQ("bar\\baz", state.bindings_.LookupVariable("foo"));
220   EXPECT_EQ("bar\\ baz", state.bindings_.LookupVariable("foo2"));
221 }
222
223 TEST_F(ParserTest, Comment) {
224   ASSERT_NO_FATAL_FAILURE(AssertParse(
225 "# this is a comment\n"
226 "foo = not # a comment\n"));
227   EXPECT_EQ("not # a comment", state.bindings_.LookupVariable("foo"));
228 }
229
230 TEST_F(ParserTest, Dollars) {
231   ASSERT_NO_FATAL_FAILURE(AssertParse(
232 "rule foo\n"
233 "  command = ${out}bar$$baz$$$\n"
234 "blah\n"
235 "x = $$dollar\n"
236 "build $x: foo y\n"
237 ));
238   EXPECT_EQ("$dollar", state.bindings_.LookupVariable("x"));
239 #ifdef _WIN32
240   EXPECT_EQ("$dollarbar$baz$blah", state.edges_[0]->EvaluateCommand());
241 #else
242   EXPECT_EQ("'$dollar'bar$baz$blah", state.edges_[0]->EvaluateCommand());
243 #endif
244 }
245
246 TEST_F(ParserTest, EscapeSpaces) {
247   ASSERT_NO_FATAL_FAILURE(AssertParse(
248 "rule spaces\n"
249 "  command = something\n"
250 "build foo$ bar: spaces $$one two$$$ three\n"
251 ));
252   EXPECT_TRUE(state.LookupNode("foo bar"));
253   EXPECT_EQ(state.edges_[0]->outputs_[0]->path(), "foo bar");
254   EXPECT_EQ(state.edges_[0]->inputs_[0]->path(), "$one");
255   EXPECT_EQ(state.edges_[0]->inputs_[1]->path(), "two$ three");
256   EXPECT_EQ(state.edges_[0]->EvaluateCommand(), "something");
257 }
258
259 TEST_F(ParserTest, CanonicalizeFile) {
260   ASSERT_NO_FATAL_FAILURE(AssertParse(
261 "rule cat\n"
262 "  command = cat $in > $out\n"
263 "build out: cat in/1 in//2\n"
264 "build in/1: cat\n"
265 "build in/2: cat\n"));
266
267   EXPECT_TRUE(state.LookupNode("in/1"));
268   EXPECT_TRUE(state.LookupNode("in/2"));
269   EXPECT_FALSE(state.LookupNode("in//1"));
270   EXPECT_FALSE(state.LookupNode("in//2"));
271 }
272
273 #ifdef _WIN32
274 TEST_F(ParserTest, CanonicalizeFileBackslashes) {
275   ASSERT_NO_FATAL_FAILURE(AssertParse(
276 "rule cat\n"
277 "  command = cat $in > $out\n"
278 "build out: cat in\\1 in\\\\2\n"
279 "build in\\1: cat\n"
280 "build in\\2: cat\n"));
281
282   Node* node = state.LookupNode("in/1");;
283   EXPECT_TRUE(node);
284   EXPECT_EQ(1, node->slash_bits());
285   node = state.LookupNode("in/2");
286   EXPECT_TRUE(node);
287   EXPECT_EQ(1, node->slash_bits());
288   EXPECT_FALSE(state.LookupNode("in//1"));
289   EXPECT_FALSE(state.LookupNode("in//2"));
290 }
291 #endif
292
293 TEST_F(ParserTest, PathVariables) {
294   ASSERT_NO_FATAL_FAILURE(AssertParse(
295 "rule cat\n"
296 "  command = cat $in > $out\n"
297 "dir = out\n"
298 "build $dir/exe: cat src\n"));
299
300   EXPECT_FALSE(state.LookupNode("$dir/exe"));
301   EXPECT_TRUE(state.LookupNode("out/exe"));
302 }
303
304 TEST_F(ParserTest, CanonicalizePaths) {
305   ASSERT_NO_FATAL_FAILURE(AssertParse(
306 "rule cat\n"
307 "  command = cat $in > $out\n"
308 "build ./out.o: cat ./bar/baz/../foo.cc\n"));
309
310   EXPECT_FALSE(state.LookupNode("./out.o"));
311   EXPECT_TRUE(state.LookupNode("out.o"));
312   EXPECT_FALSE(state.LookupNode("./bar/baz/../foo.cc"));
313   EXPECT_TRUE(state.LookupNode("bar/foo.cc"));
314 }
315
316 #ifdef _WIN32
317 TEST_F(ParserTest, CanonicalizePathsBackslashes) {
318   ASSERT_NO_FATAL_FAILURE(AssertParse(
319 "rule cat\n"
320 "  command = cat $in > $out\n"
321 "build ./out.o: cat ./bar/baz/../foo.cc\n"
322 "build .\\out2.o: cat .\\bar/baz\\..\\foo.cc\n"
323 "build .\\out3.o: cat .\\bar\\baz\\..\\foo3.cc\n"
324 ));
325
326   EXPECT_FALSE(state.LookupNode("./out.o"));
327   EXPECT_FALSE(state.LookupNode(".\\out2.o"));
328   EXPECT_FALSE(state.LookupNode(".\\out3.o"));
329   EXPECT_TRUE(state.LookupNode("out.o"));
330   EXPECT_TRUE(state.LookupNode("out2.o"));
331   EXPECT_TRUE(state.LookupNode("out3.o"));
332   EXPECT_FALSE(state.LookupNode("./bar/baz/../foo.cc"));
333   EXPECT_FALSE(state.LookupNode(".\\bar/baz\\..\\foo.cc"));
334   EXPECT_FALSE(state.LookupNode(".\\bar/baz\\..\\foo3.cc"));
335   Node* node = state.LookupNode("bar/foo.cc");
336   EXPECT_TRUE(node);
337   EXPECT_EQ(0, node->slash_bits());
338   node = state.LookupNode("bar/foo3.cc");
339   EXPECT_TRUE(node);
340   EXPECT_EQ(1, node->slash_bits());
341 }
342 #endif
343
344 TEST_F(ParserTest, DuplicateEdgeWithMultipleOutputs) {
345   ASSERT_NO_FATAL_FAILURE(AssertParse(
346 "rule cat\n"
347 "  command = cat $in > $out\n"
348 "build out1 out2: cat in1\n"
349 "build out1: cat in2\n"
350 "build final: cat out1\n"
351 ));
352   // AssertParse() checks that the generated build graph is self-consistent.
353   // That's all the checking that this test needs.
354 }
355
356 TEST_F(ParserTest, ReservedWords) {
357   ASSERT_NO_FATAL_FAILURE(AssertParse(
358 "rule build\n"
359 "  command = rule run $out\n"
360 "build subninja: build include default foo.cc\n"
361 "default subninja\n"));
362 }
363
364 TEST_F(ParserTest, Errors) {
365   {
366     State state;
367     ManifestParser parser(&state, NULL);
368     string err;
369     EXPECT_FALSE(parser.ParseTest(string("subn", 4), &err));
370     EXPECT_EQ("input:1: expected '=', got eof\n"
371               "subn\n"
372               "    ^ near here"
373               , err);
374   }
375
376   {
377     State state;
378     ManifestParser parser(&state, NULL);
379     string err;
380     EXPECT_FALSE(parser.ParseTest("foobar", &err));
381     EXPECT_EQ("input:1: expected '=', got eof\n"
382               "foobar\n"
383               "      ^ near here"
384               , err);
385   }
386
387   {
388     State state;
389     ManifestParser parser(&state, NULL);
390     string err;
391     EXPECT_FALSE(parser.ParseTest("x 3", &err));
392     EXPECT_EQ("input:1: expected '=', got identifier\n"
393               "x 3\n"
394               "  ^ near here"
395               , err);
396   }
397
398   {
399     State state;
400     ManifestParser parser(&state, NULL);
401     string err;
402     EXPECT_FALSE(parser.ParseTest("x = 3", &err));
403     EXPECT_EQ("input:1: unexpected EOF\n"
404               "x = 3\n"
405               "     ^ near here"
406               , err);
407   }
408
409   {
410     State state;
411     ManifestParser parser(&state, NULL);
412     string err;
413     EXPECT_FALSE(parser.ParseTest("x = 3\ny 2", &err));
414     EXPECT_EQ("input:2: expected '=', got identifier\n"
415               "y 2\n"
416               "  ^ near here"
417               , err);
418   }
419
420   {
421     State state;
422     ManifestParser parser(&state, NULL);
423     string err;
424     EXPECT_FALSE(parser.ParseTest("x = $", &err));
425     EXPECT_EQ("input:1: bad $-escape (literal $ must be written as $$)\n"
426               "x = $\n"
427               "    ^ near here"
428               , err);
429   }
430
431   {
432     State state;
433     ManifestParser parser(&state, NULL);
434     string err;
435     EXPECT_FALSE(parser.ParseTest("x = $\n $[\n", &err));
436     EXPECT_EQ("input:2: bad $-escape (literal $ must be written as $$)\n"
437               " $[\n"
438               " ^ near here"
439               , err);
440   }
441
442   {
443     State state;
444     ManifestParser parser(&state, NULL);
445     string err;
446     EXPECT_FALSE(parser.ParseTest("x = a$\n b$\n $\n", &err));
447     EXPECT_EQ("input:4: unexpected EOF\n"
448               , err);
449   }
450
451   {
452     State state;
453     ManifestParser parser(&state, NULL);
454     string err;
455     EXPECT_FALSE(parser.ParseTest("build\n", &err));
456     EXPECT_EQ("input:1: expected path\n"
457               "build\n"
458               "     ^ near here"
459               , err);
460   }
461
462   {
463     State state;
464     ManifestParser parser(&state, NULL);
465     string err;
466     EXPECT_FALSE(parser.ParseTest("build x: y z\n", &err));
467     EXPECT_EQ("input:1: unknown build rule 'y'\n"
468               "build x: y z\n"
469               "       ^ near here"
470               , err);
471   }
472
473   {
474     State state;
475     ManifestParser parser(&state, NULL);
476     string err;
477     EXPECT_FALSE(parser.ParseTest("build x:: y z\n", &err));
478     EXPECT_EQ("input:1: expected build command name\n"
479               "build x:: y z\n"
480               "       ^ near here"
481               , err);
482   }
483
484   {
485     State state;
486     ManifestParser parser(&state, NULL);
487     string err;
488     EXPECT_FALSE(parser.ParseTest("rule cat\n  command = cat ok\n"
489                                   "build x: cat $\n :\n",
490                                   &err));
491     EXPECT_EQ("input:4: expected newline, got ':'\n"
492               " :\n"
493               " ^ near here"
494               , err);
495   }
496
497   {
498     State state;
499     ManifestParser parser(&state, NULL);
500     string err;
501     EXPECT_FALSE(parser.ParseTest("rule cat\n",
502                                   &err));
503     EXPECT_EQ("input:2: expected 'command =' line\n", err);
504   }
505
506   {
507     State state;
508     ManifestParser parser(&state, NULL);
509     string err;
510     EXPECT_FALSE(parser.ParseTest("rule cat\n"
511                                   "  command = echo\n"
512                                   "rule cat\n"
513                                   "  command = echo\n", &err));
514     EXPECT_EQ("input:3: duplicate rule 'cat'\n"
515               "rule cat\n"
516               "        ^ near here"
517               , err);
518   }
519
520   {
521     State state;
522     ManifestParser parser(&state, NULL);
523     string err;
524     EXPECT_FALSE(parser.ParseTest("rule cat\n"
525                                   "  command = echo\n"
526                                   "  rspfile = cat.rsp\n", &err));
527     EXPECT_EQ(
528         "input:4: rspfile and rspfile_content need to be both specified\n",
529         err);
530   }
531
532   {
533     State state;
534     ManifestParser parser(&state, NULL);
535     string err;
536     EXPECT_FALSE(parser.ParseTest("rule cat\n"
537                                   "  command = ${fafsd\n"
538                                   "foo = bar\n",
539                                   &err));
540     EXPECT_EQ("input:2: bad $-escape (literal $ must be written as $$)\n"
541               "  command = ${fafsd\n"
542               "            ^ near here"
543               , err);
544   }
545
546
547   {
548     State state;
549     ManifestParser parser(&state, NULL);
550     string err;
551     EXPECT_FALSE(parser.ParseTest("rule cat\n"
552                                   "  command = cat\n"
553                                   "build $.: cat foo\n",
554                                   &err));
555     EXPECT_EQ("input:3: bad $-escape (literal $ must be written as $$)\n"
556               "build $.: cat foo\n"
557               "      ^ near here"
558               , err);
559   }
560
561
562   {
563     State state;
564     ManifestParser parser(&state, NULL);
565     string err;
566     EXPECT_FALSE(parser.ParseTest("rule cat\n"
567                                   "  command = cat\n"
568                                   "build $: cat foo\n",
569                                   &err));
570     EXPECT_EQ("input:3: expected ':', got newline ($ also escapes ':')\n"
571               "build $: cat foo\n"
572               "                ^ near here"
573               , err);
574   }
575
576   {
577     State state;
578     ManifestParser parser(&state, NULL);
579     string err;
580     EXPECT_FALSE(parser.ParseTest("rule %foo\n",
581                                   &err));
582     EXPECT_EQ("input:1: expected rule name\n", err);
583   }
584
585   {
586     State state;
587     ManifestParser parser(&state, NULL);
588     string err;
589     EXPECT_FALSE(parser.ParseTest("rule cc\n"
590                                   "  command = foo\n"
591                                   "  othervar = bar\n",
592                                   &err));
593     EXPECT_EQ("input:3: unexpected variable 'othervar'\n"
594               "  othervar = bar\n"
595               "                ^ near here"
596               , err);
597   }
598
599   {
600     State state;
601     ManifestParser parser(&state, NULL);
602     string err;
603     EXPECT_FALSE(parser.ParseTest("rule cc\n  command = foo\n"
604                                   "build $.: cc bar.cc\n",
605                                   &err));
606     EXPECT_EQ("input:3: bad $-escape (literal $ must be written as $$)\n"
607               "build $.: cc bar.cc\n"
608               "      ^ near here"
609               , err);
610   }
611
612   {
613     State state;
614     ManifestParser parser(&state, NULL);
615     string err;
616     EXPECT_FALSE(parser.ParseTest("rule cc\n  command = foo\n  && bar",
617                                   &err));
618     EXPECT_EQ("input:3: expected variable name\n", err);
619   }
620
621   {
622     State state;
623     ManifestParser parser(&state, NULL);
624     string err;
625     EXPECT_FALSE(parser.ParseTest("rule cc\n  command = foo\n"
626                                   "build $: cc bar.cc\n",
627                                   &err));
628     EXPECT_EQ("input:3: expected ':', got newline ($ also escapes ':')\n"
629               "build $: cc bar.cc\n"
630               "                  ^ near here"
631               , err);
632   }
633
634   {
635     State state;
636     ManifestParser parser(&state, NULL);
637     string err;
638     EXPECT_FALSE(parser.ParseTest("default\n",
639                                   &err));
640     EXPECT_EQ("input:1: expected target name\n"
641               "default\n"
642               "       ^ near here"
643               , err);
644   }
645
646   {
647     State state;
648     ManifestParser parser(&state, NULL);
649     string err;
650     EXPECT_FALSE(parser.ParseTest("default nonexistent\n",
651                                   &err));
652     EXPECT_EQ("input:1: unknown target 'nonexistent'\n"
653               "default nonexistent\n"
654               "                   ^ near here"
655               , err);
656   }
657
658   {
659     State state;
660     ManifestParser parser(&state, NULL);
661     string err;
662     EXPECT_FALSE(parser.ParseTest("rule r\n  command = r\n"
663                                   "build b: r\n"
664                                   "default b:\n",
665                                   &err));
666     EXPECT_EQ("input:4: expected newline, got ':'\n"
667               "default b:\n"
668               "         ^ near here"
669               , err);
670   }
671
672   {
673     State state;
674     ManifestParser parser(&state, NULL);
675     string err;
676     EXPECT_FALSE(parser.ParseTest("default $a\n", &err));
677     EXPECT_EQ("input:1: empty path\n"
678               "default $a\n"
679               "          ^ near here"
680               , err);
681   }
682
683   {
684     State state;
685     ManifestParser parser(&state, NULL);
686     string err;
687     EXPECT_FALSE(parser.ParseTest("rule r\n"
688                                   "  command = r\n"
689                                   "build $a: r $c\n", &err));
690     // XXX the line number is wrong; we should evaluate paths in ParseEdge
691     // as we see them, not after we've read them all!
692     EXPECT_EQ("input:4: empty path\n", err);
693   }
694
695   {
696     State state;
697     ManifestParser parser(&state, NULL);
698     string err;
699     // the indented blank line must terminate the rule
700     // this also verifies that "unexpected (token)" errors are correct
701     EXPECT_FALSE(parser.ParseTest("rule r\n"
702                                   "  command = r\n"
703                                   "  \n"
704                                   "  generator = 1\n", &err));
705     EXPECT_EQ("input:4: unexpected indent\n", err);
706   }
707
708   {
709     State state;
710     ManifestParser parser(&state, NULL);
711     string err;
712     EXPECT_FALSE(parser.ParseTest("pool\n", &err));
713     EXPECT_EQ("input:1: expected pool name\n", err);
714   }
715
716   {
717     State state;
718     ManifestParser parser(&state, NULL);
719     string err;
720     EXPECT_FALSE(parser.ParseTest("pool foo\n", &err));
721     EXPECT_EQ("input:2: expected 'depth =' line\n", err);
722   }
723
724   {
725     State state;
726     ManifestParser parser(&state, NULL);
727     string err;
728     EXPECT_FALSE(parser.ParseTest("pool foo\n"
729                                   "  depth = 4\n"
730                                   "pool foo\n", &err));
731     EXPECT_EQ("input:3: duplicate pool 'foo'\n"
732               "pool foo\n"
733               "        ^ near here"
734               , err);
735   }
736
737   {
738     State state;
739     ManifestParser parser(&state, NULL);
740     string err;
741     EXPECT_FALSE(parser.ParseTest("pool foo\n"
742                                   "  depth = -1\n", &err));
743     EXPECT_EQ("input:2: invalid pool depth\n"
744               "  depth = -1\n"
745               "            ^ near here"
746               , err);
747   }
748
749   {
750     State state;
751     ManifestParser parser(&state, NULL);
752     string err;
753     EXPECT_FALSE(parser.ParseTest("pool foo\n"
754                                   "  bar = 1\n", &err));
755     EXPECT_EQ("input:2: unexpected variable 'bar'\n"
756               "  bar = 1\n"
757               "         ^ near here"
758               , err);
759   }
760
761   {
762     State state;
763     ManifestParser parser(&state, NULL);
764     string err;
765     // Pool names are dereferenced at edge parsing time.
766     EXPECT_FALSE(parser.ParseTest("rule run\n"
767                                   "  command = echo\n"
768                                   "  pool = unnamed_pool\n"
769                                   "build out: run in\n", &err));
770     EXPECT_EQ("input:5: unknown pool name 'unnamed_pool'\n", err);
771   }
772 }
773
774 TEST_F(ParserTest, MissingInput) {
775   State state;
776   ManifestParser parser(&state, this);
777   string err;
778   EXPECT_FALSE(parser.Load("build.ninja", &err));
779   EXPECT_EQ("loading 'build.ninja': No such file or directory", err);
780 }
781
782 TEST_F(ParserTest, MultipleOutputs) {
783   State state;
784   ManifestParser parser(&state, NULL);
785   string err;
786   EXPECT_TRUE(parser.ParseTest("rule cc\n  command = foo\n  depfile = bar\n"
787                                "build a.o b.o: cc c.cc\n",
788                                &err));
789   EXPECT_EQ("", err);
790 }
791
792 TEST_F(ParserTest, MultipleOutputsWithDeps) {
793   State state;
794   ManifestParser parser(&state, NULL);
795   string err;
796   EXPECT_FALSE(parser.ParseTest("rule cc\n  command = foo\n  deps = gcc\n"
797                                "build a.o b.o: cc c.cc\n",
798                                &err));
799   EXPECT_EQ("input:5: multiple outputs aren't (yet?) supported by depslog; "
800             "bring this up on the mailing list if it affects you\n", err);
801 }
802
803 TEST_F(ParserTest, SubNinja) {
804   files_["test.ninja"] =
805     "var = inner\n"
806     "build $builddir/inner: varref\n";
807   ASSERT_NO_FATAL_FAILURE(AssertParse(
808 "builddir = some_dir/\n"
809 "rule varref\n"
810 "  command = varref $var\n"
811 "var = outer\n"
812 "build $builddir/outer: varref\n"
813 "subninja test.ninja\n"
814 "build $builddir/outer2: varref\n"));
815   ASSERT_EQ(1u, files_read_.size());
816
817   EXPECT_EQ("test.ninja", files_read_[0]);
818   EXPECT_TRUE(state.LookupNode("some_dir/outer"));
819   // Verify our builddir setting is inherited.
820   EXPECT_TRUE(state.LookupNode("some_dir/inner"));
821
822   ASSERT_EQ(3u, state.edges_.size());
823   EXPECT_EQ("varref outer", state.edges_[0]->EvaluateCommand());
824   EXPECT_EQ("varref inner", state.edges_[1]->EvaluateCommand());
825   EXPECT_EQ("varref outer", state.edges_[2]->EvaluateCommand());
826 }
827
828 TEST_F(ParserTest, MissingSubNinja) {
829   ManifestParser parser(&state, this);
830   string err;
831   EXPECT_FALSE(parser.ParseTest("subninja foo.ninja\n", &err));
832   EXPECT_EQ("input:1: loading 'foo.ninja': No such file or directory\n"
833             "subninja foo.ninja\n"
834             "                  ^ near here"
835             , err);
836 }
837
838 TEST_F(ParserTest, DuplicateRuleInDifferentSubninjas) {
839   // Test that rules are scoped to subninjas.
840   files_["test.ninja"] = "rule cat\n"
841                          "  command = cat\n";
842   ManifestParser parser(&state, this);
843   string err;
844   EXPECT_TRUE(parser.ParseTest("rule cat\n"
845                                 "  command = cat\n"
846                                 "subninja test.ninja\n", &err));
847 }
848
849 TEST_F(ParserTest, DuplicateRuleInDifferentSubninjasWithInclude) {
850   // Test that rules are scoped to subninjas even with includes.
851   files_["rules.ninja"] = "rule cat\n"
852                          "  command = cat\n";
853   files_["test.ninja"] = "include rules.ninja\n"
854                          "build x : cat\n";
855   ManifestParser parser(&state, this);
856   string err;
857   EXPECT_TRUE(parser.ParseTest("include rules.ninja\n"
858                                 "subninja test.ninja\n"
859                                 "build y : cat\n", &err));
860 }
861
862 TEST_F(ParserTest, Include) {
863   files_["include.ninja"] = "var = inner\n";
864   ASSERT_NO_FATAL_FAILURE(AssertParse(
865 "var = outer\n"
866 "include include.ninja\n"));
867
868   ASSERT_EQ(1u, files_read_.size());
869   EXPECT_EQ("include.ninja", files_read_[0]);
870   EXPECT_EQ("inner", state.bindings_.LookupVariable("var"));
871 }
872
873 TEST_F(ParserTest, BrokenInclude) {
874   files_["include.ninja"] = "build\n";
875   ManifestParser parser(&state, this);
876   string err;
877   EXPECT_FALSE(parser.ParseTest("include include.ninja\n", &err));
878   EXPECT_EQ("include.ninja:1: expected path\n"
879             "build\n"
880             "     ^ near here"
881             , err);
882 }
883
884 TEST_F(ParserTest, Implicit) {
885   ASSERT_NO_FATAL_FAILURE(AssertParse(
886 "rule cat\n"
887 "  command = cat $in > $out\n"
888 "build foo: cat bar | baz\n"));
889
890   Edge* edge = state.LookupNode("foo")->in_edge();
891   ASSERT_TRUE(edge->is_implicit(1));
892 }
893
894 TEST_F(ParserTest, OrderOnly) {
895   ASSERT_NO_FATAL_FAILURE(AssertParse(
896 "rule cat\n  command = cat $in > $out\n"
897 "build foo: cat bar || baz\n"));
898
899   Edge* edge = state.LookupNode("foo")->in_edge();
900   ASSERT_TRUE(edge->is_order_only(1));
901 }
902
903 TEST_F(ParserTest, DefaultDefault) {
904   ASSERT_NO_FATAL_FAILURE(AssertParse(
905 "rule cat\n  command = cat $in > $out\n"
906 "build a: cat foo\n"
907 "build b: cat foo\n"
908 "build c: cat foo\n"
909 "build d: cat foo\n"));
910
911   string err;
912   EXPECT_EQ(4u, state.DefaultNodes(&err).size());
913   EXPECT_EQ("", err);
914 }
915
916 TEST_F(ParserTest, DefaultDefaultCycle) {
917   ASSERT_NO_FATAL_FAILURE(AssertParse(
918 "rule cat\n  command = cat $in > $out\n"
919 "build a: cat a\n"));
920
921   string err;
922   EXPECT_EQ(0u, state.DefaultNodes(&err).size());
923   EXPECT_EQ("could not determine root nodes of build graph", err);
924 }
925
926 TEST_F(ParserTest, DefaultStatements) {
927   ASSERT_NO_FATAL_FAILURE(AssertParse(
928 "rule cat\n  command = cat $in > $out\n"
929 "build a: cat foo\n"
930 "build b: cat foo\n"
931 "build c: cat foo\n"
932 "build d: cat foo\n"
933 "third = c\n"
934 "default a b\n"
935 "default $third\n"));
936
937   string err;
938   vector<Node*> nodes = state.DefaultNodes(&err);
939   EXPECT_EQ("", err);
940   ASSERT_EQ(3u, nodes.size());
941   EXPECT_EQ("a", nodes[0]->path());
942   EXPECT_EQ("b", nodes[1]->path());
943   EXPECT_EQ("c", nodes[2]->path());
944 }
945
946 TEST_F(ParserTest, UTF8) {
947   ASSERT_NO_FATAL_FAILURE(AssertParse(
948 "rule utf8\n"
949 "  command = true\n"
950 "  description = compilaci\xC3\xB3\n"));
951 }
952
953 TEST_F(ParserTest, CRLF) {
954   State state;
955   ManifestParser parser(&state, NULL);
956   string err;
957
958   EXPECT_TRUE(parser.ParseTest("# comment with crlf\r\n", &err));
959   EXPECT_TRUE(parser.ParseTest("foo = foo\nbar = bar\r\n", &err));
960   EXPECT_TRUE(parser.ParseTest(
961       "pool link_pool\r\n"
962       "  depth = 15\r\n\r\n"
963       "rule xyz\r\n"
964       "  command = something$expand \r\n"
965       "  description = YAY!\r\n",
966       &err));
967 }