do not split gherkin table to separate types

Этот коммит содержится в:
gedi 2015-06-18 11:07:53 +03:00
родитель 2807b07739
коммит 0f6ec04318
2 изменённых файлов: 21 добавлений и 26 удалений

Просмотреть файл

@ -111,13 +111,20 @@ func (a *Arg) Bytes() []byte {
return []byte(s) return []byte(s)
} }
// PyString converts an argument gherkin PyString node // PyString converts an argument to *gherkin.PyString node
func (a *Arg) PyString() *gherkin.PyString { func (a *Arg) PyString() *gherkin.PyString {
s, ok := a.value.(*gherkin.PyString) s, ok := a.value.(*gherkin.PyString)
a.must(ok, "*gherkin.PyString") a.must(ok, "*gherkin.PyString")
return s return s
} }
// Table converts an argument to *gherkin.Table node
func (a *Arg) Table() *gherkin.Table {
s, ok := a.value.(*gherkin.Table)
a.must(ok, "*gherkin.Table")
return s
}
func (a *Arg) must(ok bool, expected string) { func (a *Arg) must(ok bool, expected string) {
if !ok { if !ok {
panic(fmt.Sprintf(`cannot convert "%v" of type "%T" to type "%s"`, a.value, a.value, expected)) panic(fmt.Sprintf(`cannot convert "%v" of type "%T" to type "%s"`, a.value, a.value, expected))

Просмотреть файл

@ -102,7 +102,7 @@ type Scenario struct {
Title string Title string
Steps []*Step Steps []*Step
Tags Tags Tags Tags
Examples *ExampleTable Examples *Table
Feature *Feature Feature *Feature
} }
@ -119,7 +119,7 @@ type Step struct {
Text string Text string
Type string Type string
PyString *PyString PyString *PyString
Table *StepTable Table *Table
Scenario *Scenario Scenario *Scenario
Background *Background Background *Background
} }
@ -149,23 +149,13 @@ func (p *PyString) String() string {
return p.Raw return p.Raw
} }
// Table is a row group object used with step definition // Table is a row group object used with
type table struct { // step definition or outline scenario
type Table struct {
*Token *Token
rows [][]string
}
// ExampleTable is a row group object for
// scenario outline examples
type ExampleTable struct {
*table
OutlineScenario *Scenario OutlineScenario *Scenario
}
// StepTable is a row group object for steps
type StepTable struct {
*table
Step *Step Step *Step
rows [][]string
} }
var allSteps = []TokenType{ var allSteps = []TokenType{
@ -324,11 +314,10 @@ func (p *parser) parseScenario() (s *Scenario, err error) {
"but got '" + peek.Type.String() + "' instead, for scenario outline examples", "but got '" + peek.Type.String() + "' instead, for scenario outline examples",
}, " "), examples.Line) }, " "), examples.Line)
} }
tbl, err := p.parseTable() if s.Examples, err = p.parseTable(); err != nil {
if err != nil {
return s, err return s, err
} }
s.Examples = &ExampleTable{OutlineScenario: s, table: tbl} s.Examples.OutlineScenario = s
} }
return s, nil return s, nil
} }
@ -347,11 +336,10 @@ func (p *parser) parseSteps() (steps []*Step, err error) {
} }
step.PyString.Step = step step.PyString.Step = step
case TABLE_ROW: case TABLE_ROW:
tbl, err := p.parseTable() if step.Table, err = p.parseTable(); err != nil {
if err != nil {
return steps, err return steps, err
} }
step.Table = &StepTable{Step: step, table: tbl} step.Table.Step = step
default: default:
return steps, p.err("pystring or table row was expected, but got: '"+tok.Type.String()+"' instead", tok.Line) return steps, p.err("pystring or table row was expected, but got: '"+tok.Type.String()+"' instead", tok.Line)
} }
@ -380,8 +368,8 @@ func (p *parser) parsePystring() (*PyString, error) {
}, nil }, nil
} }
func (p *parser) parseTable() (*table, error) { func (p *parser) parseTable() (*Table, error) {
tbl := &table{} tbl := &Table{}
for row := p.peek(); row.Type == TABLE_ROW; row = p.peek() { for row := p.peek(); row.Type == TABLE_ROW; row = p.peek() {
var cols []string var cols []string
for _, r := range strings.Split(strings.Trim(row.Value, "|"), "|") { for _, r := range strings.Split(strings.Trim(row.Value, "|"), "|") {