@@ -23,6 +23,8 @@ import (
2323 "google.golang.org/protobuf/proto"
2424
2525 "github.com/google/cel-go/checker/decls"
26+ celast "github.com/google/cel-go/common/ast"
27+ "github.com/google/cel-go/common/operators"
2628 "github.com/google/cel-go/common/types"
2729
2830 proto3pb "github.com/google/cel-go/test/proto3pb"
@@ -145,6 +147,52 @@ func TestAstToString(t *testing.T) {
145147 }
146148}
147149
150+ func TestExprToString (t * testing.T ) {
151+ stdEnv , err := NewEnv (EnableMacroCallTracking ())
152+ if err != nil {
153+ t .Fatalf ("NewEnv() failed: %v" , err )
154+ }
155+ in := "[a, b].filter(i, (i > 0) ? (-i + 4) : i)"
156+ ast , iss := stdEnv .Parse (in )
157+ if iss .Err () != nil {
158+ t .Fatalf ("stdEnv.Parse(%q) failed: %v" , in , iss .Err ())
159+ }
160+ expr , err := ExprToString (ast .NativeRep ().Expr (), ast .NativeRep ().SourceInfo ())
161+ if err != nil {
162+ t .Fatalf ("ExprToString(ast) failed: %v" , err )
163+ }
164+ if expr != in {
165+ t .Errorf ("got %v, wanted %v" , expr , in )
166+ }
167+
168+ // Test sub-expression unparsing.
169+ navExpr := celast .NavigateAST (ast .NativeRep ())
170+ condExpr := celast .MatchDescendants (navExpr , celast .FunctionMatcher (operators .Conditional ))[0 ]
171+ want := `(i > 0) ? (-i + 4) : i`
172+ expr , err = ExprToString (condExpr , ast .NativeRep ().SourceInfo ())
173+ if err != nil {
174+ t .Fatalf ("ExprToString(ast) failed: %v" , err )
175+ }
176+ if expr != want {
177+ t .Errorf ("got %v, wanted %v" , expr , want )
178+ }
179+
180+ // Also passes with a nil source info, but only because the sub-expr doesn't contain macro calls.
181+ expr , err = ExprToString (condExpr , nil )
182+ if err != nil {
183+ t .Fatalf ("ExprToString(ast) failed: %v" , err )
184+ }
185+ if expr != want {
186+ t .Errorf ("got %v, wanted %v" , expr , want )
187+ }
188+
189+ // Fails do to missing macro information.
190+ _ , err = ExprToString (ast .NativeRep ().Expr (), nil )
191+ if err == nil {
192+ t .Error ("ExprToString() succeeded, wanted error" )
193+ }
194+ }
195+
148196func TestAstToStringNil (t * testing.T ) {
149197 expr , err := AstToString (nil )
150198 if err == nil || ! strings .Contains (err .Error (), "unsupported expr" ) {
0 commit comments