cargo-mutants icon indicating copy to clipboard operation
cargo-mutants copied to clipboard

Exclude based on regex of statements?

Open sourcefrog opened this issue 1 year ago • 5 comments

https://github.com/sourcefrog/cargo-mutants/blob/b2a4bd1934d1e599afd7388791eab8ee1c839397/src/span.rs#L103

The String::with_capacity isn't wrong, and it's probably slightly beneficial to have there, but the side effects are subtle and it's probably asking too much to test it. (Actually, in this specific case we could debug_assert the capacity to shush it, but that's a bit messy.)

We cannot yet add a #[mutants::skip] here, because expression attributes aren't stable yet (https://github.com/rust-lang/rust/issues/15701).

Maybe it would be useful to have config that can match against the whole expression text and then skip; that would probably help in other cases of code that only has unimportant side effects such as trace statements.

sourcefrog avatar Mar 03 '24 20:03 sourcefrog

In the case you mention, isn't this at least possible?

let mut r = {
    #[cfg_attr(test, mutants::skip)]
    {
        String::with_capacity(s.len() + replacement.len());
    }
};

I do have a related request though. cargo-mutate reports that a testing utility function I have doesn't affect anything when mutated from a series of assert! macros into (). Maybe it would be possible to ignore this mutation if all of the statements are assert!-family macros (though itertools::assert_equal is in the same boat, just not an official macro).

mathstuf avatar Oct 30 '24 02:10 mathstuf

Yes, I think that framing

In the case you mention, isn't this at least possible?

let mut r = {
    #[cfg_attr(test, mutants::skip)]
    {
        String::with_capacity(s.len() + replacement.len());
    }
};

The stable compiler also tells me that's not supported yet, although you could do it on nightly:

error[E0658]: attributes on expressions are experimental
  --> tests/in_diff.rs:17:26
   |
17 |         #[cfg_attr(test, mutants::skip)]
   |                          ^^^^^^^^^^^^^
   |
   = note: see issue #15701 <https://github.com/rust-lang/rust/issues/15701> for more information
error[E0658]: custom attributes cannot be applied to expressions
  --> tests/in_diff.rs:17:26
   |
17 |         #[cfg_attr(test, mutants::skip)]
   |                          ^^^^^^^^^^^^^
   |
   = note: see issue #54727 <https://github.com/rust-lang/rust/issues/54727> for more information

~~Skipping functions entirely full of assertions seems like a good idea, probably.~~ Although in that case you really could just mark it as #[mutants::skip].

Edit: actually I'm not so sure about skipping functions that only contain assertions by default: they might be enforcing invariants that are intended to be checked at runtime.

sourcefrog avatar Nov 04 '24 15:11 sourcefrog

Although in that case you really could just mark it as #[mutants::skip].

Yes, but if it is the only reason for a mutants dev-dependency…might be worth it eventually (no need to prioritize it).

mathstuf avatar Nov 15 '24 14:11 mathstuf

There are alternatives that don't add a (tiny) dev dependency:

  • https://mutants.rs/attrs.html
  • https://mutants.rs/filter_mutants.html

sourcefrog avatar Nov 15 '24 15:11 sourcefrog

#315 proposes to skip calls to functions/methods matching a string, which is perhaps more precise than a regexp of the statement.

sourcefrog avatar Nov 18 '24 00:11 sourcefrog