31 EXPECT_TRUE(parser.
ParseTest(input, &err));
38 " command = touch $out\n"
39 "build out otherout: touch\n");
52 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
53 EXPECT_EQ(
"input:1: expected 'ninja_dyndep_version = ...'\n", err);
58 "ninja_dyndep_version = 1\n"));
63 "ninja_dyndep_version = 1-extra\n"));
68 "ninja_dyndep_version = 1.0\n"));
73 "ninja_dyndep_version = 1.0-extra\n"));
79 "ninja_dyndep_version = 1\n"));
85 "ninja_dyndep_version = 1\n"));
90 "ninja_dyndep_version = 1\r\n"));
96 "ninja_dyndep_version = 1\r\n"));
102 "ninja_dyndep_version = 1\r\n"));
106 const char kInput[] =
107 "ninja_dyndep_version = 1.0";
110 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
111 EXPECT_EQ(
"input:1: unexpected EOF\n"
112 "ninja_dyndep_version = 1.0\n"
113 " ^ near here", err);
117 const char kInput[] =
118 "ninja_dyndep_version = 0\n";
121 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
122 EXPECT_EQ(
"input:1: unsupported 'ninja_dyndep_version = 0'\n"
123 "ninja_dyndep_version = 0\n"
124 " ^ near here", err);
128 const char kInput[] =
129 "ninja_dyndep_version = 1.1\n";
132 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
133 EXPECT_EQ(
"input:1: unsupported 'ninja_dyndep_version = 1.1'\n"
134 "ninja_dyndep_version = 1.1\n"
135 " ^ near here", err);
139 const char kInput[] =
140 "ninja_dyndep_version = 1\n"
141 "ninja_dyndep_version = 1\n";
144 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
145 EXPECT_EQ(
"input:2: unexpected identifier\n", err);
149 const char kInput[] =
150 "not_ninja_dyndep_version = 1\n";
153 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
154 EXPECT_EQ(
"input:1: expected 'ninja_dyndep_version = ...'\n"
155 "not_ninja_dyndep_version = 1\n"
156 " ^ near here", err);
160 const char kInput[] =
161 "build out: dyndep\n";
164 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
165 EXPECT_EQ(
"input:1: expected 'ninja_dyndep_version = ...'\n", err);
169 const char kInput[] =
173 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
174 EXPECT_EQ(
"input:1: unexpected '='\n", err);
178 const char kInput[] =
182 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
183 EXPECT_EQ(
"input:1: unexpected indent\n", err);
187 const char kInput[] =
188 "ninja_dyndep_version = 1\n"
189 "build out: dyndep\n"
190 "build out: dyndep\n";
193 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
194 EXPECT_EQ(
"input:3: multiple statements for 'out'\n"
195 "build out: dyndep\n"
196 " ^ near here", err);
200 const char kInput[] =
201 "ninja_dyndep_version = 1\n"
202 "build out: dyndep\n"
203 "build otherout: dyndep\n";
206 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
207 EXPECT_EQ(
"input:3: multiple statements for 'otherout'\n"
208 "build otherout: dyndep\n"
209 " ^ near here", err);
213 const char kInput[] =
214 "ninja_dyndep_version = 1\n"
218 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
219 EXPECT_EQ(
"input:2: unexpected EOF\n"
221 " ^ near here", err);
225 const char kInput[] =
226 "ninja_dyndep_version = 1\n"
230 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
231 EXPECT_EQ(
"input:2: expected path\n"
233 " ^ near here", err);
237 const char kInput[] =
238 "ninja_dyndep_version = 1\n"
239 "build missing: dyndep\n";
242 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
243 EXPECT_EQ(
"input:2: no build statement exists for 'missing'\n"
244 "build missing: dyndep\n"
245 " ^ near here", err);
249 const char kInput[] =
250 "ninja_dyndep_version = 1\n"
254 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
255 EXPECT_EQ(
"input:2: unexpected EOF\n"
257 " ^ near here", err);
261 const char kInput[] =
262 "ninja_dyndep_version = 1\n"
266 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
267 EXPECT_EQ(
"input:2: expected build command name 'dyndep'\n"
269 " ^ near here", err);
273 const char kInput[] =
274 "ninja_dyndep_version = 1\n"
278 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
279 EXPECT_EQ(
"input:2: expected build command name 'dyndep'\n"
281 " ^ near here", err);
285 const char kInput[] =
286 "ninja_dyndep_version = 1\n"
290 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
291 EXPECT_EQ(
"input:2: unexpected EOF\n"
292 "build out: dyndep\n"
293 " ^ near here", err);
297 const char kInput[] =
298 "ninja_dyndep_version = 1\n"
299 "build out exp: dyndep\n";
302 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
303 EXPECT_EQ(
"input:2: explicit outputs not supported\n"
304 "build out exp: dyndep\n"
305 " ^ near here", err);
309 const char kInput[] =
310 "ninja_dyndep_version = 1\n"
311 "build out: dyndep exp\n";
314 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
315 EXPECT_EQ(
"input:2: explicit inputs not supported\n"
316 "build out: dyndep exp\n"
317 " ^ near here", err);
321 const char kInput[] =
322 "ninja_dyndep_version = 1\n"
323 "build out: dyndep ||\n";
326 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
327 EXPECT_EQ(
"input:2: order-only inputs not supported\n"
328 "build out: dyndep ||\n"
329 " ^ near here", err);
333 const char kInput[] =
334 "ninja_dyndep_version = 1\n"
335 "build out: dyndep\n"
339 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
340 EXPECT_EQ(
"input:3: binding is not 'restat'\n"
342 " ^ near here", err);
346 const char kInput[] =
347 "ninja_dyndep_version = 1\n"
348 "build out: dyndep\n"
353 EXPECT_FALSE(parser.
ParseTest(kInput, &err));
354 EXPECT_EQ(
"input:4: unexpected indent\n", err);
359 "ninja_dyndep_version = 1\n"
360 "build out: dyndep\n"));
362 EXPECT_EQ(1u, dyndep_file_.size());
363 DyndepFile::iterator i = dyndep_file_.find(state_.edges_[0]);
364 ASSERT_NE(i, dyndep_file_.end());
365 EXPECT_EQ(
false, i->second.restat_);
366 EXPECT_EQ(0u, i->second.implicit_outputs_.size());
367 EXPECT_EQ(0u, i->second.implicit_inputs_.size());
372 "ninja_dyndep_version = 1\n"
373 "build out | : dyndep |\n"));
375 EXPECT_EQ(1u, dyndep_file_.size());
376 DyndepFile::iterator i = dyndep_file_.find(state_.edges_[0]);
377 ASSERT_NE(i, dyndep_file_.end());
378 EXPECT_EQ(
false, i->second.restat_);
379 EXPECT_EQ(0u, i->second.implicit_outputs_.size());
380 EXPECT_EQ(0u, i->second.implicit_inputs_.size());
385 "ninja_dyndep_version = 1\n"
386 "build out: dyndep | impin\n"));
388 EXPECT_EQ(1u, dyndep_file_.size());
389 DyndepFile::iterator i = dyndep_file_.find(state_.edges_[0]);
390 ASSERT_NE(i, dyndep_file_.end());
391 EXPECT_EQ(
false, i->second.restat_);
392 EXPECT_EQ(0u, i->second.implicit_outputs_.size());
393 ASSERT_EQ(1u, i->second.implicit_inputs_.size());
394 EXPECT_EQ(
"impin", i->second.implicit_inputs_[0]->path());
399 "ninja_dyndep_version = 1\n"
400 "build out: dyndep | impin1 impin2\n"));
402 EXPECT_EQ(1u, dyndep_file_.size());
403 DyndepFile::iterator i = dyndep_file_.find(state_.edges_[0]);
404 ASSERT_NE(i, dyndep_file_.end());
405 EXPECT_EQ(
false, i->second.restat_);
406 EXPECT_EQ(0u, i->second.implicit_outputs_.size());
407 ASSERT_EQ(2u, i->second.implicit_inputs_.size());
408 EXPECT_EQ(
"impin1", i->second.implicit_inputs_[0]->path());
409 EXPECT_EQ(
"impin2", i->second.implicit_inputs_[1]->path());
414 "ninja_dyndep_version = 1\n"
415 "build out | impout: dyndep\n"));
417 EXPECT_EQ(1u, dyndep_file_.size());
418 DyndepFile::iterator i = dyndep_file_.find(state_.edges_[0]);
419 ASSERT_NE(i, dyndep_file_.end());
420 EXPECT_EQ(
false, i->second.restat_);
421 ASSERT_EQ(1u, i->second.implicit_outputs_.size());
422 EXPECT_EQ(
"impout", i->second.implicit_outputs_[0]->path());
423 EXPECT_EQ(0u, i->second.implicit_inputs_.size());
428 "ninja_dyndep_version = 1\n"
429 "build out | impout1 impout2 : dyndep\n"));
431 EXPECT_EQ(1u, dyndep_file_.size());
432 DyndepFile::iterator i = dyndep_file_.find(state_.edges_[0]);
433 ASSERT_NE(i, dyndep_file_.end());
434 EXPECT_EQ(
false, i->second.restat_);
435 ASSERT_EQ(2u, i->second.implicit_outputs_.size());
436 EXPECT_EQ(
"impout1", i->second.implicit_outputs_[0]->path());
437 EXPECT_EQ(
"impout2", i->second.implicit_outputs_[1]->path());
438 EXPECT_EQ(0u, i->second.implicit_inputs_.size());
443 "ninja_dyndep_version = 1\n"
444 "build out | impout1 impout2: dyndep | impin1 impin2\n"));
446 EXPECT_EQ(1u, dyndep_file_.size());
447 DyndepFile::iterator i = dyndep_file_.find(state_.edges_[0]);
448 ASSERT_NE(i, dyndep_file_.end());
449 EXPECT_EQ(
false, i->second.restat_);
450 ASSERT_EQ(2u, i->second.implicit_outputs_.size());
451 EXPECT_EQ(
"impout1", i->second.implicit_outputs_[0]->path());
452 EXPECT_EQ(
"impout2", i->second.implicit_outputs_[1]->path());
453 ASSERT_EQ(2u, i->second.implicit_inputs_.size());
454 EXPECT_EQ(
"impin1", i->second.implicit_inputs_[0]->path());
455 EXPECT_EQ(
"impin2", i->second.implicit_inputs_[1]->path());
460 "ninja_dyndep_version = 1\n"
461 "build out: dyndep\n"
464 EXPECT_EQ(1u, dyndep_file_.size());
465 DyndepFile::iterator i = dyndep_file_.find(state_.edges_[0]);
466 ASSERT_NE(i, dyndep_file_.end());
467 EXPECT_EQ(
true, i->second.restat_);
468 EXPECT_EQ(0u, i->second.implicit_outputs_.size());
469 EXPECT_EQ(0u, i->second.implicit_inputs_.size());
474 "ninja_dyndep_version = 1\n"
475 "build otherout: dyndep\n"));
477 EXPECT_EQ(1u, dyndep_file_.size());
478 DyndepFile::iterator i = dyndep_file_.find(state_.edges_[0]);
479 ASSERT_NE(i, dyndep_file_.end());
480 EXPECT_EQ(
false, i->second.restat_);
481 EXPECT_EQ(0u, i->second.implicit_outputs_.size());
482 EXPECT_EQ(0u, i->second.implicit_inputs_.size());
487 "build out2: touch\n");
488 ASSERT_EQ(2u, state_.edges_.size());
489 ASSERT_EQ(1u, state_.edges_[1]->outputs_.size());
490 EXPECT_EQ(
"out2", state_.edges_[1]->outputs_[0]->path());
491 EXPECT_EQ(0u, state_.edges_[0]->inputs_.size());
494 "ninja_dyndep_version = 1\n"
495 "build out: dyndep\n"
496 "build out2: dyndep\n"
499 EXPECT_EQ(2u, dyndep_file_.size());
501 DyndepFile::iterator i = dyndep_file_.find(state_.edges_[0]);
502 ASSERT_NE(i, dyndep_file_.end());
503 EXPECT_EQ(
false, i->second.restat_);
504 EXPECT_EQ(0u, i->second.implicit_outputs_.size());
505 EXPECT_EQ(0u, i->second.implicit_inputs_.size());
508 DyndepFile::iterator i = dyndep_file_.find(state_.edges_[1]);
509 ASSERT_NE(i, dyndep_file_.end());
510 EXPECT_EQ(
true, i->second.restat_);
511 EXPECT_EQ(0u, i->second.implicit_outputs_.size());
512 EXPECT_EQ(0u, i->second.implicit_inputs_.size());
TEST_F(DyndepParserTest, Empty)
Store data loaded from one dyndep file.
void AssertParse(const char *input)
bool ParseTest(const std::string &input, std::string *err)
Parse a text string of input. Used by tests.
Global state (file status) for a single run.
An implementation of DiskInterface that uses an in-memory representation of disk state.
void AssertParse(State *state, const char *input, ManifestParserOptions opts)