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 | |
parent | e1b61d6794facf2d8da4d13273685dc0a5248aed (diff) |
fix(cli/coverage): print lines with no coverage to stdout (#7640)
-rw-r--r-- | cli/coverage.rs | 92 | ||||
-rw-r--r-- | cli/main.rs | 17 | ||||
-rw-r--r-- | cli/tests/test_coverage.out | 25 |
3 files changed, 71 insertions, 63 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 + ); + } + } } } diff --git a/cli/main.rs b/cli/main.rs index a7ca754c7..5d4d31a3d 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -609,19 +609,16 @@ async fn test_command( (&mut *worker).await?; if let Some(coverage_collector) = maybe_coverage_collector.as_mut() { - let script_coverage = coverage_collector.collect().await?; + let coverages = coverage_collector.collect().await?; coverage_collector.stop_collecting().await?; - let filtered_coverage = coverage::filter_script_coverages( - script_coverage, - test_file_url, - test_modules, - ); + let filtered_coverages = + coverage::filter_script_coverages(coverages, test_file_url, test_modules); - let pretty_coverage_reporter = - PrettyCoverageReporter::new(filtered_coverage); - let report = pretty_coverage_reporter.get_report(); - print!("{}", report) + let mut coverage_reporter = PrettyCoverageReporter::new(quiet); + for coverage in filtered_coverages { + coverage_reporter.visit_coverage(&coverage); + } } Ok(()) diff --git a/cli/tests/test_coverage.out b/cli/tests/test_coverage.out index 85e229881..f189a92ee 100644 --- a/cli/tests/test_coverage.out +++ b/cli/tests/test_coverage.out @@ -4,7 +4,24 @@ test returnsHiSuccess ... ok ([WILDCARD]) test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out ([WILDCARD]) -test coverage: -file://[WILDCARD]/cli/tests/subdir/mod1.ts 57.143% -file://[WILDCARD]/cli/tests/subdir/subdir2/mod2.ts 50.000% -file://[WILDCARD]/cli/tests/subdir/print_hello.ts 50.000% +cover [WILDCARD]/cli/tests/subdir/mod1.ts ... 35.714% (5/14) + 5 | export function returnsFoo2() { + 6 | return returnsFoo(); + 7 | } + 8 | export function printHello3() { + 9 | printHello2(); + 10 | } + 11 | export function throwsError() { + 12 | throw Error("exception from mod1"); + 13 | } +cover [WILDCARD]/cli/tests/subdir/subdir2/mod2.ts ... 25.000% (2/8) + 2 | export function returnsFoo() { + 3 | return "Foo"; + 4 | } + 5 | export function printHello2() { + 6 | printHello(); + 7 | } +cover [WILDCARD]/cli/tests/subdir/print_hello.ts ... 25.000% (1/4) + 1 | export function printHello() { + 2 | console.log("Hello"); + 3 | } |