@@ -564,6 +564,55 @@ TEST_F(UpdatedConstantFoldingTest, ErrorsOnUnexpectedOrder) {
564564 StatusIs (absl::StatusCode::kInternal ));
565565}
566566
567+ TEST_F (UpdatedConstantFoldingTest, FoldsListWithInlinedConstantIdent) {
568+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<cel::Ast> list_ast,
569+ ParseFromCel (" [a, 2]" ));
570+ const Expr& create_list = list_ast->root_expr ();
571+ const Expr& elem_a = create_list.list_expr ().elements ()[0 ].expr ();
572+ const Expr& elem_two = create_list.list_expr ().elements ()[1 ].expr ();
573+
574+ ProgramBuilder program_builder;
575+ program_builder.EnterSubexpression (&create_list);
576+ // Simulate `a` having been inlined as a constant step by FlatExprVisitor.
577+ program_builder.EnterSubexpression (&elem_a);
578+ program_builder.AddStep (
579+ ExpressionStep::MakeConstant (cel::IntValue (10 ), elem_a.id ()));
580+ program_builder.ExitSubexpression (&elem_a);
581+
582+ program_builder.EnterSubexpression (&elem_two);
583+ program_builder.AddStep (
584+ ExpressionStep::MakeConstant (cel::IntValue (2 ), elem_two.id ()));
585+ program_builder.ExitSubexpression (&elem_two);
586+
587+ program_builder.AddStep (CreateCreateListStep (
588+ create_list.list_expr ().elements ().size (), {}, create_list.id ()));
589+ program_builder.ExitSubexpression (&create_list);
590+
591+ options_.enable_subexpression_inlining = true ;
592+ std::shared_ptr<google::protobuf::Arena> arena;
593+ PlannerContext context (env_, resolver_, options_,
594+ type_registry_.GetComposedTypeProvider (),
595+ issue_collector_, program_builder, arena);
596+
597+ ProgramOptimizerFactory constant_folder_factory =
598+ CreateConstantFoldingOptimizer ();
599+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<ProgramOptimizer> constant_folder,
600+ constant_folder_factory (context, *list_ast));
601+
602+ ASSERT_THAT (constant_folder->OnPreVisit (context, create_list), IsOk ());
603+ ASSERT_THAT (constant_folder->OnPreVisit (context, elem_a), IsOk ());
604+ ASSERT_THAT (constant_folder->OnPostVisit (context, elem_a), IsOk ());
605+ ASSERT_THAT (constant_folder->OnPreVisit (context, elem_two), IsOk ());
606+ ASSERT_THAT (constant_folder->OnPostVisit (context, elem_two), IsOk ());
607+ ASSERT_THAT (constant_folder->OnPostVisit (context, create_list), IsOk ());
608+
609+ ExecutionPath path = std::move (program_builder).FlattenMain ();
610+ EXPECT_THAT (path, SizeIs (1 ));
611+ cel::Value folded_list;
612+ ASSERT_TRUE (google::api::expr::runtime::GetIfConstant (path[0 ], folded_list));
613+ EXPECT_TRUE (folded_list.IsList ());
614+ }
615+
567616} // namespace
568617
569618} // namespace cel::runtime_internal
0 commit comments