package org.pitest.mutationtest.statistics;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.pitest.functional.F;
import org.pitest.functional.F2;
import org.pitest.functional.FCollection;
import org.pitest.functional.SideEffect1;
import org.pitest.mutationtest.MutationResult;
class MutationStatisticsPrecursor {
private final Map<String, ScorePrecursor> mutatorTotalMap = new HashMap<String, ScorePrecursor>();
private long numberOfTestsRun = 0;
public void registerResults(final Collection<MutationResult> results) {
FCollection.forEach(results, register());
}
private SideEffect1<MutationResult> register() {
return new SideEffect1<MutationResult>() {
@Override
public void apply(final MutationResult mr) {
MutationStatisticsPrecursor.this.numberOfTestsRun = MutationStatisticsPrecursor.this.numberOfTestsRun
+ mr.getNumberOfTestsRun();
final String key = mr.getDetails().getId().getMutator();
ScorePrecursor total = MutationStatisticsPrecursor.this.mutatorTotalMap
.get(key);
if (total == null) {
total = new ScorePrecursor(key);
MutationStatisticsPrecursor.this.mutatorTotalMap.put(key, total);
}
total.registerResult(mr.getStatus());
}
};
}
public MutationStatistics toStatistics() {
final Iterable<Score> scores = getScores();
final long totalMutations = FCollection.fold(addTotals(), 0L, scores);
final long totalDetected = FCollection
.fold(addDetectedTotals(), 0L, scores);
return new MutationStatistics(scores, totalMutations, totalDetected,
this.numberOfTestsRun);
}
Iterable<Score> getScores() {
return FCollection.map(this.mutatorTotalMap.values(), toScore());
}
private static F<ScorePrecursor, Score> toScore() {
return new F<ScorePrecursor, Score>() {
@Override
public Score apply(ScorePrecursor a) {
return a.toScore();
}
};
}
private static F2<Long, Score, Long> addTotals() {
return new F2<Long, Score, Long>() {
@Override
public Long apply(final Long a, final Score b) {
return a + b.getTotalMutations();
}
};
}
private static F2<Long, Score, Long> addDetectedTotals() {
return new F2<Long, Score, Long>() {
@Override
public Long apply(final Long a, final Score b) {
return a + b.getTotalDetectedMutations();
}
};
}
}