From e2faf50375a0e764fe3cf76d1462830f2062270d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Czerniawski?= <33061335+lczerniawski@users.noreply.github.com> Date: Wed, 14 Aug 2024 09:37:19 +0200 Subject: feat(coverage): add breadcrumbs to deno coverage `--html` report (#24860) --- cli/tools/coverage/reporter.rs | 55 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) (limited to 'cli/tools/coverage/reporter.rs') diff --git a/cli/tools/coverage/reporter.rs b/cli/tools/coverage/reporter.rs index fe44fa4d0..6b0e5c885 100644 --- a/cli/tools/coverage/reporter.rs +++ b/cli/tools/coverage/reporter.rs @@ -475,8 +475,14 @@ impl HtmlCoverageReporter { format!("Coverage report for {node}") }; let title = title.replace(std::path::MAIN_SEPARATOR, "/"); + let breadcrumbs_parts = node + .split(std::path::MAIN_SEPARATOR) + .filter(|s| !s.is_empty()) + .collect::>(); let head = self.create_html_head(&title); - let header = self.create_html_header(&title, stats); + let breadcrumb_navigation = + self.create_breadcrumbs_navigation(&breadcrumbs_parts, is_dir); + let header = self.create_html_header(&breadcrumb_navigation, stats); let footer = self.create_html_footer(timestamp); format!( " @@ -513,7 +519,7 @@ impl HtmlCoverageReporter { /// Creates header part of the contents for html report. pub fn create_html_header( &self, - title: &str, + breadcrumb_navigation: &str, stats: &CoverageStats, ) -> String { let CoverageStats { @@ -531,7 +537,7 @@ impl HtmlCoverageReporter { format!( "
-

{title}

+

{breadcrumb_navigation}

{branch_percent:.2}% @@ -681,4 +687,47 @@ impl HtmlCoverageReporter { " ) } + + pub fn create_breadcrumbs_navigation( + &self, + breadcrumbs_parts: &[&str], + is_dir: bool, + ) -> String { + let mut breadcrumbs_html = Vec::new(); + let root_repeats = if is_dir { + breadcrumbs_parts.len() + } else { + breadcrumbs_parts.len() - 1 + }; + + let mut root_url = "../".repeat(root_repeats); + root_url += "index.html"; + breadcrumbs_html.push(format!("All files")); + + for (index, breadcrumb) in breadcrumbs_parts.iter().enumerate() { + let mut full_url = "../".repeat(breadcrumbs_parts.len() - (index + 1)); + + if index == breadcrumbs_parts.len() - 1 { + breadcrumbs_html.push(breadcrumb.to_string()); + continue; + } + + if is_dir { + full_url += "index.html"; + } else { + full_url += breadcrumb; + if index != breadcrumbs_parts.len() - 1 { + full_url += "/index.html"; + } + } + + breadcrumbs_html.push(format!("{breadcrumb}")) + } + + if breadcrumbs_parts.is_empty() { + return String::from("All files"); + } + + breadcrumbs_html.into_iter().collect::>().join(" / ") + } } -- cgit v1.2.3