From 6254bd41b72705fc5fba02f9006302dc0c85ea80 Mon Sep 17 00:00:00 2001 From: Casper Beyer Date: Thu, 24 Sep 2020 02:12:24 +0800 Subject: fix(cli/coverage): print lines with no coverage to stdout (#7640) --- cli/coverage.rs | 92 +++++++++++++++++++++++++++------------------------------ 1 file changed, 43 insertions(+), 49 deletions(-) (limited to 'cli/coverage.rs') 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, + quiet: bool, } // TODO(caspervonb) add support for lcov output (see geninfo(1) for format spec). impl PrettyCoverageReporter { - pub fn new(coverages: Vec) -> 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::>(); - fn get_coverage_report(coverage: &Coverage) -> Option { - let mut total_lines = 0; - let mut covered_lines = 0; + let mut covered_lines: Vec = Vec::new(); + let mut uncovered_lines: Vec = 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 + ); + } + } } } -- cgit v1.2.3