124 строки
2,8 КиБ
Go
124 строки
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
|
|
}
|