2222
2323#include " cel/expr/syntax.pb.h"
2424#include " absl/algorithm/container.h"
25+ #include " absl/status/status.h"
2526#include " absl/status/status_matchers.h"
2627#include " absl/strings/ascii.h"
2728#include " absl/strings/str_cat.h"
2829#include " absl/strings/str_format.h"
2930#include " absl/strings/str_join.h"
3031#include " absl/strings/string_view.h"
3132#include " absl/types/optional.h"
33+ #include " base/ast_internal/ast_impl.h"
3234#include " common/constant.h"
3335#include " common/expr.h"
36+ #include " common/source.h"
3437#include " internal/benchmark.h"
3538#include " internal/testing.h"
3639#include " parser/macro.h"
@@ -43,6 +46,7 @@ namespace google::api::expr::parser {
4346namespace {
4447
4548using ::absl_testing::IsOk;
49+ using ::absl_testing::StatusIs;
4650using ::cel::ConstantKindCase;
4751using ::cel::ExprKindCase;
4852using ::cel::test::ExprPrinter;
@@ -1536,6 +1540,57 @@ TEST(ExpressionTest, RecursionDepthIgnoresParentheses) {
15361540 EXPECT_THAT (result, IsOk ());
15371541}
15381542
1543+ TEST (NewParserBuilderTest, Defaults) {
1544+ auto builder = cel::NewParserBuilder ();
1545+ ASSERT_OK_AND_ASSIGN (auto parser, std::move (*builder).Build ());
1546+
1547+ ASSERT_OK_AND_ASSIGN (auto source,
1548+ cel::NewSource (" has(a.b) && [].exists(x, x > 0)" ));
1549+ ASSERT_OK_AND_ASSIGN (auto ast, parser->Parse (*source));
1550+
1551+ EXPECT_FALSE (ast->IsChecked ());
1552+ }
1553+
1554+ TEST (NewParserBuilderTest, CustomMacros) {
1555+ auto builder = cel::NewParserBuilder ();
1556+ builder->GetOptions ().disable_standard_macros = true ;
1557+ ASSERT_THAT (builder->AddMacro (cel::HasMacro ()), IsOk ());
1558+ ASSERT_OK_AND_ASSIGN (auto parser, std::move (*builder).Build ());
1559+ builder.reset ();
1560+
1561+ ASSERT_OK_AND_ASSIGN (auto source, cel::NewSource (" has(a.b) && [].map(x, x)" ));
1562+ ASSERT_OK_AND_ASSIGN (auto ast, parser->Parse (*source));
1563+
1564+ EXPECT_FALSE (ast->IsChecked ());
1565+ KindAndIdAdorner kind_and_id_adorner;
1566+ ExprPrinter w (kind_and_id_adorner);
1567+ const auto & ast_impl = cel::ast_internal::AstImpl::CastFromPublicAst (*ast);
1568+ EXPECT_EQ (w.Print (ast_impl.root_expr ()),
1569+ " _&&_(\n "
1570+ " a^#2:Expr.Ident#.b~test-only~^#4:Expr.Select#,\n "
1571+ " []^#5:Expr.CreateList#.map(\n "
1572+ " x^#7:Expr.Ident#,\n "
1573+ " x^#8:Expr.Ident#\n "
1574+ " )^#6:Expr.Call#\n "
1575+ " )^#9:Expr.Call#" );
1576+ }
1577+
1578+ TEST (NewParserBuilderTest, ForwardsOptions) {
1579+ auto builder = cel::NewParserBuilder ();
1580+ builder->GetOptions ().enable_optional_syntax = true ;
1581+ ASSERT_OK_AND_ASSIGN (auto parser, std::move (*builder).Build ());
1582+ ASSERT_OK_AND_ASSIGN (auto source, cel::NewSource (" a.?b" ));
1583+ ASSERT_OK_AND_ASSIGN (auto ast, parser->Parse (*source));
1584+ EXPECT_FALSE (ast->IsChecked ());
1585+
1586+ builder = cel::NewParserBuilder ();
1587+ builder->GetOptions ().enable_optional_syntax = false ;
1588+ ASSERT_OK_AND_ASSIGN (parser, std::move (*builder).Build ());
1589+ ASSERT_OK_AND_ASSIGN (source, cel::NewSource (" a.?b" ));
1590+ EXPECT_THAT (parser->Parse (*source),
1591+ StatusIs (absl::StatusCode::kInvalidArgument ));
1592+ }
1593+
15391594std::string TestName (const testing::TestParamInfo<TestInfo>& test_info) {
15401595 std::string name = absl::StrCat (test_info.index , " -" , test_info.param .I );
15411596 absl::c_replace_if (name, [](char c) { return !absl::ascii_isalnum (c); }, ' _' );
0 commit comments