4949import dev .cel .expr .conformance .proto3 .TestAllTypes .NestedMessage ;
5050import dev .cel .parser .CelMacro ;
5151import dev .cel .parser .CelStandardMacro ;
52+ import dev .cel .runtime .CelAttributePattern ;
5253import dev .cel .runtime .CelEvaluationException ;
5354import dev .cel .runtime .CelFunctionBinding ;
5455import dev .cel .runtime .CelRuntime ;
5556import dev .cel .runtime .InterpreterUtil ;
57+ import dev .cel .runtime .PartialVars ;
5658import java .time .Duration ;
5759import java .time .Instant ;
5860import java .util .List ;
@@ -897,14 +899,12 @@ public void optionalIndex_onMap_returnsOptionalValue() throws Exception {
897899 @ TestParameters ("{source: '{?x: x}'}" )
898900 public void optionalIndex_onMapWithUnknownInput_returnsUnknownResult (String source )
899901 throws Exception {
900- if (testMode .equals (TestMode .PLANNER_CHECKED ) || testMode .equals (TestMode .PLANNER_PARSE_ONLY )) {
901- // TODO: Uncomment once unknowns is implemented
902- return ;
903- }
904902 Cel cel = newCelBuilder ().addVar ("x" , OptionalType .create (SimpleType .INT )).build ();
905903 CelAbstractSyntaxTree ast = compile (cel , source );
906904
907- Object result = cel .createProgram (ast ).eval ();
905+ Object result =
906+ cel .createProgram (ast )
907+ .eval (PartialVars .of (CelAttributePattern .fromQualifiedIdentifier ("x" )));
908908
909909 assertThat (InterpreterUtil .isUnknown (result )).isTrue ();
910910 }
@@ -987,18 +987,16 @@ public void optionalIndex_onOptionalList_returnsOptionalValue() throws Exception
987987
988988 @ Test
989989 public void optionalIndex_onListWithUnknownInput_returnsUnknownResult () throws Exception {
990- if (testMode .equals (TestMode .PLANNER_CHECKED ) || testMode .equals (TestMode .PLANNER_PARSE_ONLY )) {
991- // TODO: Uncomment once unknowns is implemented
992- return ;
993- }
994990 Cel cel =
995991 newCelBuilder ()
996992 .addVar ("x" , OptionalType .create (SimpleType .INT ))
997993 .setResultType (ListType .create (SimpleType .INT ))
998994 .build ();
999995 CelAbstractSyntaxTree ast = compile (cel , "[?x]" );
1000996
1001- Object result = cel .createProgram (ast ).eval ();
997+ Object result =
998+ cel .createProgram (ast )
999+ .eval (PartialVars .of (CelAttributePattern .fromQualifiedIdentifier ("x" )));
10021000
10031001 assertThat (InterpreterUtil .isUnknown (result )).isTrue ();
10041002 }
@@ -1017,6 +1015,29 @@ public void traditionalIndex_onOptionalList_returnsOptionalEmpty() throws Except
10171015 assertThat (result ).isEqualTo (Optional .empty ());
10181016 }
10191017
1018+ @ Test
1019+ public void optionalFieldSelect_fieldMarkedUnknown_returnsUnknownSet () throws Exception {
1020+ if (testMode .equals (TestMode .LEGACY_CHECKED )) {
1021+ // This case is not possible to setup for legacy runtime
1022+ return ;
1023+ }
1024+
1025+ Cel cel =
1026+ newCelBuilder ()
1027+ .addVar ("msg" , StructTypeReference .create (TestAllTypes .getDescriptor ().getFullName ()))
1028+ .build ();
1029+ CelAbstractSyntaxTree ast = compile (cel , "msg.?single_int32" );
1030+
1031+ Object result =
1032+ cel .createProgram (ast )
1033+ .eval (
1034+ PartialVars .of (
1035+ ImmutableMap .of ("msg" , TestAllTypes .newBuilder ().setSingleInt32 (42 ).build ()),
1036+ CelAttributePattern .fromQualifiedIdentifier ("msg.single_int32" )));
1037+
1038+ assertThat (InterpreterUtil .isUnknown (result )).isTrue ();
1039+ }
1040+
10201041 @ Test
10211042 // LHS
10221043 @ TestParameters ("{expression: 'optx.or(optional.of(1))'}" )
@@ -1026,18 +1047,16 @@ public void traditionalIndex_onOptionalList_returnsOptionalEmpty() throws Except
10261047 @ TestParameters ("{expression: 'optional.none().orValue(optx)'}" )
10271048 public void optionalChainedFunctions_lhsIsUnknown_returnsUnknown (String expression )
10281049 throws Exception {
1029- if (testMode .equals (TestMode .PLANNER_CHECKED ) || testMode .equals (TestMode .PLANNER_PARSE_ONLY )) {
1030- // TODO: Uncomment once unknowns is implemented
1031- return ;
1032- }
10331050 Cel cel =
10341051 newCelBuilder ()
10351052 .addVar ("optx" , OptionalType .create (SimpleType .INT ))
10361053 .addVar ("x" , SimpleType .INT )
10371054 .build ();
10381055 CelAbstractSyntaxTree ast = compile (cel , expression );
10391056
1040- Object result = cel .createProgram (ast ).eval ();
1057+ Object result =
1058+ cel .createProgram (ast )
1059+ .eval (PartialVars .of (CelAttributePattern .fromQualifiedIdentifier ("optx" )));
10411060
10421061 assertThat (InterpreterUtil .isUnknown (result )).isTrue ();
10431062 }
0 commit comments