From 7e9d56a90069d1d2a0a322161a4ae0de4966c169 Mon Sep 17 00:00:00 2001 From: gedi Date: Tue, 9 Jun 2015 22:26:25 +0300 Subject: [PATCH] test tag parsing and merging --- gherkin/parse.go | 12 ++++++------ gherkin/parse_feature_test.go | 6 ++++++ gherkin/parse_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/gherkin/parse.go b/gherkin/parse.go index 07c5d48..e42ce0a 100644 --- a/gherkin/parse.go +++ b/gherkin/parse.go @@ -130,9 +130,6 @@ func (p *parser) parseFeature() (ft *Feature, err error) { ft = &Feature{Path: p.path, AST: p.ast} switch p.peek().Type { case lexer.EOF: - // if p.ast.tail != nil { - // log.Println("peeked at:", p.peek().Type, p.ast.tail.prev.value.Type) - // } return ft, ErrEmpty case lexer.TAGS: ft.Tags = p.parseTags() @@ -151,7 +148,6 @@ func (p *parser) parseFeature() (ft *Feature, err error) { ft.Description = strings.Join(desc, "\n") for tok = p.peek(); tok.Type != lexer.EOF; tok = p.peek() { - // log.Println("loop peeked:", tok.Type) // there may be a background if tok.Type == lexer.BACKGROUND { if ft.Background != nil { @@ -167,9 +163,13 @@ func (p *parser) parseFeature() (ft *Feature, err error) { } // there may be tags before scenario - sc := &Scenario{} + sc := &Scenario{Tags: ft.Tags} if tok.Type == lexer.TAGS { - sc.Tags = p.parseTags() + for _, t := range p.parseTags() { + if !sc.Tags.Has(t) { + sc.Tags = append(sc.Tags, t) + } + } tok = p.peek() } diff --git a/gherkin/parse_feature_test.go b/gherkin/parse_feature_test.go index 48ef496..c8ae653 100644 --- a/gherkin/parse_feature_test.go +++ b/gherkin/parse_feature_test.go @@ -26,6 +26,12 @@ func (f *Feature) assertTitle(title string, t *testing.T) { } } +func (f *Feature) assertHasNumScenarios(n int, t *testing.T) { + if len(f.Scenarios) != n { + t.Fatalf("expected feature to have '%d' scenarios, but got '%d'", n, len(f.Scenarios)) + } +} + func Test_parse_normal_feature(t *testing.T) { p := &parser{ lx: lexer.New(strings.NewReader(testFeatureSamples["feature"])), diff --git a/gherkin/parse_test.go b/gherkin/parse_test.go index e112145..a073e1c 100644 --- a/gherkin/parse_test.go +++ b/gherkin/parse_test.go @@ -7,6 +7,18 @@ import ( "github.com/l3pp4rd/go-behat/gherkin/lexer" ) +func (s *Scenario) assertHasTag(tag string, t *testing.T) { + if !s.Tags.Has(Tag(tag)) { + t.Fatalf("expected scenario '%s' to have '%s' tag, but it did not", s.Title, tag) + } +} + +func (s *Scenario) assertHasNumTags(n int, t *testing.T) { + if len(s.Tags) != n { + t.Fatalf("expected scenario '%s' to have '%d' tags, but it has '%d'", s.Title, n, len(s.Tags)) + } +} + func Test_parse_feature_file(t *testing.T) { content := strings.Join([]string{ @@ -70,4 +82,20 @@ func Test_parse_feature_file(t *testing.T) { lexer.TAGS, lexer.SCENARIO, }, t) + + ft.assertHasNumScenarios(3, t) + + ft.Scenarios[0].assertHasNumTags(2, t) + ft.Scenarios[0].assertHasTag("global-one", t) + ft.Scenarios[0].assertHasTag("cust", t) + + ft.Scenarios[1].assertHasNumTags(3, t) + ft.Scenarios[1].assertHasTag("global-one", t) + ft.Scenarios[1].assertHasTag("cust", t) + ft.Scenarios[1].assertHasTag("user", t) + + ft.Scenarios[2].assertHasNumTags(3, t) + ft.Scenarios[2].assertHasTag("global-one", t) + ft.Scenarios[2].assertHasTag("cust", t) + ft.Scenarios[2].assertHasTag("todo", t) }