@@ -465,6 +465,51 @@ TEST(AstCrawlerTest, CheckExprHandlers) {
465465 AstTraverse (&expr, &source_info, &handler);
466466}
467467
468+ TEST (AstTraversal, Interrupt) {
469+ SourceInfo source_info;
470+ MockAstVisitor handler;
471+
472+ Expr expr;
473+ auto * select_expr = expr.mutable_select_expr ();
474+ auto * operand = select_expr->mutable_operand ();
475+ auto * ident_expr = operand->mutable_ident_expr ();
476+
477+ testing::InSequence seq;
478+
479+ auto traversal = AstTraversal::Create (&expr, &source_info);
480+
481+ EXPECT_CALL (handler, PreVisitExpr (_, _)).Times (2 );
482+
483+ EXPECT_CALL (handler, PostVisitIdent (ident_expr, operand, _)).Times (1 );
484+ EXPECT_CALL (handler, PostVisitSelect (select_expr, &expr, _)).Times (0 );
485+
486+ EXPECT_TRUE (traversal.Step (&handler));
487+ EXPECT_TRUE (traversal.Step (&handler));
488+ EXPECT_TRUE (traversal.Step (&handler));
489+
490+ EXPECT_FALSE (traversal.IsDone ());
491+ }
492+
493+ TEST (AstTraversal, NoInterrupt) {
494+ SourceInfo source_info;
495+ MockAstVisitor handler;
496+
497+ Expr expr;
498+ auto * select_expr = expr.mutable_select_expr ();
499+ auto * operand = select_expr->mutable_operand ();
500+ auto * ident_expr = operand->mutable_ident_expr ();
501+
502+ testing::InSequence seq;
503+
504+ auto traversal = AstTraversal::Create (&expr, &source_info);
505+
506+ EXPECT_CALL (handler, PostVisitIdent (ident_expr, operand, _)).Times (1 );
507+ EXPECT_CALL (handler, PostVisitSelect (select_expr, &expr, _)).Times (1 );
508+
509+ while (traversal.Step (&handler)) continue ;
510+ EXPECT_TRUE (traversal.IsDone ());
511+ }
512+
468513} // namespace
469514
470515} // namespace google::api::expr::runtime
0 commit comments