| // Enables `coverage(off)` on the entire crate |
| #![feature(coverage_attribute)] |
| |
| #[coverage(off)] |
| fn do_not_add_coverage_1() { |
| println!("called but not covered"); |
| } |
| |
| fn do_not_add_coverage_2() { |
| #![coverage(off)] |
| println!("called but not covered"); |
| } |
| |
| #[coverage(off)] |
| #[allow(dead_code)] |
| fn do_not_add_coverage_not_called() { |
| println!("not called and not covered"); |
| } |
| |
| fn add_coverage_1() { |
| println!("called and covered"); |
| } |
| |
| fn add_coverage_2() { |
| println!("called and covered"); |
| } |
| |
| #[allow(dead_code)] |
| fn add_coverage_not_called() { |
| println!("not called but covered"); |
| } |
| |
| // FIXME: These test-cases illustrate confusing results of nested functions. |
| // See https://github.com/rust-lang/rust/issues/93319 |
| mod nested_fns { |
| #[coverage(off)] |
| pub fn outer_not_covered(is_true: bool) { |
| fn inner(is_true: bool) { |
| if is_true { |
| println!("called and covered"); |
| } else { |
| println!("absolutely not covered"); |
| } |
| } |
| println!("called but not covered"); |
| inner(is_true); |
| } |
| |
| pub fn outer(is_true: bool) { |
| println!("called and covered"); |
| inner_not_covered(is_true); |
| |
| #[coverage(off)] |
| fn inner_not_covered(is_true: bool) { |
| if is_true { |
| println!("called but not covered"); |
| } else { |
| println!("absolutely not covered"); |
| } |
| } |
| } |
| |
| pub fn outer_both_covered(is_true: bool) { |
| println!("called and covered"); |
| inner(is_true); |
| |
| fn inner(is_true: bool) { |
| if is_true { |
| println!("called and covered"); |
| } else { |
| println!("absolutely not covered"); |
| } |
| } |
| } |
| } |
| |
| fn main() { |
| let is_true = std::env::args().len() == 1; |
| |
| do_not_add_coverage_1(); |
| do_not_add_coverage_2(); |
| add_coverage_1(); |
| add_coverage_2(); |
| |
| nested_fns::outer_not_covered(is_true); |
| nested_fns::outer(is_true); |
| nested_fns::outer_both_covered(is_true); |
| } |