categraf/inputs/mtail/internal/runtime/compiler/ast/walk_test.go

84 lines
1.9 KiB
Go

// Copyright 2018 Google Inc. All Rights Reserved.
// This file is available under the Apache license.
package ast_test
import (
"testing"
"flashcat.cloud/categraf/inputs/mtail/internal/runtime/compiler/ast"
"flashcat.cloud/categraf/inputs/mtail/internal/runtime/compiler/parser"
"flashcat.cloud/categraf/inputs/mtail/internal/runtime/compiler/position"
"flashcat.cloud/categraf/inputs/mtail/internal/runtime/compiler/types"
"flashcat.cloud/categraf/inputs/mtail/internal/testutil"
)
type testNode struct{}
func (t testNode) Pos() *position.Position {
return &position.Position{}
}
func (t testNode) Type() types.Type {
return types.None
}
type testVisitor struct{}
func (v testVisitor) VisitBefore(n ast.Node) (ast.Visitor, ast.Node) {
return v, n
}
func (v testVisitor) VisitAfter(n ast.Node) ast.Node {
return n
}
func TestWalkPanicsOnUnknown(t *testing.T) {
defer func() {
s := recover()
if s == nil {
t.Errorf("No panic received")
}
}()
ast.Walk(testVisitor{}, testNode{})
}
type testWalker struct{}
func (t *testWalker) VisitBefore(n ast.Node) (ast.Visitor, ast.Node) {
if v, ok := n.(*ast.BinaryExpr); ok {
if v.Op == parser.DIV {
n = &ast.IntLit{I: 4}
}
}
return t, n
}
func (t *testWalker) VisitAfter(n ast.Node) ast.Node {
if v, ok := n.(*ast.BinaryExpr); ok {
if v.Op == parser.MINUS {
n = &ast.IntLit{I: 5}
}
}
return n
}
func TestAstReplacement(t *testing.T) {
var a ast.Node = &ast.BinaryExpr{
LHS: &ast.BinaryExpr{LHS: &ast.IntLit{I: 0}, RHS: &ast.IntLit{I: 1}, Op: parser.DIV},
RHS: &ast.BinaryExpr{LHS: &ast.IntLit{I: 2}, RHS: &ast.IntLit{I: 3}, Op: parser.MINUS},
Op: parser.PLUS,
}
tw := &testWalker{}
a = ast.Walk(tw, a)
expected := &ast.BinaryExpr{
LHS: &ast.IntLit{I: 4},
RHS: &ast.IntLit{I: 5},
Op: parser.PLUS,
}
if !testutil.ExpectNoDiff(t, expected, a, testutil.IgnoreUnexported(ast.BinaryExpr{})) {
s := parser.Sexp{}
t.Log("AST:\n" + s.Dump(a))
}
}