visitor_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package exprhelpers
  2. import (
  3. "sort"
  4. "testing"
  5. "github.com/antonmedv/expr"
  6. log "github.com/sirupsen/logrus"
  7. )
  8. func TestVisitorBuild(t *testing.T) {
  9. tests := []struct {
  10. name string
  11. expr string
  12. want []string
  13. env map[string]interface{}
  14. }{
  15. {
  16. name: "simple",
  17. expr: "evt.X",
  18. want: []string{"evt.X"},
  19. env: map[string]interface{}{
  20. "evt": map[string]interface{}{
  21. "X": 1,
  22. },
  23. },
  24. },
  25. {
  26. name: "two vars",
  27. expr: "evt.X && evt.Y",
  28. want: []string{"evt.X", "evt.Y"},
  29. env: map[string]interface{}{
  30. "evt": map[string]interface{}{
  31. "X": 1,
  32. "Y": 2,
  33. },
  34. },
  35. },
  36. {
  37. name: "in",
  38. expr: "evt.X in [1,2,3]",
  39. want: []string{"evt.X"},
  40. env: map[string]interface{}{
  41. "evt": map[string]interface{}{
  42. "X": 1,
  43. },
  44. },
  45. },
  46. {
  47. name: "in complex",
  48. expr: "evt.X in [1,2,3] && evt.Y in [1,2,3] || evt.Z in [1,2,3]",
  49. want: []string{"evt.X", "evt.Y", "evt.Z"},
  50. env: map[string]interface{}{
  51. "evt": map[string]interface{}{
  52. "X": 1,
  53. "Y": 2,
  54. "Z": 3,
  55. },
  56. },
  57. },
  58. {
  59. name: "function call",
  60. expr: "Foo(evt.X, 'ads')",
  61. want: []string{"evt.X"},
  62. env: map[string]interface{}{
  63. "evt": map[string]interface{}{
  64. "X": 1,
  65. },
  66. "Foo": func(x int, y string) int {
  67. return x
  68. },
  69. },
  70. },
  71. }
  72. for _, tt := range tests {
  73. t.Run(tt.name, func(t *testing.T) {
  74. v := &visitor{logger: log.NewEntry(log.New())}
  75. ret, err := v.Build(tt.expr, expr.Env(tt.env))
  76. if err != nil {
  77. t.Errorf("visitor.Build() error = %v", err)
  78. return
  79. }
  80. if len(ret.expression) != len(tt.want) {
  81. t.Errorf("visitor.Build() = %v, want %v", ret.expression, tt.want)
  82. }
  83. //Sort both slices as the order is not guaranteed ??
  84. sort.Slice(tt.want, func(i, j int) bool {
  85. return tt.want[i] < tt.want[j]
  86. })
  87. sort.Slice(ret.expression, func(i, j int) bool {
  88. return ret.expression[i].Str < ret.expression[j].Str
  89. })
  90. for idx, v := range ret.expression {
  91. if v.Str != tt.want[idx] {
  92. t.Errorf("visitor.Build() = %v, want %v", v.Str, tt.want[idx])
  93. }
  94. }
  95. })
  96. }
  97. }