package org.pitest.mutationtest.build; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import org.pitest.classinfo.ClassName; import org.pitest.functional.F; import org.pitest.functional.FCollection; import org.pitest.mutationtest.engine.MutationDetails; public class DefaultGrouper implements MutationGrouper { private final int unitSize; public DefaultGrouper(final int unitSize) { this.unitSize = unitSize; } @Override public List<List<MutationDetails>> groupMutations( final Collection<ClassName> codeClasses, final Collection<MutationDetails> mutations) { final Map<ClassName, Collection<MutationDetails>> bucketed = FCollection .bucket(mutations, byClass()); final List<List<MutationDetails>> chunked = new ArrayList<List<MutationDetails>>(); for (final Collection<MutationDetails> each : bucketed.values()) { shrinkToMaximumUnitSize(chunked, each); } return chunked; } private void shrinkToMaximumUnitSize( final List<List<MutationDetails>> chunked, final Collection<MutationDetails> each) { if (this.unitSize > 0) { for (final List<MutationDetails> ms : FCollection.splitToLength( this.unitSize, each)) { chunked.add(ms); } } else { chunked.add(new ArrayList<MutationDetails>(each)); } } private static F<MutationDetails, ClassName> byClass() { return new F<MutationDetails, ClassName>() { @Override public ClassName apply(final MutationDetails a) { return a.getClassName(); } }; } }