fix: return an error when the argument count is wrong
Closes forgejo/runner#307
This commit is contained in:
parent
8084844bf1
commit
b1b9df5ef4
3 changed files with 57 additions and 1 deletions
|
@ -44,5 +44,5 @@ jobs:
|
||||||
- name: build without docker
|
- name: build without docker
|
||||||
run: go build -tags WITHOUT_DOCKER -v ./...
|
run: go build -tags WITHOUT_DOCKER -v ./...
|
||||||
- name: test
|
- name: test
|
||||||
run: go test -v ./pkg/jobparser ./pkg/model
|
run: go test -v ./pkg/jobparser ./pkg/model ./pkg/exprparser
|
||||||
# TODO test more packages
|
# TODO test more packages
|
||||||
|
|
|
@ -43,6 +43,9 @@ func TestFunctionContains(t *testing.T) {
|
||||||
assert.Equal(t, tt.expected, output)
|
assert.Equal(t, tt.expected, output)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err := NewInterpeter(env, Config{}).Evaluate("contains('one')", DefaultStatusCheckNone)
|
||||||
|
assert.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFunctionStartsWith(t *testing.T) {
|
func TestFunctionStartsWith(t *testing.T) {
|
||||||
|
@ -72,6 +75,9 @@ func TestFunctionStartsWith(t *testing.T) {
|
||||||
assert.Equal(t, tt.expected, output)
|
assert.Equal(t, tt.expected, output)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err := NewInterpeter(env, Config{}).Evaluate("startsWith('one')", DefaultStatusCheckNone)
|
||||||
|
assert.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFunctionEndsWith(t *testing.T) {
|
func TestFunctionEndsWith(t *testing.T) {
|
||||||
|
@ -101,6 +107,9 @@ func TestFunctionEndsWith(t *testing.T) {
|
||||||
assert.Equal(t, tt.expected, output)
|
assert.Equal(t, tt.expected, output)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err := NewInterpeter(env, Config{}).Evaluate("endsWith('one')", DefaultStatusCheckNone)
|
||||||
|
assert.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFunctionJoin(t *testing.T) {
|
func TestFunctionJoin(t *testing.T) {
|
||||||
|
@ -128,6 +137,9 @@ func TestFunctionJoin(t *testing.T) {
|
||||||
assert.Equal(t, tt.expected, output)
|
assert.Equal(t, tt.expected, output)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err := NewInterpeter(env, Config{}).Evaluate("join()", DefaultStatusCheckNone)
|
||||||
|
assert.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFunctionToJSON(t *testing.T) {
|
func TestFunctionToJSON(t *testing.T) {
|
||||||
|
@ -154,6 +166,9 @@ func TestFunctionToJSON(t *testing.T) {
|
||||||
assert.Equal(t, tt.expected, output)
|
assert.Equal(t, tt.expected, output)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err := NewInterpeter(env, Config{}).Evaluate("tojson()", DefaultStatusCheckNone)
|
||||||
|
assert.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFunctionFromJSON(t *testing.T) {
|
func TestFunctionFromJSON(t *testing.T) {
|
||||||
|
@ -177,6 +192,9 @@ func TestFunctionFromJSON(t *testing.T) {
|
||||||
assert.Equal(t, tt.expected, output)
|
assert.Equal(t, tt.expected, output)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err := NewInterpeter(env, Config{}).Evaluate("fromjson()", DefaultStatusCheckNone)
|
||||||
|
assert.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFunctionHashFiles(t *testing.T) {
|
func TestFunctionHashFiles(t *testing.T) {
|
||||||
|
@ -248,4 +266,7 @@ func TestFunctionFormat(t *testing.T) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err := NewInterpeter(env, Config{}).Evaluate("format()", DefaultStatusCheckNone)
|
||||||
|
assert.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -593,23 +593,58 @@ func (impl *interperterImpl) evaluateFuncCall(funcCallNode *actionlint.FuncCallN
|
||||||
args = append(args, reflect.ValueOf(value))
|
args = append(args, reflect.ValueOf(value))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
argCountCheck := func(argCount int) error {
|
||||||
|
if len(args) != argCount {
|
||||||
|
return fmt.Errorf("'%s' expected %d arguments but got %d instead", funcCallNode.Callee, argCount, len(args))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
argAtLeastCheck := func(atLeast int) error {
|
||||||
|
if len(args) < atLeast {
|
||||||
|
return fmt.Errorf("'%s' expected at least %d arguments but got %d instead", funcCallNode.Callee, atLeast, len(args))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
switch strings.ToLower(funcCallNode.Callee) {
|
switch strings.ToLower(funcCallNode.Callee) {
|
||||||
case "contains":
|
case "contains":
|
||||||
|
if err := argCountCheck(2); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return impl.contains(args[0], args[1])
|
return impl.contains(args[0], args[1])
|
||||||
case "startswith":
|
case "startswith":
|
||||||
|
if err := argCountCheck(2); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return impl.startsWith(args[0], args[1])
|
return impl.startsWith(args[0], args[1])
|
||||||
case "endswith":
|
case "endswith":
|
||||||
|
if err := argCountCheck(2); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return impl.endsWith(args[0], args[1])
|
return impl.endsWith(args[0], args[1])
|
||||||
case "format":
|
case "format":
|
||||||
|
if err := argAtLeastCheck(1); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return impl.format(args[0], args[1:]...)
|
return impl.format(args[0], args[1:]...)
|
||||||
case "join":
|
case "join":
|
||||||
|
if err := argAtLeastCheck(1); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
if len(args) == 1 {
|
if len(args) == 1 {
|
||||||
return impl.join(args[0], reflect.ValueOf(","))
|
return impl.join(args[0], reflect.ValueOf(","))
|
||||||
}
|
}
|
||||||
return impl.join(args[0], args[1])
|
return impl.join(args[0], args[1])
|
||||||
case "tojson":
|
case "tojson":
|
||||||
|
if err := argCountCheck(1); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return impl.toJSON(args[0])
|
return impl.toJSON(args[0])
|
||||||
case "fromjson":
|
case "fromjson":
|
||||||
|
if err := argCountCheck(1); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return impl.fromJSON(args[0])
|
return impl.fromJSON(args[0])
|
||||||
case "hashfiles":
|
case "hashfiles":
|
||||||
if impl.env.HashFiles != nil {
|
if impl.env.HashFiles != nil {
|
||||||
|
|
Loading…
Reference in a new issue