Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 48 additions & 108 deletions fmt.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,25 +139,25 @@ func (st stepResultStatus) String() string {
}
}

type stepResult struct {
status stepResultStatus
time time.Time
err error
type pickleStepResult struct {
Status stepResultStatus
finishedAt time.Time
err error

pickleID string
pickleStepID string
PickleID string
PickleStepID string

def *StepDefinition
}

func newStepResult(pickleID, pickleStepID string, match *StepDefinition) *stepResult {
return &stepResult{time: timeNowFunc(), pickleID: pickleID, pickleStepID: pickleStepID, def: match}
func newStepResult(pickleID, pickleStepID string, match *StepDefinition) pickleStepResult {
return pickleStepResult{finishedAt: timeNowFunc(), PickleID: pickleID, PickleStepID: pickleStepID, def: match}
}

func newBaseFmt(suite string, out io.Writer) *basefmt {
return &basefmt{
suiteName: suite,
started: timeNowFunc(),
startedAt: timeNowFunc(),
indent: 2,
out: out,
lock: new(sync.Mutex),
Expand All @@ -173,8 +173,8 @@ type basefmt struct {

storage *storage

started time.Time
features []*feature
startedAt time.Time
features []*feature

firstFeature *bool
lock *sync.Mutex
Expand All @@ -188,10 +188,6 @@ func (f *basefmt) lastFeature() *feature {
return f.features[len(f.features)-1]
}

func (f *basefmt) lastStepResult() *stepResult {
return f.lastFeature().lastStepResult()
}

func (f *basefmt) findFeature(scenarioAstID string) *feature {
for _, ft := range f.features {
if sc := ft.findScenario(scenarioAstID); sc != nil {
Expand Down Expand Up @@ -250,15 +246,7 @@ func (f *basefmt) TestRunStarted() {
f.firstFeature = &firstFeature
}

func (f *basefmt) Pickle(p *messages.Pickle) {
f.lock.Lock()
defer f.lock.Unlock()

feature := f.features[len(f.features)-1]

pr := pickleResult{pickleID: p.Id, time: timeNowFunc()}
feature.pickleResults = append(feature.pickleResults, &pr)
}
func (f *basefmt) Pickle(p *messages.Pickle) {}

func (f *basefmt) Defined(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition) {}

Expand All @@ -268,95 +256,61 @@ func (f *basefmt) Feature(ft *messages.GherkinDocument, p string, c []byte) {

*f.firstFeature = false

f.features = append(f.features, &feature{path: p, GherkinDocument: ft, time: timeNowFunc()})
f.features = append(f.features, &feature{GherkinDocument: ft, time: timeNowFunc()})
}

func (f *basefmt) Passed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *StepDefinition) {
f.lock.Lock()
defer f.lock.Unlock()

s := newStepResult(pickle.Id, step.Id, match)
s.status = passed
f.lastFeature().appendStepResult(s)
}

func (f *basefmt) Skipped(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *StepDefinition) {
f.lock.Lock()
defer f.lock.Unlock()

s := newStepResult(pickle.Id, step.Id, match)
s.status = skipped
f.lastFeature().appendStepResult(s)
}

func (f *basefmt) Undefined(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *StepDefinition) {
f.lock.Lock()
defer f.lock.Unlock()

s := newStepResult(pickle.Id, step.Id, match)
s.status = undefined
f.lastFeature().appendStepResult(s)
}

func (f *basefmt) Failed(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *StepDefinition, err error) {
f.lock.Lock()
defer f.lock.Unlock()

s := newStepResult(pickle.Id, step.Id, match)
s.status = failed
s.err = err
f.lastFeature().appendStepResult(s)
}

func (f *basefmt) Pending(pickle *messages.Pickle, step *messages.Pickle_PickleStep, match *StepDefinition) {
f.lock.Lock()
defer f.lock.Unlock()

s := newStepResult(pickle.Id, step.Id, match)
s.status = pending
f.lastFeature().appendStepResult(s)
}

func (f *basefmt) Summary() {
var totalSc, passedSc, undefinedSc int
var totalSt, passedSt, failedSt, skippedSt, pendingSt, undefinedSt int

for _, feat := range f.features {
for _, pr := range feat.pickleResults {
var prStatus stepResultStatus
totalSc++
pickleResults := f.storage.mustGetPickleResults()
for _, pr := range pickleResults {
var prStatus stepResultStatus
totalSc++

if len(pr.stepResults) == 0 {
prStatus = undefined
}
pickleStepResults := f.storage.mustGetPickleStepResultsByPickleID(pr.PickleID)

for _, sr := range pr.stepResults {
totalSt++

switch sr.status {
case passed:
prStatus = passed
passedSt++
case failed:
prStatus = failed
failedSt++
case skipped:
skippedSt++
case undefined:
prStatus = undefined
undefinedSt++
case pending:
prStatus = pending
pendingSt++
}
}
if len(pickleStepResults) == 0 {
prStatus = undefined
}

if prStatus == passed {
passedSc++
} else if prStatus == undefined {
undefinedSc++
for _, sr := range pickleStepResults {
totalSt++

switch sr.Status {
case passed:
prStatus = passed
passedSt++
case failed:
prStatus = failed
failedSt++
case skipped:
skippedSt++
case undefined:
prStatus = undefined
undefinedSt++
case pending:
prStatus = pending
pendingSt++
}
}

if prStatus == passed {
passedSc++
} else if prStatus == undefined {
undefinedSc++
}
}

var steps, parts, scenarios []string
Expand Down Expand Up @@ -385,7 +339,7 @@ func (f *basefmt) Summary() {
scenarios = append(scenarios, green(fmt.Sprintf("%d passed", passedSc)))
}
scenarios = append(scenarios, parts...)
elapsed := timeNowFunc().Sub(f.started)
elapsed := timeNowFunc().Sub(f.startedAt)

fmt.Fprintln(f.out, "")

Expand Down Expand Up @@ -437,22 +391,8 @@ func (f *basefmt) Copy(cf ConcurrentFormatter) {
}
}

func (f *basefmt) findStepResults(status stepResultStatus) (res []*stepResult) {
for _, feat := range f.features {
for _, pr := range feat.pickleResults {
for _, sr := range pr.stepResults {
if sr.status == status {
res = append(res, sr)
}
}
}
}

return
}

func (f *basefmt) snippets() string {
undefinedStepResults := f.findStepResults(undefined)
undefinedStepResults := f.storage.mustGetPickleStepResultsByStatus(undefined)
if len(undefinedStepResults) == 0 {
return ""
}
Expand All @@ -461,7 +401,7 @@ func (f *basefmt) snippets() string {
var snips []undefinedSnippet
// build snippets
for _, u := range undefinedStepResults {
pickleStep := f.storage.mustGetPickleStep(u.pickleStepID)
pickleStep := f.storage.mustGetPickleStep(u.PickleStepID)

steps := []string{pickleStep.Text}
arg := pickleStep.Argument
Expand Down
42 changes: 25 additions & 17 deletions fmt_cucumber.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ import (
"io"
"sort"
"strings"

"github.com/cucumber/messages-go/v10"
)

func init() {
Expand Down Expand Up @@ -61,7 +63,11 @@ func (f *cukefmt) buildCukeFeatures(features []*feature) (res []cukeFeatureJSON)

for idx, feat := range features {
cukeFeature := buildCukeFeature(feat)
cukeFeature.Elements = f.buildCukeElements(feat.pickleResults)

pickles := f.storage.mustGetPickles(feat.Uri)
sort.Sort(sortPicklesByID(pickles))

cukeFeature.Elements = f.buildCukeElements(pickles)

for jdx, elem := range cukeFeature.Elements {
elem.ID = cukeFeature.ID + ";" + makeCukeID(elem.Name) + elem.ID
Expand All @@ -75,26 +81,29 @@ func (f *cukefmt) buildCukeFeatures(features []*feature) (res []cukeFeatureJSON)
return res
}

func (f *cukefmt) buildCukeElements(pickleResults []*pickleResult) (res []cukeElement) {
res = make([]cukeElement, len(pickleResults))
func (f *cukefmt) buildCukeElements(pickles []*messages.Pickle) (res []cukeElement) {
res = make([]cukeElement, len(pickles))

for idx, pickleResult := range pickleResults {
pickle := f.storage.mustGetPickle(pickleResult.pickleID)
for idx, pickle := range pickles {
pickleResult := f.storage.mustGetPickleResult(pickle.Id)
pickleStepResults := f.storage.mustGetPickleStepResultsByPickleID(pickle.Id)

cukeElement := f.buildCukeElement(pickle.Name, pickle.AstNodeIds)

stepStartedAt := pickleResult.startedAt()
stepStartedAt := pickleResult.StartedAt

cukeElement.Steps = make([]cukeStep, len(pickleStepResults))
sort.Sort(sortPickleStepResultsByPickleStepID(pickleStepResults))

cukeElement.Steps = make([]cukeStep, len(pickleResult.stepResults))
for jdx, stepResult := range pickleResult.stepResults {
cukeStep := f.buildCukeStep(stepResult)
for jdx, stepResult := range pickleStepResults {
cukeStep := f.buildCukeStep(pickle, stepResult)

stepResultFinishedAt := stepResult.time
stepResultFinishedAt := stepResult.finishedAt
d := int(stepResultFinishedAt.Sub(stepStartedAt).Nanoseconds())
stepStartedAt = stepResultFinishedAt

cukeStep.Result.Duration = &d
if stepResult.status == undefined || stepResult.status == pending || stepResult.status == skipped {
if stepResult.Status == undefined || stepResult.Status == pending || stepResult.Status == skipped {
cukeStep.Result.Duration = nil
}

Expand Down Expand Up @@ -172,7 +181,7 @@ type cukeFeatureJSON struct {

func buildCukeFeature(feat *feature) cukeFeatureJSON {
cukeFeature := cukeFeatureJSON{
URI: feat.path,
URI: feat.Uri,
ID: makeCukeID(feat.Feature.Name),
Keyword: feat.Feature.Keyword,
Name: feat.Feature.Name,
Expand Down Expand Up @@ -238,9 +247,8 @@ func (f *cukefmt) buildCukeElement(pickleName string, pickleAstNodeIDs []string)
return cukeElement
}

func (f *cukefmt) buildCukeStep(stepResult *stepResult) (cukeStep cukeStep) {
pickle := f.storage.mustGetPickle(stepResult.pickleID)
pickleStep := f.storage.mustGetPickleStep(stepResult.pickleStepID)
func (f *cukefmt) buildCukeStep(pickle *messages.Pickle, stepResult pickleStepResult) (cukeStep cukeStep) {
pickleStep := f.storage.mustGetPickleStep(stepResult.PickleStepID)
step := f.findStep(pickleStep.AstNodeIds[0])

line := step.Location.Line
Expand Down Expand Up @@ -277,12 +285,12 @@ func (f *cukefmt) buildCukeStep(stepResult *stepResult) (cukeStep cukeStep) {
cukeStep.Match.Location = strings.Split(stepResult.def.definitionID(), " ")[0]
}

cukeStep.Result.Status = stepResult.status.String()
cukeStep.Result.Status = stepResult.Status.String()
if stepResult.err != nil {
cukeStep.Result.Error = stepResult.err.Error()
}

if stepResult.status == undefined || stepResult.status == pending {
if stepResult.Status == undefined || stepResult.Status == pending {
cukeStep.Match.Location = fmt.Sprintf("%s:%d", pickle.Uri, step.Location.Line)
}

Expand Down
Loading