2020#include " cel/expr/syntax.pb.h"
2121#include " absl/base/nullability.h"
2222#include " absl/status/status.h"
23+ #include " absl/status/status_matchers.h"
2324#include " absl/status/statusor.h"
2425#include " absl/strings/string_view.h"
2526#include " base/ast.h"
@@ -49,6 +50,7 @@ namespace cel::runtime_internal {
4950
5051namespace {
5152
53+ using ::absl_testing::IsOk;
5254using ::absl_testing::StatusIs;
5355using ::cel::Expr;
5456using ::cel::RuntimeIssue;
@@ -290,6 +292,7 @@ TEST_F(UpdatedConstantFoldingTest, CreatesList) {
290292 const Expr& elem_two = create_list.list_expr ().elements ()[1 ].expr ();
291293
292294 ProgramBuilder program_builder;
295+ // Simulate the visitor order.
293296 program_builder.EnterSubexpression (&create_list);
294297
295298 // elem one
@@ -309,7 +312,6 @@ TEST_F(UpdatedConstantFoldingTest, CreatesList) {
309312 program_builder.AddStep (std::move (step));
310313 program_builder.ExitSubexpression (&create_list);
311314
312- // Insert the list creation step
313315 std::shared_ptr<google::protobuf::Arena> arena;
314316 PlannerContext context (env_, resolver_, options_,
315317 type_registry_.GetComposedTypeProvider (),
@@ -335,6 +337,89 @@ TEST_F(UpdatedConstantFoldingTest, CreatesList) {
335337 EXPECT_THAT (path, SizeIs (1 ));
336338}
337339
340+ TEST_F (UpdatedConstantFoldingTest, CreatesLargeList) {
341+ // Arrange
342+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<cel::Ast> ast,
343+ ParseFromCel (" [1, 2, 3, 4, 5]" ));
344+ AstImpl& ast_impl = AstImpl::CastFromPublicAst (*ast);
345+
346+ const Expr& create_list = ast_impl.root_expr ();
347+ const Expr& elem0 = create_list.list_expr ().elements ()[0 ].expr ();
348+ const Expr& elem1 = create_list.list_expr ().elements ()[1 ].expr ();
349+ const Expr& elem2 = create_list.list_expr ().elements ()[2 ].expr ();
350+ const Expr& elem3 = create_list.list_expr ().elements ()[3 ].expr ();
351+ const Expr& elem4 = create_list.list_expr ().elements ()[4 ].expr ();
352+
353+ ProgramBuilder program_builder;
354+ // Simulate the visitor order.
355+ program_builder.EnterSubexpression (&create_list);
356+
357+ // 0
358+ program_builder.EnterSubexpression (&elem0);
359+ ASSERT_OK_AND_ASSIGN (auto step, CreateConstValueStep (cel::IntValue (1L ), 1 ));
360+ program_builder.AddStep (std::move (step));
361+ program_builder.ExitSubexpression (&elem0);
362+
363+ // 1
364+ program_builder.EnterSubexpression (&elem1);
365+ ASSERT_OK_AND_ASSIGN (step, CreateConstValueStep (cel::IntValue (2L ), 2 ));
366+ program_builder.AddStep (std::move (step));
367+ program_builder.ExitSubexpression (&elem1);
368+
369+ // 2
370+ program_builder.EnterSubexpression (&elem2);
371+ ASSERT_OK_AND_ASSIGN (step, CreateConstValueStep (cel::IntValue (3L ), 3 ));
372+ program_builder.AddStep (std::move (step));
373+ program_builder.ExitSubexpression (&elem2);
374+
375+ // 3
376+ program_builder.EnterSubexpression (&elem2);
377+ ASSERT_OK_AND_ASSIGN (step, CreateConstValueStep (cel::IntValue (4L ), 4 ));
378+ program_builder.AddStep (std::move (step));
379+ program_builder.ExitSubexpression (&elem2);
380+
381+ // 4
382+ program_builder.EnterSubexpression (&elem2);
383+ ASSERT_OK_AND_ASSIGN (step, CreateConstValueStep (cel::IntValue (5L ), 5 ));
384+ program_builder.AddStep (std::move (step));
385+ program_builder.ExitSubexpression (&elem2);
386+
387+ // createlist
388+ ASSERT_OK_AND_ASSIGN (step, CreateCreateListStep (create_list.list_expr (), 6 ));
389+ program_builder.AddStep (std::move (step));
390+ program_builder.ExitSubexpression (&create_list);
391+
392+ std::shared_ptr<google::protobuf::Arena> arena;
393+ PlannerContext context (env_, resolver_, options_,
394+ type_registry_.GetComposedTypeProvider (),
395+ issue_collector_, program_builder, arena);
396+
397+ ProgramOptimizerFactory constant_folder_factory =
398+ CreateConstantFoldingOptimizer ();
399+
400+ // Act
401+ // Issue the visitation calls.
402+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<ProgramOptimizer> constant_folder,
403+ constant_folder_factory (context, ast_impl));
404+ ASSERT_THAT (constant_folder->OnPreVisit (context, create_list), IsOk ());
405+ ASSERT_THAT (constant_folder->OnPreVisit (context, elem0), IsOk ());
406+ ASSERT_THAT (constant_folder->OnPostVisit (context, elem0), IsOk ());
407+ ASSERT_THAT (constant_folder->OnPreVisit (context, elem1), IsOk ());
408+ ASSERT_THAT (constant_folder->OnPostVisit (context, elem1), IsOk ());
409+ ASSERT_THAT (constant_folder->OnPreVisit (context, elem2), IsOk ());
410+ ASSERT_THAT (constant_folder->OnPostVisit (context, elem2), IsOk ());
411+ ASSERT_THAT (constant_folder->OnPreVisit (context, elem3), IsOk ());
412+ ASSERT_THAT (constant_folder->OnPostVisit (context, elem3), IsOk ());
413+ ASSERT_THAT (constant_folder->OnPreVisit (context, elem4), IsOk ());
414+ ASSERT_THAT (constant_folder->OnPostVisit (context, elem4), IsOk ());
415+ ASSERT_THAT (constant_folder->OnPostVisit (context, create_list), IsOk ());
416+
417+ // Assert
418+ // Single constant value for the two element list.
419+ ExecutionPath path = std::move (program_builder).FlattenMain ();
420+ EXPECT_THAT (path, SizeIs (1 ));
421+ }
422+
338423TEST_F (UpdatedConstantFoldingTest, CreatesMap) {
339424 // Arrange
340425 ASSERT_OK_AND_ASSIGN (std::unique_ptr<cel::Ast> ast, ParseFromCel (" {1: 2}" ));
0 commit comments