nested multi line steps with table or content body argument #89
Этот коммит содержится в:
родитель
b10470da31
коммит
aac216500e
2 изменённых файлов: 120 добавлений и 8 удалений
|
@ -3,6 +3,7 @@ package godog
|
|||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
|
@ -118,7 +119,7 @@ func TestProgressFormatterWhenStepPanics(t *testing.T) {
|
|||
}
|
||||
|
||||
out := buf.String()
|
||||
if idx := strings.Index(out, "github.com/DATA-DOG/godog/fmt_progress_test.go:116"); idx == -1 {
|
||||
if idx := strings.Index(out, "github.com/DATA-DOG/godog/fmt_progress_test.go:113"); idx == -1 {
|
||||
t.Fatal("expected to find panic stacktrace")
|
||||
}
|
||||
}
|
||||
|
@ -261,3 +262,96 @@ func FeatureContext(s *godog.Suite) {
|
|||
t.Fatalf("expected output does not match: %s", actual)
|
||||
}
|
||||
}
|
||||
|
||||
func TestProgressFormatterWhenMultiStepHasArgument(t *testing.T) {
|
||||
|
||||
var featureSource = `
|
||||
Feature: basic
|
||||
|
||||
Scenario: passing scenario
|
||||
When one
|
||||
Then two:
|
||||
"""
|
||||
text
|
||||
"""
|
||||
`
|
||||
feat, err := gherkin.ParseFeature(strings.NewReader(featureSource))
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
r := runner{
|
||||
fmt: progressFunc("progress", ioutil.Discard),
|
||||
features: []*feature{&feature{Feature: feat}},
|
||||
initializer: func(s *Suite) {
|
||||
s.Step(`^one$`, func() error { return nil })
|
||||
s.Step(`^two:$`, func(doc *gherkin.DocString) Steps { return Steps{"one"} })
|
||||
},
|
||||
}
|
||||
|
||||
if r.run() {
|
||||
t.Fatal("the suite should have passed")
|
||||
}
|
||||
}
|
||||
|
||||
func TestProgressFormatterWhenMultiStepHasStepWithArgument(t *testing.T) {
|
||||
|
||||
var featureSource = `
|
||||
Feature: basic
|
||||
|
||||
Scenario: passing scenario
|
||||
When one
|
||||
Then two`
|
||||
|
||||
feat, err := gherkin.ParseFeature(strings.NewReader(featureSource))
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
var subStep = `three:
|
||||
"""
|
||||
content
|
||||
"""`
|
||||
|
||||
var buf bytes.Buffer
|
||||
w := colors.Uncolored(&buf)
|
||||
r := runner{
|
||||
fmt: progressFunc("progress", w),
|
||||
features: []*feature{&feature{Feature: feat}},
|
||||
initializer: func(s *Suite) {
|
||||
s.Step(`^one$`, func() error { return nil })
|
||||
s.Step(`^two$`, func() Steps { return Steps{subStep} })
|
||||
s.Step(`^three:$`, func(doc *gherkin.DocString) error { return nil })
|
||||
},
|
||||
}
|
||||
|
||||
if !r.run() {
|
||||
t.Fatal("the suite should have failed")
|
||||
}
|
||||
|
||||
expected := `
|
||||
.F 2
|
||||
|
||||
|
||||
--- Failed steps:
|
||||
|
||||
Then two # :6
|
||||
Error: nested steps cannot be multiline and have table or content body argument
|
||||
|
||||
|
||||
1 scenarios (1 failed)
|
||||
2 steps (1 passed, 1 failed)
|
||||
%s
|
||||
|
||||
Randomized with seed: %s
|
||||
`
|
||||
|
||||
var zeroDuration time.Duration
|
||||
expected = fmt.Sprintf(expected, zeroDuration.String(), os.Getenv("GODOG_SEED"))
|
||||
expected = trimAllLines(expected)
|
||||
|
||||
actual := trimAllLines(buf.String())
|
||||
if actual != expected {
|
||||
t.Fatalf("expected output does not match: %s", actual)
|
||||
}
|
||||
}
|
||||
|
|
32
suite.go
32
suite.go
|
@ -244,7 +244,9 @@ func (s *Suite) runStep(step *gherkin.Step, prevStepErr error) (err error) {
|
|||
}
|
||||
}()
|
||||
|
||||
if undef := s.maybeUndefined(step.Text); len(undef) > 0 {
|
||||
if undef, err := s.maybeUndefined(step.Text, step.Argument); err != nil {
|
||||
return err
|
||||
} else if len(undef) > 0 {
|
||||
if match != nil {
|
||||
match = &StepDef{
|
||||
args: match.args,
|
||||
|
@ -273,21 +275,37 @@ func (s *Suite) runStep(step *gherkin.Step, prevStepErr error) (err error) {
|
|||
return
|
||||
}
|
||||
|
||||
func (s *Suite) maybeUndefined(text string) (undefined []string) {
|
||||
func (s *Suite) maybeUndefined(text string, arg interface{}) ([]string, error) {
|
||||
step := s.matchStepText(text)
|
||||
if nil == step {
|
||||
undefined = append(undefined, text)
|
||||
return
|
||||
return []string{text}, nil
|
||||
}
|
||||
|
||||
var undefined []string
|
||||
if !step.nested {
|
||||
return
|
||||
return undefined, nil
|
||||
}
|
||||
|
||||
if arg != nil {
|
||||
step.args = append(step.args, arg)
|
||||
}
|
||||
|
||||
for _, next := range step.run().(Steps) {
|
||||
undefined = append(undefined, s.maybeUndefined(next)...)
|
||||
lines := strings.Split(next, "\n")
|
||||
// @TODO: we cannot currently parse table or content body from nested steps
|
||||
if len(lines) > 1 {
|
||||
return undefined, fmt.Errorf("nested steps cannot be multiline and have table or content body argument")
|
||||
}
|
||||
if len(lines[0]) > 0 && lines[0][len(lines[0])-1] == ':' {
|
||||
return undefined, fmt.Errorf("nested steps cannot be multiline and have table or content body argument")
|
||||
}
|
||||
undef, err := s.maybeUndefined(next, nil)
|
||||
if err != nil {
|
||||
return undefined, err
|
||||
}
|
||||
undefined = append(undefined, undef...)
|
||||
}
|
||||
return
|
||||
return undefined, nil
|
||||
}
|
||||
|
||||
func (s *Suite) maybeSubSteps(result interface{}) error {
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче