godog/internal/formatters/fmt_multi.go
John Lonergan bcf6bce793
ambiguous step def detection akin to cucumber jvm (#636)
* added basic detection for ambiguous steps, but causes an error and not yet recorded in the reports as 'Ambiguous', and no test cases figured out yet

* added initial support for detection of ambiguous steps - further work take a look at how cuke jvm report ambiguous steps and sets the step status to 'ambiguous' rather than my current solution which just blows the test up as a regular step error

* added suite_context_test and also introduced missing 'ambiguous' status to make cucumber jvm'

* update CHANGELOG for ambiguous step defs

* missed file from commit

* added internal/formatters/fmt_multi_test.go

* add tests for other peoples code

* added "ambigous" to the help text

* tests

* added some more tests for attachments

* Update internal/flags/flags.go

Co-authored-by: Viacheslav Poturaev <nanopeni@gmail.com>

---------

Co-authored-by: Viacheslav Poturaev <nanopeni@gmail.com>
2024-07-01 10:28:39 +01:00

139 строки
3,6 КиБ
Go

package formatters
import (
"io"
"github.com/cucumber/godog/formatters"
"github.com/cucumber/godog/internal/storage"
messages "github.com/cucumber/messages/go/v21"
)
// MultiFormatter passes test progress to multiple formatters.
type MultiFormatter struct {
formatters []formatter
repeater repeater
}
type formatter struct {
fmt formatters.FormatterFunc
out io.Writer
}
type repeater []formatters.Formatter
type storageFormatter interface {
SetStorage(s *storage.Storage)
}
// SetStorage passes storage to all added formatters.
func (r repeater) SetStorage(s *storage.Storage) {
for _, f := range r {
if ss, ok := f.(storageFormatter); ok {
ss.SetStorage(s)
}
}
}
// TestRunStarted triggers TestRunStarted for all added formatters.
func (r repeater) TestRunStarted() {
for _, f := range r {
f.TestRunStarted()
}
}
// Feature triggers Feature for all added formatters.
func (r repeater) Feature(document *messages.GherkinDocument, s string, bytes []byte) {
for _, f := range r {
f.Feature(document, s, bytes)
}
}
// Pickle triggers Pickle for all added formatters.
func (r repeater) Pickle(pickle *messages.Pickle) {
for _, f := range r {
f.Pickle(pickle)
}
}
// Defined triggers Defined for all added formatters.
func (r repeater) Defined(pickle *messages.Pickle, step *messages.PickleStep, definition *formatters.StepDefinition) {
for _, f := range r {
f.Defined(pickle, step, definition)
}
}
// Failed triggers Failed for all added formatters.
func (r repeater) Failed(pickle *messages.Pickle, step *messages.PickleStep, definition *formatters.StepDefinition, err error) {
for _, f := range r {
f.Failed(pickle, step, definition, err)
}
}
// Passed triggers Passed for all added formatters.
func (r repeater) Passed(pickle *messages.Pickle, step *messages.PickleStep, definition *formatters.StepDefinition) {
for _, f := range r {
f.Passed(pickle, step, definition)
}
}
// Skipped triggers Skipped for all added formatters.
func (r repeater) Skipped(pickle *messages.Pickle, step *messages.PickleStep, definition *formatters.StepDefinition) {
for _, f := range r {
f.Skipped(pickle, step, definition)
}
}
// Undefined triggers Undefined for all added formatters.
func (r repeater) Undefined(pickle *messages.Pickle, step *messages.PickleStep, definition *formatters.StepDefinition) {
for _, f := range r {
f.Undefined(pickle, step, definition)
}
}
// Pending triggers Pending for all added formatters.
func (r repeater) Pending(pickle *messages.Pickle, step *messages.PickleStep, definition *formatters.StepDefinition) {
for _, f := range r {
f.Pending(pickle, step, definition)
}
}
// Ambiguous triggers Ambiguous for all added formatters.
func (r repeater) Ambiguous(pickle *messages.Pickle, step *messages.PickleStep, definition *formatters.StepDefinition, err error) {
for _, f := range r {
f.Ambiguous(pickle, step, definition, err)
}
}
// Summary triggers Summary for all added formatters.
func (r repeater) Summary() {
for _, f := range r {
f.Summary()
}
}
// Add adds formatter with output writer.
func (m *MultiFormatter) Add(name string, out io.Writer) {
f := formatters.FindFmt(name)
if f == nil {
panic("formatter not found: " + name)
}
m.formatters = append(m.formatters, formatter{
fmt: f,
out: out,
})
}
// FormatterFunc implements the FormatterFunc for the multi formatter.
func (m *MultiFormatter) FormatterFunc(suite string, out io.Writer) formatters.Formatter {
for _, f := range m.formatters {
out := out
if f.out != nil {
out = f.out
}
m.repeater = append(m.repeater, f.fmt(suite, out))
}
return m.repeater
}