Some checks failed
SonarQube / SonarQube (push) Failing after 5m28s
E2e test on main branch push / server and client test (map[name:admin port:8080]) (push) Failing after 3m33s
Server and lib tests / Library test (js) (push) Failing after 1m36s
Server and lib tests / Library test (vue) (push) Successful in 2m24s
Server and lib tests / Web client test (admin) (push) Successful in 2m52s
Server and lib tests / Web client test (compose) (push) Successful in 3m23s
Server and lib tests / Web client test (discovery) (push) Successful in 2m49s
Server and lib tests / Web client test (one) (push) Successful in 2m52s
Server and lib tests / Web client test (privacy) (push) Successful in 2m44s
Server and lib tests / Web client test (reporter) (push) Successful in 2m56s
Server and lib tests / Web client test (workflow) (push) Successful in 3m0s
Server and lib tests / Server tests (push) Failing after 4m55s
E2e test on main branch push / notify-failure (push) Failing after 9s
Server and lib tests / Send matrix testing notification (push) Successful in 2s
Mark stale issues and pull requests / stale (push) Successful in 40s
111 lines
2.5 KiB
Go
111 lines
2.5 KiB
Go
package expr
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func Example_simpleExpression() {
|
|
eval(`40 + 2`, nil)
|
|
// output:
|
|
// 42
|
|
}
|
|
|
|
func TestParser(t *testing.T) {
|
|
var (
|
|
req = require.New(t)
|
|
ctx = context.Background()
|
|
p = Parser()
|
|
e, err = p.NewEvaluable("0 == 0")
|
|
|
|
result bool
|
|
)
|
|
|
|
req.NoError(err)
|
|
|
|
result, err = e.EvalBool(ctx, nil)
|
|
req.NoError(err)
|
|
req.True(result)
|
|
}
|
|
|
|
func TestGvalParser(t *testing.T) {
|
|
var (
|
|
req = require.New(t)
|
|
ctx = context.Background()
|
|
p = NewGvalParser()
|
|
vv, err = NewVars(map[string]interface{}{
|
|
"vars": &Vars{},
|
|
"key": "foo",
|
|
"value": Must(NewString("foo")),
|
|
})
|
|
result interface{}
|
|
)
|
|
req.NoError(err)
|
|
|
|
pp, err := p.Parse("toJSON(set(vars, key, value))")
|
|
req.NoError(err)
|
|
|
|
result, err = pp.Eval(ctx, vv)
|
|
req.NoError(err)
|
|
req.Equal("{\"foo\":{\"@value\":\"foo\",\"@type\":\"String\"}}", result)
|
|
}
|
|
|
|
// goos: darwin
|
|
// goarch: arm64
|
|
// pkg: github.com/cortezaproject/corteza/server/pkg/expr
|
|
// cpu: Apple M3 Pro
|
|
// BenchmarkParsing-12 295779 4052 ns/op 4952 B/op 133 allocs/op
|
|
func BenchmarkParsing(b *testing.B) {
|
|
expr := `(1 + length(trim(" asdf asdf asdf ")) * 71 + min(3, 7777777)) + (1 + length(trim(" asdf asdf asdf ")) * 71 + min(3, 7777777))`
|
|
p := NewGvalParser()
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
e, err := p.Parse(expr)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
_ = e
|
|
}
|
|
}
|
|
|
|
// goos: darwin
|
|
// goarch: arm64
|
|
// pkg: github.com/cortezaproject/corteza/server/pkg/expr
|
|
// cpu: Apple M3 Pro
|
|
// BenchmarkEval_short-12 886696 1344 ns/op 544 B/op 14 allocs/op
|
|
// BenchmarkEval_med-12 299616 4020 ns/op 1280 B/op 36 allocs/op
|
|
// BenchmarkEval_long-12 146112 7878 ns/op 2488 B/op 71 allocs/op
|
|
func BenchmarkEval_short(b *testing.B) {
|
|
expr := `min(3, 7777777)`
|
|
benchmarkEval(b, expr)
|
|
}
|
|
|
|
func BenchmarkEval_med(b *testing.B) {
|
|
expr := `1 + length(trim(" asdf asdf asdf ")) * 71 + min(3, 7777777)`
|
|
benchmarkEval(b, expr)
|
|
}
|
|
|
|
func BenchmarkEval_long(b *testing.B) {
|
|
expr := `(1 + length(trim(" asdf asdf asdf ")) * 71 + min(3, 7777777)) + (1 + length(trim(" asdf asdf asdf ")) * 71 + min(3, 7777777))`
|
|
benchmarkEval(b, expr)
|
|
}
|
|
|
|
func benchmarkEval(b *testing.B, expr string) {
|
|
e, err := NewGvalParser().Parse(expr)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
ctx := context.Background()
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
_, err = e.Eval(ctx, EmptyVars())
|
|
// _ = err
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
}
|