add some features and expected output for pretty formatter
Этот коммит содержится в:
родитель
5bb581e3bd
коммит
edf592e2b9
8 изменённых файлов: 120 добавлений и 6 удалений
11
fmt.go
11
fmt.go
|
@ -306,16 +306,21 @@ func (f *basefmt) Summary() {
|
||||||
switch t := def.(type) {
|
switch t := def.(type) {
|
||||||
case *gherkin.Scenario:
|
case *gherkin.Scenario:
|
||||||
total++
|
total++
|
||||||
|
if len(t.Steps) == 0 {
|
||||||
|
undefined++
|
||||||
|
}
|
||||||
case *gherkin.ScenarioOutline:
|
case *gherkin.ScenarioOutline:
|
||||||
for _, ex := range t.Examples {
|
for _, ex := range t.Examples {
|
||||||
if examples, hasExamples := examples(ex); hasExamples {
|
if examples, hasExamples := examples(ex); hasExamples {
|
||||||
total += len(examples.TableBody)
|
total += len(examples.TableBody)
|
||||||
|
if len(t.Steps) == 0 {
|
||||||
|
undefined += len(examples.TableBody)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
passed = total
|
|
||||||
var owner interface{}
|
var owner interface{}
|
||||||
for _, undef := range f.undefined {
|
for _, undef := range f.undefined {
|
||||||
if owner != undef.owner {
|
if owner != undef.owner {
|
||||||
|
@ -323,6 +328,7 @@ func (f *basefmt) Summary() {
|
||||||
owner = undef.owner
|
owner = undef.owner
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
passed = total - undefined
|
||||||
|
|
||||||
var steps, parts, scenarios []string
|
var steps, parts, scenarios []string
|
||||||
nsteps := len(f.passed) + len(f.failed) + len(f.skipped) + len(f.undefined) + len(f.pending)
|
nsteps := len(f.passed) + len(f.failed) + len(f.skipped) + len(f.undefined) + len(f.pending)
|
||||||
|
@ -343,6 +349,9 @@ func (f *basefmt) Summary() {
|
||||||
passed -= undefined
|
passed -= undefined
|
||||||
parts = append(parts, yellow(fmt.Sprintf("%d undefined", undefined)))
|
parts = append(parts, yellow(fmt.Sprintf("%d undefined", undefined)))
|
||||||
steps = append(steps, yellow(fmt.Sprintf("%d undefined", len(f.undefined))))
|
steps = append(steps, yellow(fmt.Sprintf("%d undefined", len(f.undefined))))
|
||||||
|
} else if undefined > 0 {
|
||||||
|
// there may be some scenarios without steps
|
||||||
|
parts = append(parts, yellow(fmt.Sprintf("%d undefined", undefined)))
|
||||||
}
|
}
|
||||||
if len(f.skipped) > 0 {
|
if len(f.skipped) > 0 {
|
||||||
steps = append(steps, cyan(fmt.Sprintf("%d skipped", len(f.skipped))))
|
steps = append(steps, cyan(fmt.Sprintf("%d skipped", len(f.skipped))))
|
||||||
|
|
|
@ -58,7 +58,7 @@ func (f *pretty) Feature(ft *gherkin.Feature, p string, c []byte) {
|
||||||
fmt.Fprintln(f.out, "")
|
fmt.Fprintln(f.out, "")
|
||||||
}
|
}
|
||||||
f.features = append(f.features, &feature{Path: p, Feature: ft})
|
f.features = append(f.features, &feature{Path: p, Feature: ft})
|
||||||
fmt.Fprintln(f.out, whiteb(ft.Keyword+": ")+ft.Name)
|
fmt.Fprintln(f.out, whiteb(ft.Keyword+":")+" "+ft.Name)
|
||||||
if strings.TrimSpace(ft.Description) != "" {
|
if strings.TrimSpace(ft.Description) != "" {
|
||||||
for _, line := range strings.Split(ft.Description, "\n") {
|
for _, line := range strings.Split(ft.Description, "\n") {
|
||||||
fmt.Fprintln(f.out, s(f.indent)+strings.TrimSpace(line))
|
fmt.Fprintln(f.out, s(f.indent)+strings.TrimSpace(line))
|
||||||
|
@ -115,7 +115,7 @@ func (f *pretty) printUndefinedScenario(sc *gherkin.Scenario) {
|
||||||
}
|
}
|
||||||
|
|
||||||
f.commentPos = f.longestStep(sc.Steps, f.length(sc))
|
f.commentPos = f.longestStep(sc.Steps, f.length(sc))
|
||||||
text := s(f.indent) + whiteb(f.scenario.Keyword+": ") + sc.Name
|
text := s(f.indent) + whiteb(f.scenario.Keyword+":") + " " + sc.Name
|
||||||
text += s(f.commentPos-f.length(f.scenario)+1) + f.line(sc.Location)
|
text += s(f.commentPos-f.length(f.scenario)+1) + f.line(sc.Location)
|
||||||
fmt.Fprintln(f.out, "\n"+text)
|
fmt.Fprintln(f.out, "\n"+text)
|
||||||
}
|
}
|
||||||
|
@ -209,7 +209,7 @@ func (f *pretty) printOutlineExample(outline *gherkin.ScenarioOutline) {
|
||||||
// an example table header
|
// an example table header
|
||||||
if firstExample {
|
if firstExample {
|
||||||
fmt.Fprintln(f.out, "")
|
fmt.Fprintln(f.out, "")
|
||||||
fmt.Fprintln(f.out, s(f.indent*2)+whiteb(example.Keyword+": ")+example.Name)
|
fmt.Fprintln(f.out, s(f.indent*2)+whiteb(example.Keyword+":")+" "+example.Name)
|
||||||
|
|
||||||
for i, cell := range example.TableHeader.Cells {
|
for i, cell := range example.TableHeader.Cells {
|
||||||
val := cyan(cell.Value)
|
val := cyan(cell.Value)
|
||||||
|
@ -306,7 +306,7 @@ func (f *pretty) printStepKind(res *stepResult) {
|
||||||
f.commentPos = bgLen
|
f.commentPos = bgLen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
text := s(f.indent) + whiteb(f.scenario.Keyword+": ") + f.scenario.Name
|
text := s(f.indent) + whiteb(f.scenario.Keyword+":") + " " + f.scenario.Name
|
||||||
text += s(f.commentPos-f.length(f.scenario)+1) + f.line(f.scenario.Location)
|
text += s(f.commentPos-f.length(f.scenario)+1) + f.line(f.scenario.Location)
|
||||||
fmt.Fprintln(f.out, "\n"+text)
|
fmt.Fprintln(f.out, "\n"+text)
|
||||||
f.scenarioKeyword = true
|
f.scenarioKeyword = true
|
||||||
|
|
|
@ -1 +1,5 @@
|
||||||
Feature: empty feature
|
<bold-white>Feature:</bold-white> empty feature
|
||||||
|
|
||||||
|
No scenarios
|
||||||
|
No steps
|
||||||
|
0s
|
||||||
|
|
8
formatter-tests/pretty/empty_with_description
Обычный файл
8
formatter-tests/pretty/empty_with_description
Обычный файл
|
@ -0,0 +1,8 @@
|
||||||
|
<bold-white>Feature:</bold-white> empty feature
|
||||||
|
describes
|
||||||
|
an empty
|
||||||
|
feature
|
||||||
|
|
||||||
|
No scenarios
|
||||||
|
No steps
|
||||||
|
0s
|
|
@ -0,0 +1,7 @@
|
||||||
|
<bold-white>Feature:</bold-white> empty feature
|
||||||
|
|
||||||
|
<bold-white>Scenario:</bold-white> without steps <black># formatter-tests/features/empty_with_single_scenario_without_steps.feature:3</black>
|
||||||
|
|
||||||
|
1 scenarios (<yellow>1 undefined</yellow>)
|
||||||
|
No steps
|
||||||
|
0s
|
|
@ -0,0 +1,10 @@
|
||||||
|
<bold-white>Feature:</bold-white> empty feature
|
||||||
|
describes
|
||||||
|
an empty
|
||||||
|
feature
|
||||||
|
|
||||||
|
<bold-white>Scenario:</bold-white> without steps <black># formatter-tests/features/empty_with_single_scenario_without_steps_and_description.feature:6</black>
|
||||||
|
|
||||||
|
1 scenarios (<yellow>1 undefined</yellow>)
|
||||||
|
No steps
|
||||||
|
0s
|
11
formatter-tests/pretty/single_scenario_with_passing_step
Обычный файл
11
formatter-tests/pretty/single_scenario_with_passing_step
Обычный файл
|
@ -0,0 +1,11 @@
|
||||||
|
<bold-white>Feature:</bold-white> single passing scenario
|
||||||
|
describes
|
||||||
|
a single scenario
|
||||||
|
feature
|
||||||
|
|
||||||
|
<bold-white>Scenario:</bold-white> one step passing <black># formatter-tests/features/single_scenario_with_passing_step.feature:6</black>
|
||||||
|
<green>Given</green> <green>a passing step</green> <black># formatters_print_test.go:35 -> github.com/DATA-DOG/godog.TestPrintingFormatters.func4</black>
|
||||||
|
|
||||||
|
1 scenarios (<green>1 passed</green>)
|
||||||
|
1 steps (<green>1 passed</green>)
|
||||||
|
0s
|
|
@ -1 +1,66 @@
|
||||||
package godog
|
package godog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPrintingFormatters(t *testing.T) {
|
||||||
|
features, err := parseFeatures("", []string{"formatter-tests"})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to parse formatter features: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var buf bytes.Buffer
|
||||||
|
out := &tagColorWriter{w: &buf}
|
||||||
|
|
||||||
|
suite := &Suite{
|
||||||
|
features: features,
|
||||||
|
}
|
||||||
|
|
||||||
|
suite.Step(`^(?:a )?failing step`, func() error {
|
||||||
|
return fmt.Errorf("step failed")
|
||||||
|
})
|
||||||
|
suite.Step(`^this step should fail`, func() error {
|
||||||
|
return fmt.Errorf("step failed")
|
||||||
|
})
|
||||||
|
suite.Step(`^(?:a )?pending step$`, func() error {
|
||||||
|
return ErrPending
|
||||||
|
})
|
||||||
|
suite.Step(`^(?:a )?passing step$`, func() error {
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
for _, feat := range features {
|
||||||
|
for name := range AvailableFormatters() {
|
||||||
|
expectOutputPath := strings.Replace(feat.Path, "features", name, 1)
|
||||||
|
expectOutputPath = strings.TrimRight(expectOutputPath, ".feature")
|
||||||
|
if _, err := os.Stat(expectOutputPath); err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.Reset() // flush the output
|
||||||
|
suite.fmt = FindFmt(name)(name, out) // prepare formatter
|
||||||
|
suite.features = []*feature{feat} // set the feature
|
||||||
|
|
||||||
|
expectedOutput, err := ioutil.ReadFile(expectOutputPath)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
suite.run()
|
||||||
|
suite.fmt.Summary()
|
||||||
|
|
||||||
|
expected := string(expectedOutput)
|
||||||
|
actual := buf.String()
|
||||||
|
|
||||||
|
if actual != expected {
|
||||||
|
t.Fatalf("%s does not match to:\n%s", expectOutputPath, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче