godog/internal/formatters/undefined_snippets_gen.go
Softonik eb165952fc
Некоторые проверки провалились
test / test (1.16.x) (push) Has been cancelled
test / test (1.17.x) (push) Has been cancelled
Вывод генерённых функций - со скобками на разных строках
2024-06-17 14:18:34 +03:00

125 строки
2,8 КиБ
Go

package formatters
import (
"fmt"
"reflect"
"regexp"
"strings"
"text/template"
"github.com/cucumber/messages-go/v16"
)
// some snippet formatting regexps
var snippetExprCleanup = regexp.MustCompile("([\\/\\[\\]\\(\\)\\\\^\\$\\.\\|\\?\\*\\+\\'])")
var snippetExprQuoted = regexp.MustCompile("(\\W|^)\"(?:[^\"]*)\"(\\W|$)")
var snippetExprAnyParam = regexp.MustCompile("(\\W|^)((\\d+)|\"(?:[^\"]*)\")(\\W|$)")
var snippetMethodName = regexp.MustCompile("[^a-zA-Zа-яА-ЯёЁ\\_\\ ]")
var snippetNumbers = regexp.MustCompile("(\\d+)")
var snippetHelperFuncs = template.FuncMap{
"backticked": func(s string) string {
return "`" + s + "`"
},
}
var undefinedSnippetsTpl = template.Must(template.New("snippets").Funcs(snippetHelperFuncs).Parse(`
func InitializeScenario(ctx *godog.ScenarioContext) {}
// ---
{{ range . }}func {{ .Method }}({{ .Args }}) {
}
{{end}}{{ range . }}
ctx.Step({{ backticked .Expr }}, {{ .Method }}){{end}}
`))
type undefinedSnippet struct {
Method string
Expr string
argument *messages.PickleStepArgument
argument_names map[int]string
}
func (s undefinedSnippet) Args() (ret string) {
var (
args []string
pos int
breakLoop bool
)
for !breakLoop {
part := s.Expr[pos:]
ipos := strings.Index(part, "(\\d+)")
spos := strings.Index(part, "\"([^\"]*)\"")
switch {
case spos == -1 && ipos == -1:
breakLoop = true
case spos == -1:
pos += ipos + len("(\\d+)")
args = append(args, reflect.Int.String())
case ipos == -1:
pos += spos + len("\"([^\"]*)\"")
args = append(args, reflect.String.String())
case ipos < spos:
pos += ipos + len("(\\d+)")
args = append(args, reflect.Int.String())
case spos < ipos:
pos += spos + len("\"([^\"]*)\"")
args = append(args, reflect.String.String())
}
}
if s.argument != nil {
if s.argument.DocString != nil {
args = append(args, "*godog.DocString")
}
if s.argument.DataTable != nil {
args = append(args, "*godog.Table")
}
}
var last string
// fmt.Printf(" \tArgs: names: %v\n", s.argument_names)
arg_ind := 0
for i, arg := range args {
name, ok := s.argument_names[i]
if last == "" || last == arg {
if ok {
ret += fmt.Sprintf("%v, ", name)
} else {
arg_ind++
ret += fmt.Sprintf("arg%d, ", arg_ind)
}
} else {
if ok {
ret = strings.TrimRight(ret, ", ") + fmt.Sprintf(" %s, %v, ", last, name)
} else {
arg_ind++
ret = strings.TrimRight(ret, ", ") + fmt.Sprintf(" %s, arg%d, ", last, arg_ind)
}
}
last = arg
}
return strings.TrimSpace(strings.TrimRight(ret, ", ") + " " + last)
}
type snippetSortByMethod []undefinedSnippet
func (s snippetSortByMethod) Len() int {
return len(s)
}
func (s snippetSortByMethod) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func (s snippetSortByMethod) Less(i, j int) bool {
return s[i].Method < s[j].Method
}