123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- package exprhelpers
- import (
- "sort"
- "testing"
- "github.com/antonmedv/expr"
- log "github.com/sirupsen/logrus"
- )
- func TestVisitorBuild(t *testing.T) {
- tests := []struct {
- name string
- expr string
- want []string
- env map[string]interface{}
- }{
- {
- name: "simple",
- expr: "evt.X",
- want: []string{"evt.X"},
- env: map[string]interface{}{
- "evt": map[string]interface{}{
- "X": 1,
- },
- },
- },
- {
- name: "two vars",
- expr: "evt.X && evt.Y",
- want: []string{"evt.X", "evt.Y"},
- env: map[string]interface{}{
- "evt": map[string]interface{}{
- "X": 1,
- "Y": 2,
- },
- },
- },
- {
- name: "in",
- expr: "evt.X in [1,2,3]",
- want: []string{"evt.X"},
- env: map[string]interface{}{
- "evt": map[string]interface{}{
- "X": 1,
- },
- },
- },
- {
- name: "in complex",
- expr: "evt.X in [1,2,3] && evt.Y in [1,2,3] || evt.Z in [1,2,3]",
- want: []string{"evt.X", "evt.Y", "evt.Z"},
- env: map[string]interface{}{
- "evt": map[string]interface{}{
- "X": 1,
- "Y": 2,
- "Z": 3,
- },
- },
- },
- {
- name: "function call",
- expr: "Foo(evt.X, 'ads')",
- want: []string{"evt.X"},
- env: map[string]interface{}{
- "evt": map[string]interface{}{
- "X": 1,
- },
- "Foo": func(x int, y string) int {
- return x
- },
- },
- },
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- v := &visitor{logger: log.NewEntry(log.New())}
- ret, err := v.Build(tt.expr, expr.Env(tt.env))
- if err != nil {
- t.Errorf("visitor.Build() error = %v", err)
- return
- }
- if len(ret.expression) != len(tt.want) {
- t.Errorf("visitor.Build() = %v, want %v", ret.expression, tt.want)
- }
- //Sort both slices as the order is not guaranteed ??
- sort.Slice(tt.want, func(i, j int) bool {
- return tt.want[i] < tt.want[j]
- })
- sort.Slice(ret.expression, func(i, j int) bool {
- return ret.expression[i].Str < ret.expression[j].Str
- })
- for idx, v := range ret.expression {
- if v.Str != tt.want[idx] {
- t.Errorf("visitor.Build() = %v, want %v", v.Str, tt.want[idx])
- }
- }
- })
- }
- }
|