104 строки
2,6 КиБ
Go
104 строки
2,6 КиБ
Go
package formatters
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
"runtime"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/cucumber/godog/colors"
|
|
"github.com/cucumber/godog/internal/models"
|
|
"github.com/cucumber/godog/internal/utils"
|
|
"github.com/cucumber/messages-go/v10"
|
|
)
|
|
|
|
var (
|
|
red = colors.Red
|
|
redb = colors.Bold(colors.Red)
|
|
green = colors.Green
|
|
blackb = colors.Bold(colors.Black)
|
|
yellow = colors.Yellow
|
|
cyan = colors.Cyan
|
|
cyanb = colors.Bold(colors.Cyan)
|
|
whiteb = colors.Bold(colors.White)
|
|
)
|
|
|
|
// repeats a space n times
|
|
var s = utils.S
|
|
|
|
var (
|
|
passed = models.Passed
|
|
failed = models.Failed
|
|
skipped = models.Skipped
|
|
undefined = models.Undefined
|
|
pending = models.Pending
|
|
)
|
|
|
|
type sortFeaturesByName []*models.Feature
|
|
|
|
func (s sortFeaturesByName) Len() int { return len(s) }
|
|
func (s sortFeaturesByName) Less(i, j int) bool { return s[i].Feature.Name < s[j].Feature.Name }
|
|
func (s sortFeaturesByName) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
|
|
|
type sortPicklesByID []*messages.Pickle
|
|
|
|
func (s sortPicklesByID) Len() int { return len(s) }
|
|
func (s sortPicklesByID) Less(i, j int) bool {
|
|
iID := mustConvertStringToInt(s[i].Id)
|
|
jID := mustConvertStringToInt(s[j].Id)
|
|
return iID < jID
|
|
}
|
|
func (s sortPicklesByID) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
|
|
|
type sortPickleStepResultsByPickleStepID []models.PickleStepResult
|
|
|
|
func (s sortPickleStepResultsByPickleStepID) Len() int { return len(s) }
|
|
func (s sortPickleStepResultsByPickleStepID) Less(i, j int) bool {
|
|
iID := mustConvertStringToInt(s[i].PickleStepID)
|
|
jID := mustConvertStringToInt(s[j].PickleStepID)
|
|
return iID < jID
|
|
}
|
|
func (s sortPickleStepResultsByPickleStepID) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
|
|
|
func mustConvertStringToInt(s string) int {
|
|
i, err := strconv.Atoi(s)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return i
|
|
}
|
|
|
|
// DefinitionID ...
|
|
func DefinitionID(sd *models.StepDefinition) string {
|
|
ptr := sd.HandlerValue.Pointer()
|
|
f := runtime.FuncForPC(ptr)
|
|
file, line := f.FileLine(ptr)
|
|
dir := filepath.Dir(file)
|
|
|
|
fn := strings.Replace(f.Name(), dir, "", -1)
|
|
var parts []string
|
|
for _, gr := range matchFuncDefRef.FindAllStringSubmatch(fn, -1) {
|
|
parts = append(parts, strings.Trim(gr[1], "_."))
|
|
}
|
|
if len(parts) > 0 {
|
|
// case when suite is a structure with methods
|
|
fn = strings.Join(parts, ".")
|
|
} else {
|
|
// case when steps are just plain funcs
|
|
fn = strings.Trim(fn, "_.")
|
|
}
|
|
|
|
if pkg := os.Getenv("GODOG_TESTED_PACKAGE"); len(pkg) > 0 {
|
|
fn = strings.Replace(fn, pkg, "", 1)
|
|
fn = strings.TrimLeft(fn, ".")
|
|
fn = strings.Replace(fn, "..", ".", -1)
|
|
}
|
|
|
|
return fmt.Sprintf("%s:%d -> %s", filepath.Base(file), line, fn)
|
|
}
|
|
|
|
var matchFuncDefRef = regexp.MustCompile(`\(([^\)]+)\)`)
|