b5336058

By: Tom Sydney Kerckhove <syd@cs-syd.eu>

Group mutation alternatives and skip remaining on first failure

When a mutation operator emits multiple alternatives at one source
location (e.g. ListLit's drop-each variants on a 3-element list), all
alternatives were previously tested independently.  Now they are
grouped: as soon as one alternative in a group fails (survives or is
uncovered), the remaining alternatives are recorded as 'Skipped'
without being run.

The plugin's writer monad now accumulates [MutationGroup] (one group
per applyAlts call).  MutationManifest and AugmentedManifest carry
list-of-groups; MutationRunReport replaces its flat survived/timed-out/
uncovered arrays with a single 'groups' field of [MutationGroupReport],
each carrying a list of MutationOutcome (Killed/Survived/TimedOut/
Uncovered/Skipped).  Timeouts do not trigger within-group skipping.
The within-group skip is independent of --mutation-fail-fast, which
still controls whether the whole run aborts.

Suite timing

Time to Start Worker time Duration Time to finish
Config 0s 3s 3s 3s
Eval 3s 37s 37s 41s
Build 11s 1m24s 40s 51s
Test - - - -
Deploy - - - -
Suite 0s 2m05s 51s 51s

Timeline

0s10s20s30s40s50s