sq/libsq/ast/walker_test.go

56 lines
1.2 KiB
Go
Raw Normal View History

2016-10-17 07:14:01 +03:00
package ast
import (
"testing"
"github.com/stretchr/testify/assert"
2020-08-06 20:58:47 +03:00
"github.com/neilotoole/lg"
"github.com/neilotoole/lg/testlg"
2016-10-17 07:14:01 +03:00
)
func TestWalker(t *testing.T) {
2020-08-06 20:58:47 +03:00
log := testlg.New(t).Strict(true)
2016-10-17 07:14:01 +03:00
// `@mydb1 | .user, .address | join(.uid == .uid) | .uid, .username, .country`
2020-08-06 20:58:47 +03:00
p := getSLQParser(fixtJoinQuery1)
2016-10-17 07:14:01 +03:00
query := p.Query()
2020-08-06 20:58:47 +03:00
ast, err := buildAST(log, query)
2016-10-17 07:14:01 +03:00
assert.Nil(t, err)
assert.NotNil(t, ast)
2020-08-06 20:58:47 +03:00
walker := NewWalker(log, ast)
2016-10-17 07:14:01 +03:00
count := 0
2020-08-06 20:58:47 +03:00
visitor := func(log lg.Log, w *Walker, node Node) error {
2016-10-17 07:14:01 +03:00
count++
return w.visitChildren(node)
}
2020-08-06 20:58:47 +03:00
walker.AddVisitor(typeJoin, visitor)
2016-10-17 07:14:01 +03:00
err = walker.Walk()
assert.Nil(t, err)
assert.Equal(t, 1, count)
// test multiple visitors on the same node type
2020-08-06 20:58:47 +03:00
walker = NewWalker(log, ast)
2016-10-17 07:14:01 +03:00
countA := 0
2020-08-06 20:58:47 +03:00
visitorA := func(log lg.Log, w *Walker, node Node) error {
2016-10-17 07:14:01 +03:00
countA++
return w.visitChildren(node)
}
countB := 0
2020-08-06 20:58:47 +03:00
visitorB := func(log lg.Log, w *Walker, node Node) error {
2016-10-17 07:14:01 +03:00
countB++
return w.visitChildren(node)
}
2020-08-06 20:58:47 +03:00
walker.AddVisitor(typeTblSelector, visitorA)
walker.AddVisitor(typeColSelector, visitorB)
2016-10-17 07:14:01 +03:00
err = walker.Walk()
assert.Nil(t, err)
assert.Equal(t, 2, countA)
assert.Equal(t, 5, countB)
}