|  | #include "./grammar_codegen/backend.h" | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "gtest/gtest.h" | 
|  | #include "./grammar_codegen/antlr_frontend.h" | 
|  | #include "./grammar_codegen/grammar_info.h" | 
|  |  | 
|  | namespace fuzztest::internal::grammar { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | TEST(BackendTest, PreprocessInsertRuleForEOFAsNonTerminal) { | 
|  | const std::string grammar_str = R"( | 
|  | grammar TEST_GRAMMAR; | 
|  | root: "A" EOF; | 
|  | )"; | 
|  | GrammarInfoBuilder builder; | 
|  | Grammar grammar = builder.BuildGrammarInfo({grammar_str}, "test"); | 
|  | CodeGenerator backend(grammar); | 
|  | backend.Preprocess(grammar); | 
|  | EXPECT_EQ(grammar.rules.back().symbol_name, "EOF"); | 
|  | } | 
|  |  | 
|  | TEST(BackendTest, PreprocessInsertRuleForEOFAsSubProduction) { | 
|  | const std::string kGrammar = R"foo( | 
|  | grammar TEST_GRAMMAR; | 
|  | root: "A" ("b" EOF)*; | 
|  | )foo"; | 
|  | GrammarInfoBuilder builder; | 
|  | Grammar grammar = builder.BuildGrammarInfo({kGrammar}, "test"); | 
|  | CodeGenerator backend(grammar); | 
|  | backend.Preprocess(grammar); | 
|  | EXPECT_EQ(grammar.rules.back().symbol_name, "EOF"); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | }  // namespace fuzztest::internal::grammar |