Skip to content

Commit 6fa6538

Browse files
jnthntatumcopybara-github
authored andcommitted
Add additional test case for constant folding.
PiperOrigin-RevId: 742297957
1 parent 536698b commit 6fa6538

File tree

2 files changed

+87
-1
lines changed

2 files changed

+87
-1
lines changed

eval/compiler/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ cc_test(
370370
"//runtime/internal:runtime_env_testing",
371371
"@com_google_absl//absl/base:nullability",
372372
"@com_google_absl//absl/status",
373+
"@com_google_absl//absl/status:status_matchers",
373374
"@com_google_absl//absl/status:statusor",
374375
"@com_google_absl//absl/strings",
375376
"@com_google_cel_spec//proto/cel/expr:syntax_cc_proto",

eval/compiler/constant_folding_test.cc

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
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

5051
namespace {
5152

53+
using ::absl_testing::IsOk;
5254
using ::absl_testing::StatusIs;
5355
using ::cel::Expr;
5456
using ::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+
338423
TEST_F(UpdatedConstantFoldingTest, CreatesMap) {
339424
// Arrange
340425
ASSERT_OK_AND_ASSIGN(std::unique_ptr<cel::Ast> ast, ParseFromCel("{1: 2}"));

0 commit comments

Comments
 (0)