Parse contexts that have Suite interface in func definition
Этот коммит содержится в:
родитель
ed9d322492
коммит
412465f947
4 изменённых файлов: 70 добавлений и 23 удалений
45
builder.go
45
builder.go
|
@ -6,10 +6,10 @@ import (
|
||||||
"go/format"
|
"go/format"
|
||||||
"go/parser"
|
"go/parser"
|
||||||
"go/token"
|
"go/token"
|
||||||
"log"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"text/template"
|
||||||
|
|
||||||
"golang.org/x/tools/imports"
|
"golang.org/x/tools/imports"
|
||||||
)
|
)
|
||||||
|
@ -21,13 +21,20 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
godog.Run()
|
suite := &GodogSuite{
|
||||||
|
steps: make(map[*regexp.Regexp]StepHandler),
|
||||||
|
}
|
||||||
|
{{range $c := .Contexts}}
|
||||||
|
{{$c}}(suite)
|
||||||
|
{{end}}
|
||||||
|
suite.Run()
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
type builder struct {
|
type builder struct {
|
||||||
files map[string]*ast.File
|
files map[string]*ast.File
|
||||||
fset *token.FileSet
|
fset *token.FileSet
|
||||||
|
Contexts []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func newBuilder() *builder {
|
func newBuilder() *builder {
|
||||||
|
@ -43,8 +50,9 @@ func (b *builder) parseFile(path string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
b.deleteMainFunc(f)
|
b.deleteMainFunc(f)
|
||||||
|
b.registerSteps(f)
|
||||||
b.deleteImports(f)
|
b.deleteImports(f)
|
||||||
b.files[f.Name.Name] = f
|
b.files[path] = f
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,10 +86,33 @@ func (b *builder) deleteMainFunc(f *ast.File) {
|
||||||
f.Decls = decls
|
f.Decls = decls
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *builder) registerSteps(f *ast.File) {
|
||||||
|
for _, d := range f.Decls {
|
||||||
|
fun, ok := d.(*ast.FuncDecl)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, param := range fun.Type.Params.List {
|
||||||
|
ident, ok := param.Type.(*ast.Ident)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if ident.Name == "godog.Suite" || f.Name.Name == "godog" && ident.Name == "Suite" {
|
||||||
|
b.Contexts = append(b.Contexts, fun.Name.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (b *builder) merge() (*ast.File, error) {
|
func (b *builder) merge() (*ast.File, error) {
|
||||||
f, err := parser.ParseFile(b.fset, "", mainTpl, 0)
|
var buf bytes.Buffer
|
||||||
|
t := template.Must(template.New("main").Parse(mainTpl))
|
||||||
|
if err := t.Execute(&buf, b); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := parser.ParseFile(b.fset, "", &buf, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("fail here")
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
b.deleteImports(f)
|
b.deleteImports(f)
|
||||||
|
|
14
runner.go
14
runner.go
|
@ -1,14 +0,0 @@
|
||||||
package godog
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"log"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Run() {
|
|
||||||
if !flag.Parsed() {
|
|
||||||
flag.Parse()
|
|
||||||
}
|
|
||||||
log.Println("running godoc, num registered steps:", len(stepHandlers), "color test:", cl("red", red))
|
|
||||||
log.Println("will read features in path:", cl(cfg.featuresPath, yellow))
|
|
||||||
}
|
|
|
@ -5,10 +5,18 @@ import (
|
||||||
"regexp"
|
"regexp"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
//func init() {
|
||||||
|
//f := StepHandlerFunc(func(args ...interface{}) error {
|
||||||
|
//log.Println("step triggered")
|
||||||
|
//return nil
|
||||||
|
//})
|
||||||
|
//Step(regexp.MustCompile("hello"), f)
|
||||||
|
//}
|
||||||
|
|
||||||
|
func SomeContext(g Suite) {
|
||||||
f := StepHandlerFunc(func(args ...interface{}) error {
|
f := StepHandlerFunc(func(args ...interface{}) error {
|
||||||
log.Println("step triggered")
|
log.Println("step triggered")
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
Step(regexp.MustCompile("hello"), f)
|
g.Step(regexp.MustCompile("hello"), f)
|
||||||
}
|
}
|
||||||
|
|
22
suite.go
Обычный файл
22
suite.go
Обычный файл
|
@ -0,0 +1,22 @@
|
||||||
|
package godog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"regexp"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Suite interface {
|
||||||
|
Step(exp *regexp.Regexp, h StepHandler)
|
||||||
|
}
|
||||||
|
|
||||||
|
type GodogSuite struct {
|
||||||
|
steps map[*regexp.Regexp]StepHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GodogSuite) Step(exp *regexp.Regexp, h StepHandler) {
|
||||||
|
s.steps[exp] = h
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GodogSuite) Run() {
|
||||||
|
log.Println("running godoc, num registered steps:", len(s.steps))
|
||||||
|
}
|
Загрузка…
Создание таблицы
Сослаться в новой задаче