// PrintCoverage writes out coverage metrics after a test run in a file tree setup. // Only files that were covered by tests and not excluded are shown. func PrintCoverage(state *core.BuildState, includeFiles []string) { printf("${BOLD_WHITE}Coverage results:${RESET}\n") totalCovered := 0 totalTotal := 0 lastDir := "_" for _, file := range state.Coverage.OrderedFiles() { if !shouldInclude(file, includeFiles) { continue } dir := filepath.Dir(file) if dir != lastDir { printf("${WHITE}%s:${RESET}\n", strings.TrimRight(dir, "/")) } lastDir = dir covered, total := test.CountCoverage(state.Coverage.Files[file]) printf(" %s\n", coveragePercentage(covered, total, file[len(dir)+1:])) totalCovered += covered totalTotal += total } printf("${BOLD_WHITE}Total coverage: %s${RESET}\n", coveragePercentage(totalCovered, totalTotal, "")) }
// PrintCoverageReport writes out line-by-line coverage metrics after a test run. func PrintLineCoverageReport(state *core.BuildState, includeFiles []string) { coverageColours := map[core.LineCoverage]string{ core.NotExecutable: "${GREY}", core.Unreachable: "${YELLOW}", core.Uncovered: "${RED}", core.Covered: "${GREEN}", } printf("${BOLD_WHITE}Covered files:${RESET}\n") for _, file := range state.Coverage.OrderedFiles() { if !shouldInclude(file, includeFiles) { continue } coverage := state.Coverage.Files[file] covered, total := test.CountCoverage(coverage) printf("${BOLD_WHITE}%s: %s${RESET}\n", file, coveragePercentage(covered, total, "")) f, err := os.Open(file) if err != nil { printf("${BOLD_RED}Can't open: %s${RESET}\n", err) continue } defer f.Close() scanner := bufio.NewScanner(f) i := 0 for scanner.Scan() { if i < len(coverage) { printf("${WHITE}%4d %s%s\n", i, coverageColours[coverage[i]], scanner.Text()) } else { // Assume the lines are not executable. This happens for python, for example. printf("${WHITE}%4d ${GREY}%s\n", i, scanner.Text()) } i++ } printf("${RESET}\n") } }