@@ -1055,7 +1055,7 @@ std::string FormatIssues(const cel::Source& source,
10551055 issues, " \n " , [&source](std::string* out, const cel::ParseIssue& issue) {
10561056 absl::StrAppend (
10571057 out,
1058- absl::StrFormat (" ERROR: %s:%zu:%zu : %s" , source.description (),
1058+ absl::StrFormat (" ERROR: %s:%d:%d : %s" , source.description (),
10591059 issue.location ().line , issue.location ().column + 1 ,
10601060 issue.message ()),
10611061 source.DisplayErrorLocation (issue.location ()));
@@ -1576,53 +1576,6 @@ INSTANTIATE_TEST_SUITE_P(PrattParserMacroTest, PrattParserMacroTest,
15761576 testing::ValuesIn (GetMacroTestCases()),
15771577 TestName<MacroTestCase>);
15781578
1579- TEST (PrattParserMacroErrorTest, ReportError) {
1580- auto builder = NewPrattParserBuilder ();
1581- ASSERT_OK_AND_ASSIGN (
1582- auto error_macro,
1583- Macro::Global (" bad_macro" , 1 ,
1584- [](MacroExprFactory& macro_factory,
1585- absl::Span<Expr> args) -> std::optional<Expr> {
1586- return macro_factory.ReportError (" custom macro error" );
1587- }));
1588-
1589- ASSERT_THAT (builder->AddMacro (error_macro), IsOk ());
1590- ASSERT_OK_AND_ASSIGN (auto parser, builder->Build ());
1591-
1592- ASSERT_OK_AND_ASSIGN (auto source, cel::NewSource (" 42 + bad_macro(x)" ));
1593- std::vector<cel::ParseIssue> issues;
1594- auto ast = parser->Parse (*source, &issues);
1595- EXPECT_THAT (ast, StatusIs (absl::StatusCode::kInvalidArgument ));
1596- EXPECT_EQ (FormatIssues (*source, issues),
1597- " ERROR: <input>:1:6: custom macro error\n "
1598- " | 42 + bad_macro(x)\n "
1599- " | .....^" );
1600- }
1601-
1602- TEST (PrattParserMacroErrorTest, ReportErrorAt) {
1603- auto builder = NewPrattParserBuilder ();
1604- ASSERT_OK_AND_ASSIGN (
1605- auto error_at_macro,
1606- Macro::Global (" bad_macro_at" , 1 ,
1607- [](MacroExprFactory& macro_factory,
1608- absl::Span<Expr> args) -> std::optional<Expr> {
1609- return macro_factory.ReportErrorAt (args[0 ],
1610- " custom error at arg" );
1611- }));
1612-
1613- ASSERT_THAT (builder->AddMacro (error_at_macro), IsOk ());
1614- ASSERT_OK_AND_ASSIGN (auto parser, builder->Build ());
1615-
1616- ASSERT_OK_AND_ASSIGN (auto source, cel::NewSource (" bad_macro_at(x)" ));
1617- std::vector<cel::ParseIssue> issues;
1618- auto ast = parser->Parse (*source, &issues);
1619- EXPECT_THAT (ast, StatusIs (absl::StatusCode::kInvalidArgument ));
1620- EXPECT_EQ (FormatIssues (*source, issues),
1621- " ERROR: <input>:1:14: custom error at arg\n "
1622- " | bad_macro_at(x)\n "
1623- " | .............^" );
1624- }
1625-
16261579TEST (PrattParserMacroCallsTest, MacroCallsDisabledByDefault) {
16271580 cel::ParserOptions options;
16281581 options.add_macro_calls = false ;
@@ -1737,5 +1690,77 @@ TEST(PrattParserMacroCallsTest, NestedMacroCallsUseCopyAndReplaceReplacer) {
17371690 )" ));
17381691}
17391692
1693+ TEST (PrattParserMacroErrorTest, ReportError) {
1694+ auto builder = NewPrattParserBuilder ();
1695+ ASSERT_OK_AND_ASSIGN (
1696+ auto error_macro,
1697+ Macro::Global (" bad_macro" , 1 ,
1698+ [](MacroExprFactory& macro_factory,
1699+ absl::Span<Expr> args) -> std::optional<Expr> {
1700+ return macro_factory.ReportError (" custom macro error" );
1701+ }));
1702+
1703+ ASSERT_THAT (builder->AddMacro (error_macro), IsOk ());
1704+ ASSERT_OK_AND_ASSIGN (auto parser, builder->Build ());
1705+
1706+ ASSERT_OK_AND_ASSIGN (auto source, cel::NewSource (" 42 + bad_macro(x)" ));
1707+ std::vector<cel::ParseIssue> issues;
1708+ auto ast = parser->Parse (*source, &issues);
1709+ EXPECT_THAT (ast, StatusIs (absl::StatusCode::kInvalidArgument ));
1710+ EXPECT_EQ (FormatIssues (*source, issues),
1711+ " ERROR: <input>:1:6: custom macro error\n "
1712+ " | 42 + bad_macro(x)\n "
1713+ " | .....^" );
1714+ }
1715+
1716+ TEST (PrattParserMacroErrorTest, ReportErrorAt) {
1717+ auto builder = NewPrattParserBuilder ();
1718+ ASSERT_OK_AND_ASSIGN (
1719+ auto error_at_macro,
1720+ Macro::Global (" bad_macro_at" , 1 ,
1721+ [](MacroExprFactory& macro_factory,
1722+ absl::Span<Expr> args) -> std::optional<Expr> {
1723+ return macro_factory.ReportErrorAt (args[0 ],
1724+ " custom error at arg" );
1725+ }));
1726+
1727+ ASSERT_THAT (builder->AddMacro (error_at_macro), IsOk ());
1728+ ASSERT_OK_AND_ASSIGN (auto parser, builder->Build ());
1729+
1730+ ASSERT_OK_AND_ASSIGN (auto source, cel::NewSource (" bad_macro_at(x)" ));
1731+ std::vector<cel::ParseIssue> issues;
1732+ auto ast = parser->Parse (*source, &issues);
1733+ EXPECT_THAT (ast, StatusIs (absl::StatusCode::kInvalidArgument ));
1734+ EXPECT_EQ (FormatIssues (*source, issues),
1735+ " ERROR: <input>:1:14: custom error at arg\n "
1736+ " | bad_macro_at(x)\n "
1737+ " | .............^" );
1738+ }
1739+
1740+ TEST (PrattParserErrorRecoveryTest, ErrorRecoveryLimitZero) {
1741+ cel::ParserOptions options;
1742+ options.error_recovery_limit = 0 ;
1743+ std::vector<cel::ParseIssue> issues;
1744+ auto result = Parse (" ......" , options, &issues);
1745+ EXPECT_THAT (result, StatusIs (absl::StatusCode::kInvalidArgument ));
1746+ ASSERT_OK_AND_ASSIGN (auto source, cel::NewSource (" ......" ));
1747+ EXPECT_EQ (FormatIssues (*source, issues),
1748+ " ERROR: <input>:-1:0: Error recovery limit (0) exceeded" );
1749+ }
1750+
1751+ TEST (PrattParserErrorRecoveryTest, ErrorRecoveryLimitOne) {
1752+ cel::ParserOptions options;
1753+ options.error_recovery_limit = 1 ;
1754+ std::vector<cel::ParseIssue> issues;
1755+ auto result = Parse (" ......" , options, &issues);
1756+ EXPECT_THAT (result, StatusIs (absl::StatusCode::kInvalidArgument ));
1757+ ASSERT_OK_AND_ASSIGN (auto source, cel::NewSource (" ......" ));
1758+ EXPECT_EQ (FormatIssues (*source, issues),
1759+ " ERROR: <input>:1:2: expected identifier\n "
1760+ " | ......\n "
1761+ " | .^\n "
1762+ " ERROR: <input>:-1:0: Error recovery limit (1) exceeded" );
1763+ }
1764+
17401765} // namespace
17411766} // namespace cel::parser_internal
0 commit comments