/
feature.go
128 lines (111 loc) · 2.87 KB
/
feature.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package models
import (
"github.com/cucumber/messages-go/v16"
)
// Feature is an internal object to group together
// the parsed gherkin document, the pickles and the
// raw content.
type Feature struct {
*messages.GherkinDocument
Pickles []*messages.Pickle
Content []byte
}
// FindRule returns the rule containing astScenarioID.
func (f Feature) FindRule(astScenarioID string) *messages.Rule {
for _, child := range f.GherkinDocument.Feature.Children {
if ru := child.Rule; ru != nil {
for _, ruc := range ru.Children {
if sc := ruc.Scenario; sc != nil && sc.Id == astScenarioID {
return ru
}
}
}
}
return nil
}
// FindScenario returns the scenario matching astScenarioID. The scenario
// might be a direct child of Feature, or a child of a Rule within a Feature.
func (f Feature) FindScenario(astScenarioID string) *messages.Scenario {
for _, child := range f.GherkinDocument.Feature.Children {
if sc := child.Scenario; sc != nil && sc.Id == astScenarioID {
return sc
}
if rc := child.Rule; rc != nil {
for _, rcc := range rc.Children {
if sc := rcc.Scenario; sc != nil && sc.Id == astScenarioID {
return sc
}
}
}
}
return nil
}
// FindBackground ...
// TODO: must find children of rule!!!!
func (f Feature) FindBackground(astScenarioID string) *messages.Background {
var bg *messages.Background
for _, child := range f.GherkinDocument.Feature.Children {
if tmp := child.Background; tmp != nil {
bg = tmp
}
if sc := child.Scenario; sc != nil && sc.Id == astScenarioID {
return bg
}
}
return nil
}
// FindExample ...
func (f Feature) FindExample(exampleAstID string) (*messages.Examples, *messages.TableRow) {
for _, child := range f.GherkinDocument.Feature.Children {
if sc := child.Scenario; sc != nil {
for _, example := range sc.Examples {
for _, row := range example.TableBody {
if row.Id == exampleAstID {
return example, row
}
}
}
}
}
return nil, nil
}
// FindStep returns the step matching astStepID. The step
// might be a child of a Scenario or a Background (which might be contained
// inside a Rule).
func (f Feature) FindStep(astStepID string) *messages.Step {
for _, child := range f.GherkinDocument.Feature.Children {
if sc := child.Scenario; sc != nil {
for _, step := range sc.Steps {
if step.Id == astStepID {
return step
}
}
}
if bg := child.Background; bg != nil {
for _, step := range bg.Steps {
if step.Id == astStepID {
return step
}
}
}
if ru := child.Rule; ru != nil {
for _, ruc := range ru.Children {
if sc := ruc.Scenario; sc != nil {
for _, step := range sc.Steps {
if step.Id == astStepID {
return step
}
}
}
if bg := ruc.Background; bg != nil {
for _, step := range bg.Steps {
if step.Id == astStepID {
return step
}
}
}
}
}
}
return nil
}