22 bool Parse(
const char* input,
string* err);
30 return parser_.Parse(&input_, err);
36 "build/ninja.o: ninja.cc ninja.h eval_env.h manifest_parser.h\n",
39 ASSERT_EQ(1u, parser_.outs_.size());
40 EXPECT_EQ(
"build/ninja.o", parser_.outs_[0].AsString());
41 EXPECT_EQ(4u, parser_.ins_.size());
60 ASSERT_EQ(1u, parser_.outs_.size());
61 EXPECT_EQ(
"foo.o", parser_.outs_[0].AsString());
62 EXPECT_EQ(2u, parser_.ins_.size());
67 EXPECT_TRUE(Parse(
"foo.o: //?/c:/bar.h\n", &err));
69 ASSERT_EQ(1u, parser_.outs_.size());
70 EXPECT_EQ(
"foo.o", parser_.outs_[0].AsString());
71 EXPECT_EQ(1u, parser_.ins_.size());
72 EXPECT_EQ(
"//?/c:/bar.h", parser_.ins_[0].AsString());
77 EXPECT_TRUE(Parse(
"foo&bar.o foo'bar.o foo\"bar.o: foo&bar.h foo'bar.h foo\"bar.h\n", &err));
79 ASSERT_EQ(3u, parser_.outs_.size());
80 EXPECT_EQ(
"foo&bar.o", parser_.outs_[0].AsString());
81 EXPECT_EQ(
"foo'bar.o", parser_.outs_[1].AsString());
82 EXPECT_EQ(
"foo\"bar.o", parser_.outs_[2].AsString());
83 EXPECT_EQ(3u, parser_.ins_.size());
84 EXPECT_EQ(
"foo&bar.h", parser_.ins_[0].AsString());
85 EXPECT_EQ(
"foo'bar.h", parser_.ins_[1].AsString());
86 EXPECT_EQ(
"foo\"bar.h", parser_.ins_[2].AsString());
96 ASSERT_EQ(1u, parser_.outs_.size());
97 EXPECT_EQ(
"foo.o", parser_.outs_[0].AsString());
98 EXPECT_EQ(2u, parser_.ins_.size());
104 "Project\\Dir\\Build\\Release8\\Foo\\Foo.res : \\\n"
105 " Dir\\Library\\Foo.rc \\\n"
106 " Dir\\Library\\Version\\Bar.h \\\n"
107 " Dir\\Library\\Foo.ico \\\n"
108 " Project\\Thing\\Bar.tlb \\\n",
111 ASSERT_EQ(1u, parser_.outs_.size());
112 EXPECT_EQ(
"Project\\Dir\\Build\\Release8\\Foo\\Foo.res",
113 parser_.outs_[0].AsString());
114 EXPECT_EQ(4u, parser_.ins_.size());
120 "a\\ bc\\ def: a\\ b c d",
123 ASSERT_EQ(1u, parser_.outs_.size());
124 EXPECT_EQ(
"a bc def",
125 parser_.outs_[0].AsString());
126 ASSERT_EQ(3u, parser_.ins_.size());
128 parser_.ins_[0].AsString());
130 parser_.ins_[1].AsString());
132 parser_.ins_[2].AsString());
142 "a\\ b\\#c.h: \\\\\\\\\\ \\\\\\\\ \\\\share\\info\\\\#1",
145 ASSERT_EQ(1u, parser_.outs_.size());
147 parser_.outs_[0].AsString());
148 ASSERT_EQ(3u, parser_.ins_.size());
150 parser_.ins_[0].AsString());
151 EXPECT_EQ(
"\\\\\\\\",
152 parser_.ins_[1].AsString());
153 EXPECT_EQ(
"\\\\share\\info\\#1",
154 parser_.ins_[2].AsString());
162 "\\!\\@\\#$$\\%\\^\\&\\[\\]\\\\:",
165 ASSERT_EQ(1u, parser_.outs_.size());
166 EXPECT_EQ(
"\\!\\@#$\\%\\^\\&\\[\\]\\\\",
167 parser_.outs_[0].AsString());
168 ASSERT_EQ(0u, parser_.ins_.size());
177 "c\\:\\gcc\\x86_64-w64-mingw32\\include\\stddef.o: \\\n"
178 " c:\\gcc\\x86_64-w64-mingw32\\include\\stddef.h \n",
181 ASSERT_EQ(1u, parser_.outs_.size());
182 EXPECT_EQ(
"c:\\gcc\\x86_64-w64-mingw32\\include\\stddef.o",
183 parser_.outs_[0].AsString());
184 ASSERT_EQ(1u, parser_.ins_.size());
185 EXPECT_EQ(
"c:\\gcc\\x86_64-w64-mingw32\\include\\stddef.h",
186 parser_.ins_[0].AsString());
200 ASSERT_EQ(1u, parser_.outs_.size());
201 EXPECT_EQ(
"foo1\\", parser_.outs_[0].AsString());
202 ASSERT_EQ(1u, parser_.ins_.size());
203 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
211 "C:/Program\\ Files\\ (x86)/Microsoft\\ crtdefs.h: \\\n"
212 " en@quot.header~ t+t-x!=1 \\\n"
213 " openldap/slapd.d/cn=config/cn=schema/cn={0}core.ldif\\\n"
214 " Fu\303\244ball\\\n"
218 ASSERT_EQ(1u, parser_.outs_.size());
219 EXPECT_EQ(
"C:/Program Files (x86)/Microsoft crtdefs.h",
220 parser_.outs_[0].AsString());
221 ASSERT_EQ(5u, parser_.ins_.size());
222 EXPECT_EQ(
"en@quot.header~",
223 parser_.ins_[0].AsString());
224 EXPECT_EQ(
"t+t-x!=1",
225 parser_.ins_[1].AsString());
226 EXPECT_EQ(
"openldap/slapd.d/cn=config/cn=schema/cn={0}core.ldif",
227 parser_.ins_[2].AsString());
228 EXPECT_EQ(
"Fu\303\244ball",
229 parser_.ins_[3].AsString());
230 EXPECT_EQ(
"a[1]b@2%c",
231 parser_.ins_[4].AsString());
237 EXPECT_TRUE(Parse(
"foo foo: x y z", &err));
238 ASSERT_EQ(1u, parser_.outs_.size());
239 ASSERT_EQ(
"foo", parser_.outs_[0].AsString());
240 ASSERT_EQ(3u, parser_.ins_.size());
241 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
242 EXPECT_EQ(
"y", parser_.ins_[1].AsString());
243 EXPECT_EQ(
"z", parser_.ins_[2].AsString());
249 EXPECT_TRUE(Parse(
"foo bar: x y z", &err));
250 ASSERT_EQ(2u, parser_.outs_.size());
251 ASSERT_EQ(
"foo", parser_.outs_[0].AsString());
252 ASSERT_EQ(
"bar", parser_.outs_[1].AsString());
253 ASSERT_EQ(3u, parser_.ins_.size());
254 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
255 EXPECT_EQ(
"y", parser_.ins_[1].AsString());
256 EXPECT_EQ(
"z", parser_.ins_[2].AsString());
261 EXPECT_TRUE(Parse(
"foo: x\n"
264 ASSERT_EQ(1u, parser_.outs_.size());
265 ASSERT_EQ(
"foo", parser_.outs_[0].AsString());
266 ASSERT_EQ(1u, parser_.ins_.size());
267 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
272 EXPECT_TRUE(Parse(
"foo: x\n"
276 ASSERT_EQ(1u, parser_.outs_.size());
277 ASSERT_EQ(
"foo", parser_.outs_[0].AsString());
278 ASSERT_EQ(3u, parser_.ins_.size());
279 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
280 EXPECT_EQ(
"y", parser_.ins_[1].AsString());
281 EXPECT_EQ(
"z", parser_.ins_[2].AsString());
286 EXPECT_TRUE(Parse(
"foo: x\r\n"
289 "foo: z\r\n", &err));
290 ASSERT_EQ(1u, parser_.outs_.size());
291 ASSERT_EQ(
"foo", parser_.outs_[0].AsString());
292 ASSERT_EQ(3u, parser_.ins_.size());
293 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
294 EXPECT_EQ(
"y", parser_.ins_[1].AsString());
295 EXPECT_EQ(
"z", parser_.ins_[2].AsString());
300 EXPECT_TRUE(Parse(
"foo: x\\\n"
304 ASSERT_EQ(1u, parser_.outs_.size());
305 ASSERT_EQ(
"foo", parser_.outs_[0].AsString());
306 ASSERT_EQ(3u, parser_.ins_.size());
307 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
308 EXPECT_EQ(
"y", parser_.ins_[1].AsString());
309 EXPECT_EQ(
"z", parser_.ins_[2].AsString());
314 EXPECT_TRUE(Parse(
"foo: x\\\r\n"
317 "foo: z\r\n", &err));
318 ASSERT_EQ(1u, parser_.outs_.size());
319 ASSERT_EQ(
"foo", parser_.outs_[0].AsString());
320 ASSERT_EQ(3u, parser_.ins_.size());
321 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
322 EXPECT_EQ(
"y", parser_.ins_[1].AsString());
323 EXPECT_EQ(
"z", parser_.ins_[2].AsString());
328 EXPECT_TRUE(Parse(
" foo: x\n"
331 ASSERT_EQ(1u, parser_.outs_.size());
332 ASSERT_EQ(
"foo", parser_.outs_[0].AsString());
333 ASSERT_EQ(3u, parser_.ins_.size());
334 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
335 EXPECT_EQ(
"y", parser_.ins_[1].AsString());
336 EXPECT_EQ(
"z", parser_.ins_[2].AsString());
341 EXPECT_TRUE(Parse(
" foo: x\r\n"
343 " foo: z\r\n", &err));
344 ASSERT_EQ(1u, parser_.outs_.size());
345 ASSERT_EQ(
"foo", parser_.outs_[0].AsString());
346 ASSERT_EQ(3u, parser_.ins_.size());
347 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
348 EXPECT_EQ(
"y", parser_.ins_[1].AsString());
349 EXPECT_EQ(
"z", parser_.ins_[2].AsString());
354 EXPECT_TRUE(Parse(
"foo: x y z\n"
358 ASSERT_EQ(1u, parser_.outs_.size());
359 ASSERT_EQ(
"foo", parser_.outs_[0].AsString());
360 ASSERT_EQ(3u, parser_.ins_.size());
361 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
362 EXPECT_EQ(
"y", parser_.ins_[1].AsString());
363 EXPECT_EQ(
"z", parser_.ins_[2].AsString());
368 EXPECT_TRUE(Parse(
"foo: x\n"
374 ASSERT_EQ(1u, parser_.outs_.size());
375 ASSERT_EQ(
"foo", parser_.outs_[0].AsString());
376 ASSERT_EQ(3u, parser_.ins_.size());
377 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
378 EXPECT_EQ(
"y", parser_.ins_[1].AsString());
379 EXPECT_EQ(
"z", parser_.ins_[2].AsString());
386 EXPECT_TRUE(Parse(
"foo: x y\n"
387 "bar: y z\n", &err));
388 ASSERT_EQ(2u, parser_.outs_.size());
389 ASSERT_EQ(
"foo", parser_.outs_[0].AsString());
390 ASSERT_EQ(
"bar", parser_.outs_[1].AsString());
391 ASSERT_EQ(3u, parser_.ins_.size());
392 EXPECT_EQ(
"x", parser_.ins_[0].AsString());
393 EXPECT_EQ(
"y", parser_.ins_[1].AsString());
394 EXPECT_EQ(
"z", parser_.ins_[2].AsString());
399 EXPECT_FALSE(Parse(
"foo: x y z\n"
403 ASSERT_EQ(
"inputs may not also have inputs", err);
408 EXPECT_TRUE(Parse(
"", &err));
409 ASSERT_EQ(0u, parser_.outs_.size());
410 ASSERT_EQ(0u, parser_.ins_.size());
415 EXPECT_TRUE(Parse(
"\n\n", &err));
416 ASSERT_EQ(0u, parser_.outs_.size());
417 ASSERT_EQ(0u, parser_.ins_.size());
423 EXPECT_FALSE(Parse(
"foo.o foo.c\n", &err));
424 EXPECT_EQ(
"expected ':' in depfile", err);
TEST_F(DepfileParserTest, Basic)
bool Parse(const char *input, string *err)
Parser for the dependency information emitted by gcc's -M flags.