@@ -23,6 +23,8 @@ import (
23
23
"google.golang.org/protobuf/proto"
24
24
25
25
"github.com/google/cel-go/checker/decls"
26
+ celast "github.com/google/cel-go/common/ast"
27
+ "github.com/google/cel-go/common/operators"
26
28
"github.com/google/cel-go/common/types"
27
29
28
30
proto3pb "github.com/google/cel-go/test/proto3pb"
@@ -145,6 +147,52 @@ func TestAstToString(t *testing.T) {
145
147
}
146
148
}
147
149
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
+
148
196
func TestAstToStringNil (t * testing.T ) {
149
197
expr , err := AstToString (nil )
150
198
if err == nil || ! strings .Contains (err .Error (), "unsupported expr" ) {
0 commit comments