From 93a13812a981e1f81794efe63f833f747ab36827 Mon Sep 17 00:00:00 2001 From: steven Date: Thu, 23 Jul 2026 21:40:02 -0600 Subject: [PATCH] fix(forge): clarify empty coverage --- crates/forge/src/cmd/coverage.rs | 9 +- crates/forge/src/coverage.rs | 33 ++-- crates/forge/tests/cli/coverage.rs | 243 ++++++++++++------------ crates/forge/tests/cli/inline_config.rs | 10 +- 4 files changed, 158 insertions(+), 137 deletions(-) diff --git a/crates/forge/src/cmd/coverage.rs b/crates/forge/src/cmd/coverage.rs index 4b8a42536b438..95f458879e10f 100644 --- a/crates/forge/src/cmd/coverage.rs +++ b/crates/forge/src/cmd/coverage.rs @@ -40,7 +40,12 @@ foundry_config::impl_figment_convert!(CoverageArgs, test); /// option in `foundry.toml`. CLI flags take precedence over config; the helper /// `resolve_with` merges them after the config is loaded. #[derive(Parser)] -#[command(after_long_help = r#"Compatibility: +#[command(after_long_help = r#"Source attribution: + Coverage follows compiler source maps. Inherited modifier code is reported under the + source where the modifier is declared. Dependency sources are excluded by default; + use `--include-libs` to include their coverage. + +Compatibility: `forge coverage` supports test filters and `--watch`, but not test-only output or execution modes such as `--json`, `--junit`, `--list`, `--debug`, flame profiles, symbolic artifact replay, showmap replay, brutalization, or mutation testing. Use @@ -91,7 +96,7 @@ pub struct CoverageArgs { )] report_file: Option, - /// Whether to include libraries in the coverage report. + /// Include dependency sources in the coverage report. #[arg(long)] include_libs: bool, diff --git a/crates/forge/src/coverage.rs b/crates/forge/src/coverage.rs index c0903bfa9e503..845043d142683 100644 --- a/crates/forge/src/coverage.rs +++ b/crates/forge/src/coverage.rs @@ -90,20 +90,31 @@ impl CoverageReporter for CoverageSummaryReporter { } fn format_cell(hits: usize, total: usize) -> Cell { - let percentage = if total == 0 { 1. } else { hits as f64 / total as f64 }; + if total == 0 { + return Cell::new(format!("N/A ({hits}/{total})")) + .fg(Color::Grey) + .add_attribute(Attribute::Dim); + } - let mut cell = - Cell::new(format!("{:.2}% ({hits}/{total})", percentage * 100.)).fg(match percentage { - _ if total == 0 => Color::Grey, - _ if percentage < 0.5 => Color::Red, - _ if percentage < 0.75 => Color::Yellow, - _ => Color::Green, - }); + let percentage = hits as f64 / total as f64; + Cell::new(format!("{:.2}% ({hits}/{total})", percentage * 100.)).fg(match percentage { + _ if percentage < 0.5 => Color::Red, + _ if percentage < 0.75 => Color::Yellow, + _ => Color::Green, + }) +} - if total == 0 { - cell = cell.add_attribute(Attribute::Dim); +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn empty_summary_cell_is_not_applicable() { + assert_eq!( + format_cell(0, 0), + Cell::new("N/A (0/0)").fg(Color::Grey).add_attribute(Attribute::Dim) + ); } - cell } /// Writes the coverage report in [LCOV]'s [tracefile format]. diff --git a/crates/forge/tests/cli/coverage.rs b/crates/forge/tests/cli/coverage.rs index d2575cf516448..7cbc6f8621d8f 100644 --- a/crates/forge/tests/cli/coverage.rs +++ b/crates/forge/tests/cli/coverage.rs @@ -31,15 +31,15 @@ Suite result: ok. 2 passed; 0 failed; 0 skipped; [ELAPSED] Ran 1 test suite [ELAPSED]: 2 tests passed, 0 failed, 0 skipped (2 total tests) Wrote LCOV report. -╭----------------------+---------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+======================================================================================+ -| script/Counter.s.sol | 0.00% (0/5) | 0.00% (0/3) | 100.00% (0/0) | 0.00% (0/2) | -|----------------------+---------------+---------------+---------------+---------------| -| src/Counter.sol | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -|----------------------+---------------+---------------+---------------+---------------| -| Total | 44.44% (4/9) | 40.00% (2/5) | 100.00% (0/0) | 50.00% (2/4) | -╰----------------------+---------------+---------------+---------------+---------------╯ +╭----------------------+---------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++===================================================================================+ +| script/Counter.s.sol | 0.00% (0/5) | 0.00% (0/3) | N/A (0/0) | 0.00% (0/2) | +|----------------------+---------------+---------------+------------+---------------| +| src/Counter.sol | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +|----------------------+---------------+---------------+------------+---------------| +| Total | 44.44% (4/9) | 40.00% (2/5) | N/A (0/0) | 50.00% (2/4) | +╰----------------------+---------------+---------------+------------+---------------╯ "# ]]); @@ -236,13 +236,13 @@ contract AContractTest is DSTest { // Assert 100% coverage (init function coverage called in setUp is accounted). cmd.arg("coverage").assert_success().stdout_eq(str![[r#" ... -╭-------------------+---------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+===================================================================================+ -| src/AContract.sol | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -|-------------------+---------------+---------------+---------------+---------------| -| Total | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -╰-------------------+---------------+---------------+---------------+---------------╯ +╭-------------------+---------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++================================================================================+ +| src/AContract.sol | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +|-------------------+---------------+---------------+------------+---------------| +| Total | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +╰-------------------+---------------+---------------+------------+---------------╯ "#]]); }); @@ -290,10 +290,10 @@ contract AContractTest is DSTest { // Assert 100% coverage (init function coverage called in setUp is accounted). cmd.arg("coverage").args(["--md"]).assert_success().stdout_eq(str![[r#" ... -| File | % Lines | % Statements | % Branches | % Funcs | -|-------------------|---------------|---------------|---------------|---------------| -| src/AContract.sol | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -| Total | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | +| File | % Lines | % Statements | % Branches | % Funcs | +|-------------------|---------------|---------------|------------|---------------| +| src/AContract.sol | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +| Total | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | "#]]); }); @@ -380,13 +380,13 @@ contract BContractTest is DSTest { cmd.arg("coverage").arg("--no-match-coverage=AContract").assert_success().stdout_eq(str![[ r#" ... -╭-------------------+---------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+===================================================================================+ -| src/BContract.sol | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -|-------------------+---------------+---------------+---------------+---------------| -| Total | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -╰-------------------+---------------+---------------+---------------+---------------╯ +╭-------------------+---------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++================================================================================+ +| src/BContract.sol | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +|-------------------+---------------+---------------+------------+---------------| +| Total | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +╰-------------------+---------------+---------------+------------+---------------╯ "# ]]); @@ -482,13 +482,13 @@ contract BContractTest is DSTest { // appears in the report. cmd.arg("coverage").assert_success().stdout_eq(str![[r#" ... -╭-------------------+---------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+===================================================================================+ -| src/BContract.sol | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -|-------------------+---------------+---------------+---------------+---------------| -| Total | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -╰-------------------+---------------+---------------+---------------+---------------╯ +╭-------------------+---------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++================================================================================+ +| src/BContract.sol | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +|-------------------+---------------+---------------+------------+---------------| +| Total | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +╰-------------------+---------------+---------------+------------+---------------╯ "#]]); }); @@ -538,13 +538,13 @@ contract AContractTest is DSTest { cmd.arg("coverage").args(["--mt", "testAssertRevertBranch"]).assert_success().stdout_eq(str![ [r#" ... -╭-------------------+--------------+--------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+=================================================================================+ -| src/AContract.sol | 66.67% (2/3) | 50.00% (1/2) | 100.00% (0/0) | 100.00% (1/1) | -|-------------------+--------------+--------------+---------------+---------------| -| Total | 66.67% (2/3) | 50.00% (1/2) | 100.00% (0/0) | 100.00% (1/1) | -╰-------------------+--------------+--------------+---------------+---------------╯ +╭-------------------+--------------+--------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++==============================================================================+ +| src/AContract.sol | 66.67% (2/3) | 50.00% (1/2) | N/A (0/0) | 100.00% (1/1) | +|-------------------+--------------+--------------+------------+---------------| +| Total | 66.67% (2/3) | 50.00% (1/2) | N/A (0/0) | 100.00% (1/1) | +╰-------------------+--------------+--------------+------------+---------------╯ "#] ]); @@ -553,13 +553,13 @@ contract AContractTest is DSTest { cmd.forge_fuse().arg("coverage").args(["--mt", "testAssertBranch"]).assert_success().stdout_eq( str![[r#" ... -╭-------------------+---------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+===================================================================================+ -| src/AContract.sol | 100.00% (3/3) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (1/1) | -|-------------------+---------------+---------------+---------------+---------------| -| Total | 100.00% (3/3) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (1/1) | -╰-------------------+---------------+---------------+---------------+---------------╯ +╭-------------------+---------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++================================================================================+ +| src/AContract.sol | 100.00% (3/3) | 100.00% (2/2) | N/A (0/0) | 100.00% (1/1) | +|-------------------+---------------+---------------+------------+---------------| +| Total | 100.00% (3/3) | 100.00% (2/2) | N/A (0/0) | 100.00% (1/1) | +╰-------------------+---------------+---------------+------------+---------------╯ "#]], ); @@ -1022,13 +1022,13 @@ contract AContractTest is DSTest { // Assert 100% coverage. cmd.arg("coverage").assert_success().stdout_eq(str![[r#" ... -╭-------------------+-----------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+=====================================================================================+ -| src/AContract.sol | 100.00% (14/14) | 100.00% (9/9) | 100.00% (0/0) | 100.00% (5/5) | -|-------------------+-----------------+---------------+---------------+---------------| -| Total | 100.00% (14/14) | 100.00% (9/9) | 100.00% (0/0) | 100.00% (5/5) | -╰-------------------+-----------------+---------------+---------------+---------------╯ +╭-------------------+-----------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++==================================================================================+ +| src/AContract.sol | 100.00% (14/14) | 100.00% (9/9) | N/A (0/0) | 100.00% (5/5) | +|-------------------+-----------------+---------------+------------+---------------| +| Total | 100.00% (14/14) | 100.00% (9/9) | N/A (0/0) | 100.00% (5/5) | +╰-------------------+-----------------+---------------+------------+---------------╯ "#]]); }); @@ -1336,13 +1336,13 @@ contract FooTest is DSTest { cmd.forge_fuse().arg("coverage").assert_success().stdout_eq(str![[r#" ... -╭-------------+-----------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+===============================================================================+ -| src/Foo.sol | 100.00% (12/12) | 100.00% (9/9) | 100.00% (0/0) | 100.00% (4/4) | -|-------------+-----------------+---------------+---------------+---------------| -| Total | 100.00% (12/12) | 100.00% (9/9) | 100.00% (0/0) | 100.00% (4/4) | -╰-------------+-----------------+---------------+---------------+---------------╯ +╭-------------+-----------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++============================================================================+ +| src/Foo.sol | 100.00% (12/12) | 100.00% (9/9) | N/A (0/0) | 100.00% (4/4) | +|-------------+-----------------+---------------+------------+---------------| +| Total | 100.00% (12/12) | 100.00% (9/9) | N/A (0/0) | 100.00% (4/4) | +╰-------------+-----------------+---------------+------------+---------------╯ "#]]); }); @@ -1804,13 +1804,13 @@ contract AContractTest is DSTest { cmd.arg("coverage").assert_success().stdout_eq(str![[r#" ... -╭-------------------+-----------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+=====================================================================================+ -| src/AContract.sol | 100.00% (12/12) | 100.00% (9/9) | 100.00% (0/0) | 100.00% (3/3) | -|-------------------+-----------------+---------------+---------------+---------------| -| Total | 100.00% (12/12) | 100.00% (9/9) | 100.00% (0/0) | 100.00% (3/3) | -╰-------------------+-----------------+---------------+---------------+---------------╯ +╭-------------------+-----------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++==================================================================================+ +| src/AContract.sol | 100.00% (12/12) | 100.00% (9/9) | N/A (0/0) | 100.00% (3/3) | +|-------------------+-----------------+---------------+------------+---------------| +| Total | 100.00% (12/12) | 100.00% (9/9) | N/A (0/0) | 100.00% (3/3) | +╰-------------------+-----------------+---------------+------------+---------------╯ "#]]); }); @@ -1855,13 +1855,13 @@ contract AContractTest is DSTest { cmd.arg("coverage").assert_success().stdout_eq(str![[r#" ... -╭-------------------+---------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+===================================================================================+ -| src/AContract.sol | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -|-------------------+---------------+---------------+---------------+---------------| -| Total | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -╰-------------------+---------------+---------------+---------------+---------------╯ +╭-------------------+---------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++================================================================================+ +| src/AContract.sol | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +|-------------------+---------------+---------------+------------+---------------| +| Total | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +╰-------------------+---------------+---------------+------------+---------------╯ "#]]); }); @@ -1924,13 +1924,13 @@ end_of_record // Assert there's only one function (`increment`) reported. cmd.forge_fuse().arg("coverage").assert_success().stdout_eq(str![[r#" ... -╭-------------------+---------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+===================================================================================+ -| src/AContract.sol | 100.00% (1/1) | 100.00% (0/0) | 100.00% (0/0) | 100.00% (1/1) | -|-------------------+---------------+---------------+---------------+---------------| -| Total | 100.00% (1/1) | 100.00% (0/0) | 100.00% (0/0) | 100.00% (1/1) | -╰-------------------+---------------+---------------+---------------+---------------╯ +╭-------------------+---------------+--------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++===============================================================================+ +| src/AContract.sol | 100.00% (1/1) | N/A (0/0) | N/A (0/0) | 100.00% (1/1) | +|-------------------+---------------+--------------+------------+---------------| +| Total | 100.00% (1/1) | N/A (0/0) | N/A (0/0) | 100.00% (1/1) | +╰-------------------+---------------+--------------+------------+---------------╯ "#]]); }); @@ -1999,13 +1999,13 @@ end_of_record cmd.forge_fuse().arg("coverage").assert_success().stdout_eq(str![[r#" ... -╭-------------------+---------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+===================================================================================+ -| src/AContract.sol | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -|-------------------+---------------+---------------+---------------+---------------| -| Total | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -╰-------------------+---------------+---------------+---------------+---------------╯ +╭-------------------+---------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++================================================================================+ +| src/AContract.sol | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +|-------------------+---------------+---------------+------------+---------------| +| Total | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +╰-------------------+---------------+---------------+------------+---------------╯ "#]]); }); @@ -2035,13 +2035,13 @@ contract AContract { // Assert coverage doesn't fail with `Error: Unknown key "inliner"`. cmd.arg("coverage").arg("--ir-minimum").assert_success().stdout_eq(str![[r#" ... -╭-------------------+-------------+--------------+---------------+-------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+==============================================================================+ -| src/AContract.sol | 0.00% (0/5) | 0.00% (0/4) | 100.00% (0/0) | 0.00% (0/1) | -|-------------------+-------------+--------------+---------------+-------------| -| Total | 0.00% (0/5) | 0.00% (0/4) | 100.00% (0/0) | 0.00% (0/1) | -╰-------------------+-------------+--------------+---------------+-------------╯ +╭-------------------+-------------+--------------+------------+-------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++===========================================================================+ +| src/AContract.sol | 0.00% (0/5) | 0.00% (0/4) | N/A (0/0) | 0.00% (0/1) | +|-------------------+-------------+--------------+------------+-------------| +| Total | 0.00% (0/5) | 0.00% (0/4) | N/A (0/0) | 0.00% (0/1) | +╰-------------------+-------------+--------------+------------+-------------╯ "#]]); }); @@ -2088,13 +2088,13 @@ contract AContractTest is DSTest { cmd.forge_fuse().arg("coverage").assert_success().stdout_eq(str![[r#" ... -╭-------------------+---------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+===================================================================================+ -| src/AContract.sol | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -|-------------------+---------------+---------------+---------------+---------------| -| Total | 100.00% (4/4) | 100.00% (2/2) | 100.00% (0/0) | 100.00% (2/2) | -╰-------------------+---------------+---------------+---------------+---------------╯ +╭-------------------+---------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++================================================================================+ +| src/AContract.sol | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +|-------------------+---------------+---------------+------------+---------------| +| Total | 100.00% (4/4) | 100.00% (2/2) | N/A (0/0) | 100.00% (2/2) | +╰-------------------+---------------+---------------+------------+---------------╯ ... "#]]); @@ -2486,13 +2486,13 @@ contract CounterTest is DSTest { // Assert 100% coverage for linked libraries. cmd.arg("coverage").assert_success().stdout_eq(str![[r#" ... -╭-----------------+---------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+=================================================================================+ -| src/Counter.sol | 100.00% (4/4) | 100.00% (3/3) | 100.00% (0/0) | 100.00% (2/2) | -|-----------------+---------------+---------------+---------------+---------------| -| Total | 100.00% (4/4) | 100.00% (3/3) | 100.00% (0/0) | 100.00% (2/2) | -╰-----------------+---------------+---------------+---------------+---------------╯ +╭-----------------+---------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++==============================================================================+ +| src/Counter.sol | 100.00% (4/4) | 100.00% (3/3) | N/A (0/0) | 100.00% (2/2) | +|-----------------+---------------+---------------+------------+---------------| +| Total | 100.00% (4/4) | 100.00% (3/3) | N/A (0/0) | 100.00% (2/2) | +╰-----------------+---------------+---------------+------------+---------------╯ ... "#]]); }); @@ -2681,13 +2681,13 @@ contract CounterTest is DSTest { // excluded as it is not implemented. cmd.arg("coverage").assert_success().stdout_eq(str![[r#" ... -╭-----------------+---------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+=================================================================================+ -| src/Counter.sol | 100.00% (8/8) | 100.00% (4/4) | 100.00% (0/0) | 100.00% (4/4) | -|-----------------+---------------+---------------+---------------+---------------| -| Total | 100.00% (8/8) | 100.00% (4/4) | 100.00% (0/0) | 100.00% (4/4) | -╰-----------------+---------------+---------------+---------------+---------------╯ +╭-----------------+---------------+---------------+------------+---------------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++==============================================================================+ +| src/Counter.sol | 100.00% (8/8) | 100.00% (4/4) | N/A (0/0) | 100.00% (4/4) | +|-----------------+---------------+---------------+------------+---------------| +| Total | 100.00% (8/8) | 100.00% (4/4) | N/A (0/0) | 100.00% (4/4) | +╰-----------------+---------------+---------------+------------+---------------╯ ... "#]]); }); @@ -2910,9 +2910,14 @@ contract Broken { }); #[test] -fn coverage_help_renders_compatibility_note() { +fn coverage_help_renders_notes() { let help = CoverageArgs::command().render_long_help().to_string(); + assert!(help.contains(concat!( + "Source attribution:\n", + " Coverage follows compiler source maps. Inherited modifier code is reported under" + ))); + assert!(help.contains("use `--include-libs` to include their coverage.")); assert!(help.contains(concat!( "Compatibility:\n", " `forge coverage` supports test filters and `--watch`, but not test-only output" diff --git a/crates/forge/tests/cli/inline_config.rs b/crates/forge/tests/cli/inline_config.rs index 44eabf6bd4a6c..c2d4fbc8d9955 100644 --- a/crates/forge/tests/cli/inline_config.rs +++ b/crates/forge/tests/cli/inline_config.rs @@ -42,11 +42,11 @@ Suite result: ok. 2 passed; 0 failed; 0 skipped; [ELAPSED] Ran 1 test suite [ELAPSED]: 2 tests passed, 0 failed, 0 skipped (2 total tests) -╭-------+---------------+---------------+---------------+---------------╮ -| File | % Lines | % Statements | % Branches | % Funcs | -+=======================================================================+ -| Total | 100.00% (0/0) | 100.00% (0/0) | 100.00% (0/0) | 100.00% (0/0) | -╰-------+---------------+---------------+---------------+---------------╯ +╭-------+-----------+--------------+------------+-----------╮ +| File | % Lines | % Statements | % Branches | % Funcs | ++===========================================================+ +| Total | N/A (0/0) | N/A (0/0) | N/A (0/0) | N/A (0/0) | +╰-------+-----------+--------------+------------+-----------╯ "#]]); });