12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- 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)
- }
|