mirror of
https://gitea.com/gitea/act_runner.git
synced 2026-03-20 03:46:09 +08:00
113 lines
2.9 KiB
Go
113 lines
2.9 KiB
Go
package workflow
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
// TestLexerMultiple runs a set of expressions through the lexer and
|
|
// verifies that the produced token kinds and values match expectations.
|
|
func TestLexerMultiple(t *testing.T) {
|
|
cases := []struct {
|
|
expr string
|
|
expected []TokenKind
|
|
values []interface{} // optional, nil if not checking values
|
|
}{
|
|
{
|
|
expr: "github.event_name == 'push'",
|
|
expected: []TokenKind{
|
|
TokenKindNamedValue, // github
|
|
TokenKindDereference,
|
|
TokenKindPropertyName, // event_name
|
|
TokenKindLogicalOperator, // ==
|
|
TokenKindString, // 'push'
|
|
},
|
|
},
|
|
{
|
|
expr: "github.event_name == 'push' && github.ref == 'refs/heads/main'",
|
|
expected: []TokenKind{
|
|
TokenKindNamedValue, TokenKindDereference, TokenKindPropertyName, TokenKindLogicalOperator, TokenKindString,
|
|
TokenKindLogicalOperator, // &&
|
|
TokenKindNamedValue, TokenKindDereference, TokenKindPropertyName, TokenKindLogicalOperator, TokenKindString,
|
|
},
|
|
},
|
|
{
|
|
expr: "contains(github.ref, 'refs/heads/')",
|
|
expected: []TokenKind{
|
|
TokenKindFunction, // contains
|
|
TokenKindStartParameters,
|
|
TokenKindNamedValue, TokenKindDereference, TokenKindPropertyName, // github.ref
|
|
TokenKindSeparator,
|
|
TokenKindString,
|
|
TokenKindEndParameters,
|
|
},
|
|
},
|
|
{
|
|
expr: "matrix[0].name",
|
|
expected: []TokenKind{
|
|
TokenKindNamedValue, // matrix
|
|
TokenKindStartIndex,
|
|
TokenKindNumber,
|
|
TokenKindEndIndex,
|
|
TokenKindDereference,
|
|
TokenKindPropertyName, // name
|
|
},
|
|
},
|
|
{
|
|
expr: "github.*",
|
|
expected: []TokenKind{
|
|
TokenKindNamedValue, TokenKindDereference, TokenKindWildcard,
|
|
},
|
|
},
|
|
{
|
|
expr: "null",
|
|
expected: []TokenKind{TokenKindNull},
|
|
},
|
|
{
|
|
expr: "true",
|
|
expected: []TokenKind{TokenKindBoolean},
|
|
values: []interface{}{true},
|
|
},
|
|
{
|
|
expr: "123",
|
|
expected: []TokenKind{TokenKindNumber},
|
|
values: []interface{}{123.0},
|
|
},
|
|
{
|
|
expr: "(a && b)",
|
|
expected: []TokenKind{TokenKindStartGroup, TokenKindNamedValue, TokenKindLogicalOperator, TokenKindNamedValue, TokenKindEndGroup},
|
|
},
|
|
{
|
|
expr: "[1,2]", // Syntax Error
|
|
expected: []TokenKind{TokenKindUnexpected, TokenKindNumber, TokenKindSeparator, TokenKindNumber, TokenKindEndIndex},
|
|
},
|
|
{
|
|
expr: "'Hello i''s escaped'",
|
|
expected: []TokenKind{TokenKindString},
|
|
values: []interface{}{"Hello i's escaped"},
|
|
},
|
|
}
|
|
|
|
for _, tc := range cases {
|
|
lexer := NewLexer(tc.expr, 0)
|
|
var tokens []*Token
|
|
for {
|
|
tok := lexer.Next()
|
|
if tok == nil {
|
|
break
|
|
}
|
|
tokens = append(tokens, tok)
|
|
}
|
|
assert.Equal(t, len(tc.expected), len(tokens), "expression: %s", tc.expr)
|
|
for i, kind := range tc.expected {
|
|
assert.Equal(t, kind, tokens[i].Kind, "expr %s token %d", tc.expr, i)
|
|
}
|
|
if tc.values != nil {
|
|
for i, val := range tc.values {
|
|
assert.Equal(t, val, tokens[i].Value, "expr %s token %d value", tc.expr, i)
|
|
}
|
|
}
|
|
}
|
|
}
|