diff options
author | Casper Beyer <caspervonb@pm.me> | 2020-09-24 02:12:24 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-23 14:12:24 -0400 |
commit | 6254bd41b72705fc5fba02f9006302dc0c85ea80 (patch) | |
tree | 85afcfae469596ed3e84b06cae2891aec57009c3 /cli/coverage.rs | |
parent | e1b61d6794facf2d8da4d13273685dc0a5248aed (diff) |
fix(cli/coverage): print lines with no coverage to stdout (#7640)
Diffstat (limited to 'cli/coverage.rs')
-rw-r--r-- | cli/coverage.rs | 92 |
1 files changed, 43 insertions, 49 deletions
diff --git a/cli/coverage.rs b/cli/coverage.rs index 969e7ea78..4d251a0b7 100644 --- a/cli/coverage.rs +++ b/cli/coverage.rs @@ -240,35 +240,23 @@ pub struct GetScriptSourceResult { } pub struct PrettyCoverageReporter { - coverages: Vec<Coverage>, + quiet: bool, } // TODO(caspervonb) add support for lcov output (see geninfo(1) for format spec). impl PrettyCoverageReporter { - pub fn new(coverages: Vec<Coverage>) -> PrettyCoverageReporter { - PrettyCoverageReporter { coverages } + pub fn new(quiet: bool) -> PrettyCoverageReporter { + PrettyCoverageReporter { quiet } } - pub fn get_report(&self) -> String { - let mut report = String::from("test coverage:\n"); - - for coverage in &self.coverages { - if let Some(coverage_report) = Self::get_coverage_report(coverage) { - report.push_str(&format!("{}\n", coverage_report)) - } - } - - report - } + pub fn visit_coverage(&mut self, coverage: &Coverage) { + let lines = coverage.script_source.lines().collect::<Vec<_>>(); - fn get_coverage_report(coverage: &Coverage) -> Option<String> { - let mut total_lines = 0; - let mut covered_lines = 0; + let mut covered_lines: Vec<usize> = Vec::new(); + let mut uncovered_lines: Vec<usize> = Vec::new(); - let mut line_offset = 0; - - for line in coverage.script_source.lines() { - let line_start_offset = line_offset; + let mut line_start_offset = 0; + for (index, line) in lines.iter().enumerate() { let line_end_offset = line_start_offset + line.len(); let mut count = 0; @@ -277,47 +265,53 @@ impl PrettyCoverageReporter { if range.start_offset <= line_start_offset && range.end_offset >= line_end_offset { - count += range.count; if range.count == 0 { count = 0; break; } + + count += range.count; } } - } + line_start_offset = line_end_offset; + } if count > 0 { - covered_lines += 1; + covered_lines.push(index); + } else { + uncovered_lines.push(index); } - - total_lines += 1; - line_offset += line.len(); } - let line_ratio = covered_lines as f32 / total_lines as f32; - let line_coverage = format!("{:.3}%", line_ratio * 100.0); + if !self.quiet { + print!("cover {} ... ", coverage.script_coverage.url); - let line = if line_ratio >= 0.9 { - format!( - "{} {}", - coverage.script_coverage.url, - colors::green(&line_coverage) - ) - } else if line_ratio >= 0.75 { - format!( - "{} {}", - coverage.script_coverage.url, - colors::yellow(&line_coverage) - ) - } else { - format!( - "{} {}", - coverage.script_coverage.url, - colors::red(&line_coverage) - ) - }; + let line_coverage_ratio = covered_lines.len() as f32 / lines.len() as f32; + let line_coverage = format!( + "{:.3}% ({}/{})", + line_coverage_ratio * 100.0, + covered_lines.len(), + lines.len() + ); + + if line_coverage_ratio >= 0.9 { + println!("{}", colors::green(&line_coverage)); + } else if line_coverage_ratio >= 0.75 { + println!("{}", colors::yellow(&line_coverage)); + } else { + println!("{}", colors::red(&line_coverage)); + } - Some(line) + for line_index in uncovered_lines { + println!( + "{:width$}{} {}", + line_index + 1, + colors::gray(" |"), + colors::red(&lines[line_index]), + width = 4 + ); + } + } } } |