109 строки
		
	
	
	
		
			2,8 КиБ
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			109 строки
		
	
	
	
		
			2,8 КиБ
		
	
	
	
		
			Go
		
	
	
	
	
	
| package godog
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"strings"
 | |
| 	"unicode/utf8"
 | |
| 
 | |
| 	"github.com/cucumber/messages-go/v10"
 | |
| )
 | |
| 
 | |
| type registeredFormatter struct {
 | |
| 	name        string
 | |
| 	description string
 | |
| 	fmt         FormatterFunc
 | |
| }
 | |
| 
 | |
| var formatters []*registeredFormatter
 | |
| 
 | |
| // FindFmt searches available formatters registered
 | |
| // and returns FormaterFunc matched by given
 | |
| // format name or nil otherwise
 | |
| func FindFmt(name string) FormatterFunc {
 | |
| 	for _, el := range formatters {
 | |
| 		if el.name == name {
 | |
| 			return el.fmt
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // Format registers a feature suite output
 | |
| // formatter by given name, description and
 | |
| // FormatterFunc constructor function, to initialize
 | |
| // formatter with the output recorder.
 | |
| func Format(name, description string, f FormatterFunc) {
 | |
| 	formatters = append(formatters, ®isteredFormatter{
 | |
| 		name:        name,
 | |
| 		fmt:         f,
 | |
| 		description: description,
 | |
| 	})
 | |
| }
 | |
| 
 | |
| // AvailableFormatters gives a map of all
 | |
| // formatters registered with their name as key
 | |
| // and description as value
 | |
| func AvailableFormatters() map[string]string {
 | |
| 	fmts := make(map[string]string, len(formatters))
 | |
| 
 | |
| 	for _, f := range formatters {
 | |
| 		fmts[f.name] = f.description
 | |
| 	}
 | |
| 
 | |
| 	return fmts
 | |
| }
 | |
| 
 | |
| // Formatter is an interface for feature runner
 | |
| // output summary presentation.
 | |
| //
 | |
| // New formatters may be created to represent
 | |
| // suite results in different ways. These new
 | |
| // formatters needs to be registered with a
 | |
| // godog.Format function call
 | |
| type Formatter interface {
 | |
| 	TestRunStarted()
 | |
| 	Feature(*messages.GherkinDocument, string, []byte)
 | |
| 	Pickle(*messages.Pickle)
 | |
| 	Defined(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition)
 | |
| 	Failed(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition, error)
 | |
| 	Passed(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition)
 | |
| 	Skipped(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition)
 | |
| 	Undefined(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition)
 | |
| 	Pending(*messages.Pickle, *messages.Pickle_PickleStep, *StepDefinition)
 | |
| 	Summary()
 | |
| }
 | |
| 
 | |
| type storageFormatter interface {
 | |
| 	setStorage(*storage)
 | |
| }
 | |
| 
 | |
| // FormatterFunc builds a formatter with given
 | |
| // suite name and io.Writer to record output
 | |
| type FormatterFunc func(string, io.Writer) Formatter
 | |
| 
 | |
| func isLastStep(pickle *messages.Pickle, step *messages.Pickle_PickleStep) bool {
 | |
| 	return pickle.Steps[len(pickle.Steps)-1].Id == step.Id
 | |
| }
 | |
| 
 | |
| func printStepDefinitions(steps []*StepDefinition, w io.Writer) {
 | |
| 	var longest int
 | |
| 	for _, def := range steps {
 | |
| 		n := utf8.RuneCountInString(def.Expr.String())
 | |
| 		if longest < n {
 | |
| 			longest = n
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	for _, def := range steps {
 | |
| 		n := utf8.RuneCountInString(def.Expr.String())
 | |
| 		location := def.definitionID()
 | |
| 		spaces := strings.Repeat(" ", longest-n)
 | |
| 		fmt.Fprintln(w, yellow(def.Expr.String())+spaces, blackb("# "+location))
 | |
| 	}
 | |
| 
 | |
| 	if len(steps) == 0 {
 | |
| 		fmt.Fprintln(w, "there were no contexts registered, could not find any step definition..")
 | |
| 	}
 | |
| }
 | 
