package assert import ( "fmt" "runtime" "strings" "unicode" "unicode/utf8" ) func errorTrace() []string { pc := uintptr(0) file := "" line := 0 ok := false name := "" var callers []string for i := 0; ; i++ { pc, file, line, ok = runtime.Caller(i) if !ok { break } if file == "" { break } f := runtime.FuncForPC(pc) if f == nil { break } name = f.Name() if name == "testing.tRunner" { break } parts := strings.Split(file, "/") file = parts[len(parts)-1] if len(parts) > 1 { dir := parts[len(parts)-2] if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { callers = append(callers, fmt.Sprintf("%s:%d", file, line)) } } // Drop the package segments := strings.Split(name, ".") name = segments[len(segments)-1] if isTest(name, "Test") || isTest(name, "Benchmark") || isTest(name, "Example") { break } } return callers } func isTest(name, prefix string) bool { if !strings.HasPrefix(name, prefix) { return false } if len(name) == len(prefix) { // "Test" is ok return true } rune_, _ := utf8.DecodeRuneInString(name[len(prefix):]) return !unicode.IsLower(rune_) }