mirror of
https://github.com/chaisql/chai.git
synced 2025-11-03 01:33:31 +08:00
Add functions packages support (#419)
* Add packaged functions support * Add tests for math.floor func * Export FunctionsTable * Extract func stuff into its own package * Rename stuff * Fix tests * Move doc package to cmd/genji * Adjust naming, typos
This commit is contained in:
committed by
GitHub
parent
c0861ed2c5
commit
e556fc3048
59
internal/expr/functions/scalar_definition_test.go
Normal file
59
internal/expr/functions/scalar_definition_test.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package functions_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/genjidb/genji/document"
|
||||
"github.com/genjidb/genji/internal/environment"
|
||||
"github.com/genjidb/genji/internal/expr"
|
||||
"github.com/genjidb/genji/internal/expr/functions"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestScalarFunctionDef(t *testing.T) {
|
||||
def := functions.NewScalarDefinition(
|
||||
"foo",
|
||||
3,
|
||||
func(args ...document.Value) (document.Value, error) {
|
||||
arg1 := args[0].V.(int64)
|
||||
arg2 := args[1].V.(int64)
|
||||
arg3 := args[2].V.(int64)
|
||||
|
||||
return document.NewIntegerValue(arg1 + arg2 + arg3), nil
|
||||
},
|
||||
)
|
||||
|
||||
t.Run("Name()", func(t *testing.T) {
|
||||
require.Equal(t, "foo", def.Name())
|
||||
})
|
||||
|
||||
t.Run("Arity()", func(t *testing.T) {
|
||||
require.Equal(t, 3, def.Arity())
|
||||
})
|
||||
|
||||
t.Run("String()", func(t *testing.T) {
|
||||
require.Equal(t, "foo(arg1, arg2, arg3)", def.String())
|
||||
})
|
||||
|
||||
t.Run("Function()", func(t *testing.T) {
|
||||
fb := document.NewFieldBuffer()
|
||||
fb = fb.Add("a", document.NewIntegerValue(2))
|
||||
env := environment.New(fb)
|
||||
expr1 := expr.Add(expr.LiteralValue(document.NewIntegerValue(1)), expr.LiteralValue(document.NewIntegerValue(0)))
|
||||
expr2 := expr.Path(document.NewPath("a"))
|
||||
expr3 := expr.Div(expr.LiteralValue(document.NewIntegerValue(6)), expr.LiteralValue(document.NewIntegerValue(2)))
|
||||
|
||||
t.Run("OK", func(t *testing.T) {
|
||||
fexpr, err := def.Function(expr1, expr2, expr3)
|
||||
require.NoError(t, err)
|
||||
v, err := fexpr.Eval(env)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, document.NewIntegerValue(1+2+3), v)
|
||||
})
|
||||
|
||||
t.Run("NOK", func(t *testing.T) {
|
||||
_, err := def.Function(expr1, expr2)
|
||||
require.Error(t, err)
|
||||
})
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user