Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions builtin/builtin.go
Original file line number Diff line number Diff line change
Expand Up @@ -996,6 +996,15 @@ var Builtins = []*Function{
for i, v := range in {
array[i] = v
}
default:
v := reflect.ValueOf(args[0])
if v.Kind() != reflect.Slice && v.Kind() != reflect.Array {
return nil, 0, fmt.Errorf("cannot sort %s", v.Kind())
}
array = make([]any, v.Len())
for i := 0; i < v.Len(); i++ {
array[i] = v.Index(i).Interface()
}
}

var desc bool
Expand Down
24 changes: 24 additions & 0 deletions builtin/builtin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -653,6 +653,30 @@ func TestBuiltin_sort_i64(t *testing.T) {
assert.Equal(t, []any{int64(1), int64(1), int64(1)}, out)
}

func TestBuiltin_sort_non_standard_slice(t *testing.T) {
tests := []struct {
input string
env any
want any
}{
{`sort(x)`, map[string]any{"x": []int64{3, 1, 2}}, []any{int64(1), int64(2), int64(3)}},
{`sort(x)`, map[string]any{"x": []uint{3, 1, 2}}, []any{uint(1), uint(2), uint(3)}},
{`sort(x, "desc")`, map[string]any{"x": []int32{1, 3, 2}}, []any{int32(3), int32(2), int32(1)}},
}

for _, test := range tests {
t.Run(test.input, func(t *testing.T) {
out, err := expr.Eval(test.input, test.env)
require.NoError(t, err)
assert.Equal(t, test.want, out)
})
}

_, err := expr.Eval(`sort(x)`, map[string]any{"x": 42})
require.Error(t, err)
assert.Contains(t, err.Error(), "cannot sort int")
}

func TestBuiltin_bitOpsFunc(t *testing.T) {
tests := []struct {
input string
Expand Down
Loading