mirror of https://github.com/gogs/gogs.git
50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
package parser
|
|
|
|
import (
|
|
"math"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// parseTestFunctionDuration parses the duration in seconds as a float64
|
|
// from a line of go test output that looks something like this:
|
|
// --- PASS: TestOldSchool_PassesWithMessage (0.03 seconds)
|
|
func parseTestFunctionDuration(line string) float64 {
|
|
line = strings.Replace(line, "(", "", 1)
|
|
line = strings.Replace(line, ")", "", 1)
|
|
fields := strings.Split(line, " ")
|
|
return parseDurationInSeconds(fields[3], 2)
|
|
}
|
|
|
|
func parseDurationInSeconds(raw string, precision int) float64 {
|
|
elapsed, err := time.ParseDuration(raw)
|
|
if err != nil {
|
|
elapsed, _ = time.ParseDuration(raw + "s")
|
|
}
|
|
return round(elapsed.Seconds(), precision)
|
|
}
|
|
|
|
// round returns the rounded version of x with precision.
|
|
//
|
|
// Special cases are:
|
|
// round(±0) = ±0
|
|
// round(±Inf) = ±Inf
|
|
// round(NaN) = NaN
|
|
//
|
|
// Why, oh why doesn't the math package come with a round function?
|
|
// Inspiration: http://play.golang.org/p/ZmFfr07oHp
|
|
func round(x float64, precision int) float64 {
|
|
var rounder float64
|
|
pow := math.Pow(10, float64(precision))
|
|
intermediate := x * pow
|
|
|
|
if intermediate < 0.0 {
|
|
intermediate -= 0.5
|
|
} else {
|
|
intermediate += 0.5
|
|
}
|
|
rounder = float64(int64(intermediate))
|
|
|
|
return rounder / float64(pow)
|
|
}
|