From aac216500e84855dea54f4db8fec9e2272ff857d Mon Sep 17 00:00:00 2001 From: gedi Date: Fri, 9 Jun 2017 11:42:28 +0300 Subject: [PATCH] nested multi line steps with table or content body argument #89 --- fmt_progress_test.go | 96 +++++++++++++++++++++++++++++++++++++++++++- suite.go | 32 +++++++++++---- 2 files changed, 120 insertions(+), 8 deletions(-) diff --git a/fmt_progress_test.go b/fmt_progress_test.go index d722fee..37a6367 100644 --- a/fmt_progress_test.go +++ b/fmt_progress_test.go @@ -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) + } +} diff --git a/suite.go b/suite.go index a3769ae..ee80d75 100644 --- a/suite.go +++ b/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 {