Merge pull request #332 from cucumber/moved-stepdef-to-the-public-formatters-pkg
Moved StepDefinition to the formatters pkg
Этот коммит содержится в:
коммит
daa36b6922
11 изменённых файлов: 186 добавлений и 69 удалений
|
@ -2,10 +2,9 @@ package formatters
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
"regexp"
|
||||||
|
|
||||||
"github.com/cucumber/messages-go/v10"
|
"github.com/cucumber/messages-go/v10"
|
||||||
|
|
||||||
"github.com/cucumber/godog/internal/models"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type registeredFormatter struct {
|
type registeredFormatter struct {
|
||||||
|
@ -65,15 +64,28 @@ type Formatter interface {
|
||||||
TestRunStarted()
|
TestRunStarted()
|
||||||
Feature(*messages.GherkinDocument, string, []byte)
|
Feature(*messages.GherkinDocument, string, []byte)
|
||||||
Pickle(*messages.Pickle)
|
Pickle(*messages.Pickle)
|
||||||
Defined(*messages.Pickle, *messages.Pickle_PickleStep, *models.StepDefinition)
|
Defined(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition)
|
||||||
Failed(*messages.Pickle, *messages.Pickle_PickleStep, *models.StepDefinition, error)
|
Failed(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition, error)
|
||||||
Passed(*messages.Pickle, *messages.Pickle_PickleStep, *models.StepDefinition)
|
Passed(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition)
|
||||||
Skipped(*messages.Pickle, *messages.Pickle_PickleStep, *models.StepDefinition)
|
Skipped(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition)
|
||||||
Undefined(*messages.Pickle, *messages.Pickle_PickleStep, *models.StepDefinition)
|
Undefined(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition)
|
||||||
Pending(*messages.Pickle, *messages.Pickle_PickleStep, *models.StepDefinition)
|
Pending(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition)
|
||||||
Summary()
|
Summary()
|
||||||
}
|
}
|
||||||
|
|
||||||
// FormatterFunc builds a formatter with given
|
// FormatterFunc builds a formatter with given
|
||||||
// suite name and io.Writer to record output
|
// suite name and io.Writer to record output
|
||||||
type FormatterFunc func(string, io.Writer) Formatter
|
type FormatterFunc func(string, io.Writer) Formatter
|
||||||
|
|
||||||
|
// StepDefinition is a registered step definition
|
||||||
|
// contains a StepHandler and regexp which
|
||||||
|
// is used to match a step. Args which
|
||||||
|
// were matched by last executed step
|
||||||
|
//
|
||||||
|
// This structure is passed to the formatter
|
||||||
|
// when step is matched and is either failed
|
||||||
|
// or successful
|
||||||
|
type StepDefinition struct {
|
||||||
|
Expr *regexp.Regexp
|
||||||
|
Handler interface{}
|
||||||
|
}
|
||||||
|
|
|
@ -63,23 +63,27 @@ func (f *Basefmt) Feature(*messages.GherkinDocument, string, []byte) {}
|
||||||
func (f *Basefmt) Pickle(*messages.Pickle) {}
|
func (f *Basefmt) Pickle(*messages.Pickle) {}
|
||||||
|
|
||||||
// Defined ...
|
// Defined ...
|
||||||
func (f *Basefmt) Defined(*messages.Pickle, *messages.Pickle_PickleStep, *models.StepDefinition) {}
|
func (f *Basefmt) Defined(*messages.Pickle, *messages.Pickle_PickleStep, *formatters.StepDefinition) {
|
||||||
|
}
|
||||||
|
|
||||||
// Passed ...
|
// Passed ...
|
||||||
func (f *Basefmt) Passed(*messages.Pickle, *messages.Pickle_PickleStep, *models.StepDefinition) {}
|
func (f *Basefmt) Passed(*messages.Pickle, *messages.Pickle_PickleStep, *formatters.StepDefinition) {}
|
||||||
|
|
||||||
// Skipped ...
|
// Skipped ...
|
||||||
func (f *Basefmt) Skipped(*messages.Pickle, *messages.Pickle_PickleStep, *models.StepDefinition) {}
|
func (f *Basefmt) Skipped(*messages.Pickle, *messages.Pickle_PickleStep, *formatters.StepDefinition) {
|
||||||
|
}
|
||||||
|
|
||||||
// Undefined ...
|
// Undefined ...
|
||||||
func (f *Basefmt) Undefined(*messages.Pickle, *messages.Pickle_PickleStep, *models.StepDefinition) {}
|
func (f *Basefmt) Undefined(*messages.Pickle, *messages.Pickle_PickleStep, *formatters.StepDefinition) {
|
||||||
|
}
|
||||||
|
|
||||||
// Failed ...
|
// Failed ...
|
||||||
func (f *Basefmt) Failed(*messages.Pickle, *messages.Pickle_PickleStep, *models.StepDefinition, error) {
|
func (f *Basefmt) Failed(*messages.Pickle, *messages.Pickle_PickleStep, *formatters.StepDefinition, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pending ...
|
// Pending ...
|
||||||
func (f *Basefmt) Pending(*messages.Pickle, *messages.Pickle_PickleStep, *models.StepDefinition) {}
|
func (f *Basefmt) Pending(*messages.Pickle, *messages.Pickle_PickleStep, *formatters.StepDefinition) {
|
||||||
|
}
|
||||||
|
|
||||||
// Summary ...
|
// Summary ...
|
||||||
func (f *Basefmt) Summary() {
|
func (f *Basefmt) Summary() {
|
||||||
|
|
|
@ -8,7 +8,6 @@ import (
|
||||||
"github.com/cucumber/messages-go/v10"
|
"github.com/cucumber/messages-go/v10"
|
||||||
|
|
||||||
"github.com/cucumber/godog/formatters"
|
"github.com/cucumber/godog/formatters"
|
||||||
"github.com/cucumber/godog/internal/models"
|
|
||||||
"github.com/cucumber/godog/internal/utils"
|
"github.com/cucumber/godog/internal/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -189,7 +188,7 @@ func (f *eventsFormatter) step(pickle *messages.Pickle, pickleStep *messages.Pic
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *eventsFormatter) Defined(pickle *messages.Pickle, pickleStep *messages.Pickle_PickleStep, def *models.StepDefinition) {
|
func (f *eventsFormatter) Defined(pickle *messages.Pickle, pickleStep *messages.Pickle_PickleStep, def *formatters.StepDefinition) {
|
||||||
f.Basefmt.Defined(pickle, pickleStep, def)
|
f.Basefmt.Defined(pickle, pickleStep, def)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -199,6 +198,8 @@ func (f *eventsFormatter) Defined(pickle *messages.Pickle, pickleStep *messages.
|
||||||
step := feature.FindStep(pickleStep.AstNodeIds[0])
|
step := feature.FindStep(pickleStep.AstNodeIds[0])
|
||||||
|
|
||||||
if def != nil {
|
if def != nil {
|
||||||
|
matchedDef := f.storage.MustGetStepDefintionMatch(pickleStep.AstNodeIds[0])
|
||||||
|
|
||||||
m := def.Expr.FindStringSubmatchIndex(pickleStep.Text)[2:]
|
m := def.Expr.FindStringSubmatchIndex(pickleStep.Text)[2:]
|
||||||
var args [][2]int
|
var args [][2]int
|
||||||
for i := 0; i < len(m)/2; i++ {
|
for i := 0; i < len(m)/2; i++ {
|
||||||
|
@ -221,7 +222,7 @@ func (f *eventsFormatter) Defined(pickle *messages.Pickle, pickleStep *messages.
|
||||||
}{
|
}{
|
||||||
"StepDefinitionFound",
|
"StepDefinitionFound",
|
||||||
fmt.Sprintf("%s:%d", pickle.Uri, step.Location.Line),
|
fmt.Sprintf("%s:%d", pickle.Uri, step.Location.Line),
|
||||||
DefinitionID(def),
|
DefinitionID(matchedDef),
|
||||||
args,
|
args,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -237,7 +238,7 @@ func (f *eventsFormatter) Defined(pickle *messages.Pickle, pickleStep *messages.
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *eventsFormatter) Passed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition) {
|
func (f *eventsFormatter) Passed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition) {
|
||||||
f.Basefmt.Passed(pickle, step, match)
|
f.Basefmt.Passed(pickle, step, match)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -246,7 +247,7 @@ func (f *eventsFormatter) Passed(pickle *messages.Pickle, step *messages.Pickle_
|
||||||
f.step(pickle, step)
|
f.step(pickle, step)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *eventsFormatter) Skipped(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition) {
|
func (f *eventsFormatter) Skipped(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition) {
|
||||||
f.Basefmt.Skipped(pickle, step, match)
|
f.Basefmt.Skipped(pickle, step, match)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -255,7 +256,7 @@ func (f *eventsFormatter) Skipped(pickle *messages.Pickle, step *messages.Pickle
|
||||||
f.step(pickle, step)
|
f.step(pickle, step)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *eventsFormatter) Undefined(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition) {
|
func (f *eventsFormatter) Undefined(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition) {
|
||||||
f.Basefmt.Undefined(pickle, step, match)
|
f.Basefmt.Undefined(pickle, step, match)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -264,7 +265,7 @@ func (f *eventsFormatter) Undefined(pickle *messages.Pickle, step *messages.Pick
|
||||||
f.step(pickle, step)
|
f.step(pickle, step)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *eventsFormatter) Failed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition, err error) {
|
func (f *eventsFormatter) Failed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition, err error) {
|
||||||
f.Basefmt.Failed(pickle, step, match, err)
|
f.Basefmt.Failed(pickle, step, match, err)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -273,7 +274,7 @@ func (f *eventsFormatter) Failed(pickle *messages.Pickle, step *messages.Pickle_
|
||||||
f.step(pickle, step)
|
f.step(pickle, step)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *eventsFormatter) Pending(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition) {
|
func (f *eventsFormatter) Pending(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition) {
|
||||||
f.Basefmt.Pending(pickle, step, match)
|
f.Basefmt.Pending(pickle, step, match)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
|
|
@ -12,7 +12,6 @@ import (
|
||||||
|
|
||||||
"github.com/cucumber/godog/colors"
|
"github.com/cucumber/godog/colors"
|
||||||
"github.com/cucumber/godog/formatters"
|
"github.com/cucumber/godog/formatters"
|
||||||
"github.com/cucumber/godog/internal/models"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -72,7 +71,7 @@ func (f *pretty) Pickle(pickle *messages.Pickle) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *pretty) Passed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition) {
|
func (f *pretty) Passed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition) {
|
||||||
f.Basefmt.Passed(pickle, step, match)
|
f.Basefmt.Passed(pickle, step, match)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -81,7 +80,7 @@ func (f *pretty) Passed(pickle *messages.Pickle, step *messages.Pickle_PickleSte
|
||||||
f.printStep(pickle, step)
|
f.printStep(pickle, step)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *pretty) Skipped(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition) {
|
func (f *pretty) Skipped(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition) {
|
||||||
f.Basefmt.Skipped(pickle, step, match)
|
f.Basefmt.Skipped(pickle, step, match)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -90,7 +89,7 @@ func (f *pretty) Skipped(pickle *messages.Pickle, step *messages.Pickle_PickleSt
|
||||||
f.printStep(pickle, step)
|
f.printStep(pickle, step)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *pretty) Undefined(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition) {
|
func (f *pretty) Undefined(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition) {
|
||||||
f.Basefmt.Undefined(pickle, step, match)
|
f.Basefmt.Undefined(pickle, step, match)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -99,7 +98,7 @@ func (f *pretty) Undefined(pickle *messages.Pickle, step *messages.Pickle_Pickle
|
||||||
f.printStep(pickle, step)
|
f.printStep(pickle, step)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *pretty) Failed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition, err error) {
|
func (f *pretty) Failed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition, err error) {
|
||||||
f.Basefmt.Failed(pickle, step, match, err)
|
f.Basefmt.Failed(pickle, step, match, err)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -108,7 +107,7 @@ func (f *pretty) Failed(pickle *messages.Pickle, step *messages.Pickle_PickleSte
|
||||||
f.printStep(pickle, step)
|
f.printStep(pickle, step)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *pretty) Pending(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition) {
|
func (f *pretty) Pending(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition) {
|
||||||
f.Basefmt.Pending(pickle, step, match)
|
f.Basefmt.Pending(pickle, step, match)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
|
|
@ -10,7 +10,6 @@ import (
|
||||||
"github.com/cucumber/messages-go/v10"
|
"github.com/cucumber/messages-go/v10"
|
||||||
|
|
||||||
"github.com/cucumber/godog/formatters"
|
"github.com/cucumber/godog/formatters"
|
||||||
"github.com/cucumber/godog/internal/models"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -104,7 +103,7 @@ func (f *progress) step(pickleStepID string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *progress) Passed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition) {
|
func (f *progress) Passed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition) {
|
||||||
f.Basefmt.Passed(pickle, step, match)
|
f.Basefmt.Passed(pickle, step, match)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -113,7 +112,7 @@ func (f *progress) Passed(pickle *messages.Pickle, step *messages.Pickle_PickleS
|
||||||
f.step(step.Id)
|
f.step(step.Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *progress) Skipped(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition) {
|
func (f *progress) Skipped(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition) {
|
||||||
f.Basefmt.Skipped(pickle, step, match)
|
f.Basefmt.Skipped(pickle, step, match)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -122,7 +121,7 @@ func (f *progress) Skipped(pickle *messages.Pickle, step *messages.Pickle_Pickle
|
||||||
f.step(step.Id)
|
f.step(step.Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *progress) Undefined(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition) {
|
func (f *progress) Undefined(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition) {
|
||||||
f.Basefmt.Undefined(pickle, step, match)
|
f.Basefmt.Undefined(pickle, step, match)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -131,7 +130,7 @@ func (f *progress) Undefined(pickle *messages.Pickle, step *messages.Pickle_Pick
|
||||||
f.step(step.Id)
|
f.step(step.Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *progress) Failed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition, err error) {
|
func (f *progress) Failed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition, err error) {
|
||||||
f.Basefmt.Failed(pickle, step, match, err)
|
f.Basefmt.Failed(pickle, step, match, err)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
@ -140,7 +139,7 @@ func (f *progress) Failed(pickle *messages.Pickle, step *messages.Pickle_PickleS
|
||||||
f.step(step.Id)
|
f.step(step.Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *progress) Pending(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *models.StepDefinition) {
|
func (f *progress) Pending(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *formatters.StepDefinition) {
|
||||||
f.Basefmt.Pending(pickle, step, match)
|
f.Basefmt.Pending(pickle, step, match)
|
||||||
|
|
||||||
f.lock.Lock()
|
f.lock.Lock()
|
||||||
|
|
|
@ -3,27 +3,21 @@ package models
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/cucumber/messages-go/v10"
|
"github.com/cucumber/messages-go/v10"
|
||||||
|
|
||||||
|
"github.com/cucumber/godog/formatters"
|
||||||
)
|
)
|
||||||
|
|
||||||
var typeOfBytes = reflect.TypeOf([]byte(nil))
|
var typeOfBytes = reflect.TypeOf([]byte(nil))
|
||||||
|
|
||||||
// StepDefinition is a registered step definition
|
// StepDefinition ...
|
||||||
// contains a StepHandler and regexp which
|
|
||||||
// is used to match a step. Args which
|
|
||||||
// were matched by last executed step
|
|
||||||
//
|
|
||||||
// This structure is passed to the formatter
|
|
||||||
// when step is matched and is either failed
|
|
||||||
// or successful
|
|
||||||
type StepDefinition struct {
|
type StepDefinition struct {
|
||||||
|
formatters.StepDefinition
|
||||||
|
|
||||||
Args []interface{}
|
Args []interface{}
|
||||||
HandlerValue reflect.Value
|
HandlerValue reflect.Value
|
||||||
Expr *regexp.Regexp
|
|
||||||
Handler interface{}
|
|
||||||
|
|
||||||
// multistep related
|
// multistep related
|
||||||
Nested bool
|
Nested bool
|
||||||
|
@ -173,3 +167,12 @@ func (sd *StepDefinition) shouldBeString(idx int) (string, error) {
|
||||||
}
|
}
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetInternalStepDefinition ...
|
||||||
|
func (sd *StepDefinition) GetInternalStepDefinition() *formatters.StepDefinition {
|
||||||
|
if sd == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return &sd.StepDefinition
|
||||||
|
}
|
||||||
|
|
|
@ -5,15 +5,19 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/cucumber/godog/internal/models"
|
|
||||||
"github.com/cucumber/messages-go/v10"
|
"github.com/cucumber/messages-go/v10"
|
||||||
|
|
||||||
|
"github.com/cucumber/godog/formatters"
|
||||||
|
"github.com/cucumber/godog/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestShouldSupportIntTypes(t *testing.T) {
|
func TestShouldSupportIntTypes(t *testing.T) {
|
||||||
fn := func(a int64, b int32, c int16, d int8) error { return nil }
|
fn := func(a int64, b int32, c int16, d int8) error { return nil }
|
||||||
|
|
||||||
def := &models.StepDefinition{
|
def := &models.StepDefinition{
|
||||||
Handler: fn,
|
StepDefinition: formatters.StepDefinition{
|
||||||
|
Handler: fn,
|
||||||
|
},
|
||||||
HandlerValue: reflect.ValueOf(fn),
|
HandlerValue: reflect.ValueOf(fn),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +36,9 @@ func TestShouldSupportFloatTypes(t *testing.T) {
|
||||||
fn := func(a float64, b float32) error { return nil }
|
fn := func(a float64, b float32) error { return nil }
|
||||||
|
|
||||||
def := &models.StepDefinition{
|
def := &models.StepDefinition{
|
||||||
Handler: fn,
|
StepDefinition: formatters.StepDefinition{
|
||||||
|
Handler: fn,
|
||||||
|
},
|
||||||
HandlerValue: reflect.ValueOf(fn),
|
HandlerValue: reflect.ValueOf(fn),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,16 +58,36 @@ func TestShouldNotSupportOtherPointerTypesThanGherkin(t *testing.T) {
|
||||||
fn2 := func(a *messages.PickleStepArgument_PickleDocString) error { return nil }
|
fn2 := func(a *messages.PickleStepArgument_PickleDocString) error { return nil }
|
||||||
fn3 := func(a *messages.PickleStepArgument_PickleTable) error { return nil }
|
fn3 := func(a *messages.PickleStepArgument_PickleTable) error { return nil }
|
||||||
|
|
||||||
def1 := &models.StepDefinition{Handler: fn1, HandlerValue: reflect.ValueOf(fn1), Args: []interface{}{(*int)(nil)}}
|
def1 := &models.StepDefinition{
|
||||||
def2 := &models.StepDefinition{Handler: fn2, HandlerValue: reflect.ValueOf(fn2), Args: []interface{}{&messages.PickleStepArgument_PickleDocString{}}}
|
StepDefinition: formatters.StepDefinition{
|
||||||
def3 := &models.StepDefinition{Handler: fn3, HandlerValue: reflect.ValueOf(fn3), Args: []interface{}{(*messages.PickleStepArgument_PickleTable)(nil)}}
|
Handler: fn1,
|
||||||
|
},
|
||||||
|
HandlerValue: reflect.ValueOf(fn1),
|
||||||
|
Args: []interface{}{(*int)(nil)},
|
||||||
|
}
|
||||||
|
def2 := &models.StepDefinition{
|
||||||
|
StepDefinition: formatters.StepDefinition{
|
||||||
|
Handler: fn2,
|
||||||
|
},
|
||||||
|
HandlerValue: reflect.ValueOf(fn2),
|
||||||
|
Args: []interface{}{&messages.PickleStepArgument_PickleDocString{}},
|
||||||
|
}
|
||||||
|
def3 := &models.StepDefinition{
|
||||||
|
StepDefinition: formatters.StepDefinition{
|
||||||
|
Handler: fn3,
|
||||||
|
},
|
||||||
|
HandlerValue: reflect.ValueOf(fn3),
|
||||||
|
Args: []interface{}{(*messages.PickleStepArgument_PickleTable)(nil)},
|
||||||
|
}
|
||||||
|
|
||||||
if err := def1.Run(); err == nil {
|
if err := def1.Run(); err == nil {
|
||||||
t.Fatalf("expected conversion error, but got none")
|
t.Fatalf("expected conversion error, but got none")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := def2.Run(); err != nil {
|
if err := def2.Run(); err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := def3.Run(); err != nil {
|
if err := def3.Run(); err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -71,12 +97,25 @@ func TestShouldSupportOnlyByteSlice(t *testing.T) {
|
||||||
fn1 := func(a []byte) error { return nil }
|
fn1 := func(a []byte) error { return nil }
|
||||||
fn2 := func(a []string) error { return nil }
|
fn2 := func(a []string) error { return nil }
|
||||||
|
|
||||||
def1 := &models.StepDefinition{Handler: fn1, HandlerValue: reflect.ValueOf(fn1), Args: []interface{}{"str"}}
|
def1 := &models.StepDefinition{
|
||||||
def2 := &models.StepDefinition{Handler: fn2, HandlerValue: reflect.ValueOf(fn2), Args: []interface{}{[]string{}}}
|
StepDefinition: formatters.StepDefinition{
|
||||||
|
Handler: fn1,
|
||||||
|
},
|
||||||
|
HandlerValue: reflect.ValueOf(fn1),
|
||||||
|
Args: []interface{}{"str"},
|
||||||
|
}
|
||||||
|
def2 := &models.StepDefinition{
|
||||||
|
StepDefinition: formatters.StepDefinition{
|
||||||
|
Handler: fn2,
|
||||||
|
},
|
||||||
|
HandlerValue: reflect.ValueOf(fn2),
|
||||||
|
Args: []interface{}{[]string{}},
|
||||||
|
}
|
||||||
|
|
||||||
if err := def1.Run(); err != nil {
|
if err := def1.Run(); err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := def2.Run(); err == nil {
|
if err := def2.Run(); err == nil {
|
||||||
t.Fatalf("expected conversion error, but got none")
|
t.Fatalf("expected conversion error, but got none")
|
||||||
}
|
}
|
||||||
|
@ -84,7 +123,12 @@ func TestShouldSupportOnlyByteSlice(t *testing.T) {
|
||||||
|
|
||||||
func TestUnexpectedArguments(t *testing.T) {
|
func TestUnexpectedArguments(t *testing.T) {
|
||||||
fn := func(a, b int) error { return nil }
|
fn := func(a, b int) error { return nil }
|
||||||
def := &models.StepDefinition{Handler: fn, HandlerValue: reflect.ValueOf(fn)}
|
def := &models.StepDefinition{
|
||||||
|
StepDefinition: formatters.StepDefinition{
|
||||||
|
Handler: fn,
|
||||||
|
},
|
||||||
|
HandlerValue: reflect.ValueOf(fn),
|
||||||
|
}
|
||||||
|
|
||||||
def.Args = []interface{}{"1"}
|
def.Args = []interface{}{"1"}
|
||||||
if err := def.Run(); err == nil {
|
if err := def.Run(); err == nil {
|
||||||
|
|
|
@ -31,6 +31,9 @@ const (
|
||||||
tablePickleStepResultIndexPickleStepID string = "id"
|
tablePickleStepResultIndexPickleStepID string = "id"
|
||||||
tablePickleStepResultIndexPickleID string = "pickle_id"
|
tablePickleStepResultIndexPickleID string = "pickle_id"
|
||||||
tablePickleStepResultIndexStatus string = "status"
|
tablePickleStepResultIndexStatus string = "status"
|
||||||
|
|
||||||
|
tableStepDefintionMatch string = "step_defintion_match"
|
||||||
|
tableStepDefintionMatchIndexStepID string = "id"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Storage is a thread safe in-mem storage
|
// Storage is a thread safe in-mem storage
|
||||||
|
@ -111,6 +114,16 @@ func NewStorage() *Storage {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
tableStepDefintionMatch: {
|
||||||
|
Name: tableStepDefintionMatch,
|
||||||
|
Indexes: map[string]*memdb.IndexSchema{
|
||||||
|
tableStepDefintionMatchIndexStepID: {
|
||||||
|
Name: tableStepDefintionMatchIndexStepID,
|
||||||
|
Unique: true,
|
||||||
|
Indexer: &memdb.StringFieldIndex{Field: "StepID"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,6 +264,27 @@ func (s *Storage) MustGetFeatures() (fs []*models.Feature) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type stepDefinitionMatch struct {
|
||||||
|
StepID string
|
||||||
|
StepDefinition *models.StepDefinition
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustInsertStepDefintionMatch will insert the matched StepDefintion for the step ID and panic on error.
|
||||||
|
func (s *Storage) MustInsertStepDefintionMatch(stepID string, match *models.StepDefinition) {
|
||||||
|
d := stepDefinitionMatch{
|
||||||
|
StepID: stepID,
|
||||||
|
StepDefinition: match,
|
||||||
|
}
|
||||||
|
|
||||||
|
s.mustInsert(tableStepDefintionMatch, d)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustGetStepDefintionMatch will retrieve the matched StepDefintion for the step ID and panic on error.
|
||||||
|
func (s *Storage) MustGetStepDefintionMatch(stepID string) *models.StepDefinition {
|
||||||
|
v := s.mustFirst(tableStepDefintionMatch, tableStepDefintionMatchIndexStepID, stepID)
|
||||||
|
return v.(stepDefinitionMatch).StepDefinition
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Storage) mustInsert(table string, obj interface{}) {
|
func (s *Storage) mustInsert(table string, obj interface{}) {
|
||||||
txn := s.db.Txn(writeMode)
|
txn := s.db.Txn(writeMode)
|
||||||
|
|
||||||
|
|
|
@ -185,3 +185,15 @@ func Test_MustGetFeatures(t *testing.T) {
|
||||||
actual := s.MustGetFeatures()
|
actual := s.MustGetFeatures()
|
||||||
assert.Equal(t, expected, actual)
|
assert.Equal(t, expected, actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_MustGetStepDefintionMatch(t *testing.T) {
|
||||||
|
s := storage.NewStorage()
|
||||||
|
|
||||||
|
const stepID = "<step_id>"
|
||||||
|
|
||||||
|
expected := &models.StepDefinition{}
|
||||||
|
s.MustInsertStepDefintionMatch(stepID, expected)
|
||||||
|
|
||||||
|
actual := s.MustGetStepDefintionMatch(stepID)
|
||||||
|
assert.Equal(t, expected, actual)
|
||||||
|
}
|
||||||
|
|
26
suite.go
26
suite.go
|
@ -7,6 +7,7 @@ import (
|
||||||
|
|
||||||
"github.com/cucumber/messages-go/v10"
|
"github.com/cucumber/messages-go/v10"
|
||||||
|
|
||||||
|
"github.com/cucumber/godog/formatters"
|
||||||
"github.com/cucumber/godog/internal/models"
|
"github.com/cucumber/godog/internal/models"
|
||||||
"github.com/cucumber/godog/internal/storage"
|
"github.com/cucumber/godog/internal/storage"
|
||||||
"github.com/cucumber/godog/internal/utils"
|
"github.com/cucumber/godog/internal/utils"
|
||||||
|
@ -54,7 +55,8 @@ func (s *suite) runStep(pickle *messages.Pickle, step *messages.Pickle_PickleSte
|
||||||
}
|
}
|
||||||
|
|
||||||
match := s.matchStep(step)
|
match := s.matchStep(step)
|
||||||
s.fmt.Defined(pickle, step, match)
|
s.storage.MustInsertStepDefintionMatch(step.AstNodeIds[0], match)
|
||||||
|
s.fmt.Defined(pickle, step, match.GetInternalStepDefinition())
|
||||||
|
|
||||||
// user multistep definitions may panic
|
// user multistep definitions may panic
|
||||||
defer func() {
|
defer func() {
|
||||||
|
@ -80,18 +82,18 @@ func (s *suite) runStep(pickle *messages.Pickle, step *messages.Pickle_PickleSte
|
||||||
sr.Status = models.Passed
|
sr.Status = models.Passed
|
||||||
s.storage.MustInsertPickleStepResult(sr)
|
s.storage.MustInsertPickleStepResult(sr)
|
||||||
|
|
||||||
s.fmt.Passed(pickle, step, match)
|
s.fmt.Passed(pickle, step, match.GetInternalStepDefinition())
|
||||||
case ErrPending:
|
case ErrPending:
|
||||||
sr.Status = models.Pending
|
sr.Status = models.Pending
|
||||||
s.storage.MustInsertPickleStepResult(sr)
|
s.storage.MustInsertPickleStepResult(sr)
|
||||||
|
|
||||||
s.fmt.Pending(pickle, step, match)
|
s.fmt.Pending(pickle, step, match.GetInternalStepDefinition())
|
||||||
default:
|
default:
|
||||||
sr.Status = models.Failed
|
sr.Status = models.Failed
|
||||||
sr.Err = err
|
sr.Err = err
|
||||||
s.storage.MustInsertPickleStepResult(sr)
|
s.storage.MustInsertPickleStepResult(sr)
|
||||||
|
|
||||||
s.fmt.Failed(pickle, step, match, err)
|
s.fmt.Failed(pickle, step, match.GetInternalStepDefinition(), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// run after step handlers
|
// run after step handlers
|
||||||
|
@ -105,10 +107,12 @@ func (s *suite) runStep(pickle *messages.Pickle, step *messages.Pickle_PickleSte
|
||||||
} else if len(undef) > 0 {
|
} else if len(undef) > 0 {
|
||||||
if match != nil {
|
if match != nil {
|
||||||
match = &models.StepDefinition{
|
match = &models.StepDefinition{
|
||||||
|
StepDefinition: formatters.StepDefinition{
|
||||||
|
Expr: match.Expr,
|
||||||
|
Handler: match.Handler,
|
||||||
|
},
|
||||||
Args: match.Args,
|
Args: match.Args,
|
||||||
HandlerValue: match.HandlerValue,
|
HandlerValue: match.HandlerValue,
|
||||||
Expr: match.Expr,
|
|
||||||
Handler: match.Handler,
|
|
||||||
Nested: match.Nested,
|
Nested: match.Nested,
|
||||||
Undefined: undef,
|
Undefined: undef,
|
||||||
}
|
}
|
||||||
|
@ -118,7 +122,7 @@ func (s *suite) runStep(pickle *messages.Pickle, step *messages.Pickle_PickleSte
|
||||||
sr.Status = models.Undefined
|
sr.Status = models.Undefined
|
||||||
s.storage.MustInsertPickleStepResult(sr)
|
s.storage.MustInsertPickleStepResult(sr)
|
||||||
|
|
||||||
s.fmt.Undefined(pickle, step, match)
|
s.fmt.Undefined(pickle, step, match.GetInternalStepDefinition())
|
||||||
return ErrUndefined
|
return ErrUndefined
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +131,7 @@ func (s *suite) runStep(pickle *messages.Pickle, step *messages.Pickle_PickleSte
|
||||||
sr.Status = models.Skipped
|
sr.Status = models.Skipped
|
||||||
s.storage.MustInsertPickleStepResult(sr)
|
s.storage.MustInsertPickleStepResult(sr)
|
||||||
|
|
||||||
s.fmt.Skipped(pickle, step, match)
|
s.fmt.Skipped(pickle, step, match.GetInternalStepDefinition())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,10 +207,12 @@ func (s *suite) matchStepText(text string) *models.StepDefinition {
|
||||||
// since we need to assign arguments
|
// since we need to assign arguments
|
||||||
// better to copy the step definition
|
// better to copy the step definition
|
||||||
return &models.StepDefinition{
|
return &models.StepDefinition{
|
||||||
|
StepDefinition: formatters.StepDefinition{
|
||||||
|
Expr: h.Expr,
|
||||||
|
Handler: h.Handler,
|
||||||
|
},
|
||||||
Args: args,
|
Args: args,
|
||||||
HandlerValue: h.HandlerValue,
|
HandlerValue: h.HandlerValue,
|
||||||
Expr: h.Expr,
|
|
||||||
Handler: h.Handler,
|
|
||||||
Nested: h.Nested,
|
Nested: h.Nested,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,10 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
|
||||||
"github.com/cucumber/godog/internal/builder"
|
|
||||||
"github.com/cucumber/messages-go/v10"
|
"github.com/cucumber/messages-go/v10"
|
||||||
|
|
||||||
|
"github.com/cucumber/godog/formatters"
|
||||||
|
"github.com/cucumber/godog/internal/builder"
|
||||||
"github.com/cucumber/godog/internal/models"
|
"github.com/cucumber/godog/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -41,7 +42,7 @@ type Steps []string
|
||||||
// This structure is passed to the formatter
|
// This structure is passed to the formatter
|
||||||
// when step is matched and is either failed
|
// when step is matched and is either failed
|
||||||
// or successful
|
// or successful
|
||||||
type StepDefinition = models.StepDefinition
|
type StepDefinition = formatters.StepDefinition
|
||||||
|
|
||||||
// DocString represents the DocString argument made to a step definition
|
// DocString represents the DocString argument made to a step definition
|
||||||
type DocString = messages.PickleStepArgument_PickleDocString
|
type DocString = messages.PickleStepArgument_PickleDocString
|
||||||
|
@ -179,9 +180,11 @@ func (ctx *ScenarioContext) Step(expr, stepFunc interface{}) {
|
||||||
panic(fmt.Sprintf("expected handler to return only one value, but it has: %d", typ.NumOut()))
|
panic(fmt.Sprintf("expected handler to return only one value, but it has: %d", typ.NumOut()))
|
||||||
}
|
}
|
||||||
|
|
||||||
def := &StepDefinition{
|
def := &models.StepDefinition{
|
||||||
Handler: stepFunc,
|
StepDefinition: formatters.StepDefinition{
|
||||||
Expr: regex,
|
Handler: stepFunc,
|
||||||
|
Expr: regex,
|
||||||
|
},
|
||||||
HandlerValue: v,
|
HandlerValue: v,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче