From 6dac2ee16cc5b83ee11c70e358f706e2c328b164 Mon Sep 17 00:00:00 2001 From: Evan Martin Date: Sat, 30 Oct 2010 12:49:23 -0700 Subject: [PATCH] failing test for loading subninja --- parsers.cc | 40 ++++++++++++++++++++++++++++++---------- parsers.h | 2 ++ parsers_test.cc | 12 ++++++++++-- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/parsers.cc b/parsers.cc index 39ff424..4350937 100644 --- a/parsers.cc +++ b/parsers.cc @@ -9,16 +9,17 @@ string Token::AsString() const { switch (type_) { - case IDENT: return "'" + extra_ + "'"; - case UNKNOWN: return "unknown '" + extra_ + "'"; - case RULE: return "'rule'"; - case BUILD: return "'build'"; - case NEWLINE: return "newline"; - case EQUALS: return "'='"; - case COLON: return "':'"; - case TEOF: return "eof"; - case INDENT: return "indenting in"; - case OUTDENT: return "indenting out"; + case IDENT: return "'" + extra_ + "'"; + case UNKNOWN: return "unknown '" + extra_ + "'"; + case RULE: return "'rule'"; + case BUILD: return "'build'"; + case SUBNINJA: return "'subninja'"; + case NEWLINE: return "newline"; + case EQUALS: return "'='"; + case COLON: return "':'"; + case TEOF: return "eof"; + case INDENT: return "indenting in"; + case OUTDENT: return "indenting out"; case NONE: default: assert(false); @@ -155,6 +156,8 @@ Token::Type Tokenizer::PeekToken() { token_.type_ = Token::RULE; else if (token_.extra_ == "build") token_.type_ = Token::BUILD; + else if (token_.extra_ == "subninja") + token_.type_ = Token::SUBNINJA; else token_.type_ = Token::IDENT; } else if (*cur_ == ':') { @@ -230,6 +233,10 @@ bool ManifestParser::Parse(const string& input, string* err) { if (!ParseEdge(err)) return false; break; + case Token::SUBNINJA: + if (!ParseSubNinja(err)) + return false; + break; case Token::IDENT: { string name, value; if (!ParseLet(&name, &value, err)) @@ -359,6 +366,19 @@ bool ManifestParser::ParseEdge(string* err) { return true; } +bool ManifestParser::ParseSubNinja(string* err) { + if (!tokenizer_.ExpectToken(Token::SUBNINJA, err)) + return false; + string path; + if (!tokenizer_.ReadIdent(&path)) + return tokenizer_.Error("expected subninja path", err); + if (!tokenizer_.Newline(err)) + return false; + + *err = "implement loading subninja"; + return false; +} + string ManifestParser::ExpandFile(const string& file) { if (!file.empty() && file[0] == '@') return builddir_ + file.substr(1); diff --git a/parsers.h b/parsers.h index d7d35a3..0455437 100644 --- a/parsers.h +++ b/parsers.h @@ -13,6 +13,7 @@ struct Token { IDENT, RULE, BUILD, + SUBNINJA, NEWLINE, EQUALS, COLON, @@ -76,6 +77,7 @@ struct ManifestParser { bool ParseRule(string* err); bool ParseLet(string* key, string* val, string* err); bool ParseEdge(string* err); + bool ParseSubNinja(string* err); string ExpandFile(const string& file); diff --git a/parsers_test.cc b/parsers_test.cc index fa1e74a..f58bcde 100644 --- a/parsers_test.cc +++ b/parsers_test.cc @@ -22,11 +22,14 @@ struct ParserTest : public testing::Test, return false; } virtual string ReadFile(const string& path, string* err) { - assert(false); - return ""; + map::iterator i = files_.find(path); + if (i == files_.end()) + return ""; + return i->second; } State state; + map files_; }; TEST_F(ParserTest, Empty) { @@ -182,6 +185,11 @@ TEST_F(ParserTest, BuildDir) { ASSERT_TRUE(state.LookupNode("out/a.o")); } +TEST_F(ParserTest, SubNinja) { + ASSERT_NO_FATAL_FAILURE(AssertParse( +"subninja test.ninja\n")); +} + TEST(MakefileParser, Basic) { MakefileParser parser; string err; -- 2.7.4