Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exclude based on regex of statements? #301

Open
sourcefrog opened this issue Mar 3, 2024 · 5 comments
Open

Exclude based on regex of statements? #301

sourcefrog opened this issue Mar 3, 2024 · 5 comments
Labels
filter About filtering, and selecting mutants

Comments

@sourcefrog
Copy link
Owner

let mut r = String::with_capacity(s.len() + replacement.len());

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 (rust-lang/rust#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 sourcefrog added the filter About filtering, and selecting mutants label Mar 3, 2024
@mathstuf
Copy link

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).

@sourcefrog
Copy link
Owner Author

sourcefrog commented Nov 4, 2024

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.

@mathstuf
Copy link

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).

@sourcefrog
Copy link
Owner Author

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

@sourcefrog
Copy link
Owner Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
filter About filtering, and selecting mutants
Projects
None yet
Development

No branches or pull requests

2 participants