From dbd10effadad04bad700369c9bfca3b80a56f208 Mon Sep 17 00:00:00 2001 From: Henry Coles Date: Wed, 28 Apr 2021 15:32:23 +0100 Subject: [PATCH] store per class coverage --- .../org/pitest/coverage/CoverageData.java | 54 +++++++++++-------- .../org/pitest/coverage/CoverageDataTest.java | 47 ++++++++-------- 2 files changed, 58 insertions(+), 43 deletions(-) diff --git a/pitest-entry/src/main/java/org/pitest/coverage/CoverageData.java b/pitest-entry/src/main/java/org/pitest/coverage/CoverageData.java index 30ac4804f..40a8edc3d 100644 --- a/pitest-entry/src/main/java/org/pitest/coverage/CoverageData.java +++ b/pitest-entry/src/main/java/org/pitest/coverage/CoverageData.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -40,8 +41,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static java.util.stream.Collectors.toCollection; - public class CoverageData implements CoverageDatabase { private static final Logger LOG = Log @@ -51,6 +50,8 @@ public class CoverageData implements CoverageDatabase { // coverage. Ugly mess of maps below should go when // api changed to work via blocks private final Map> instructionCoverage; + private final Map> classCoverage = new LinkedHashMap<>(); + private final Map> blocksToLines = new LinkedHashMap<>(); private final Map>> lineCoverage = new LinkedHashMap<>(); private final Map> classesForFile; @@ -74,6 +75,33 @@ public CoverageData(final CodeSource code, final LineMap lm, Map coverage) { + Set classes = coverage.stream() + .map(b -> b.getLocation().getClassName()) + .collect(Collectors.toSet()); + for (ClassName each : classes) { + Set tests = classCoverage.computeIfAbsent(each, k -> new HashSet<>()); + tests.add(ti); + } + + } + @Override public Collection getTestsForInstructionLocation(InstructionLocation location) { return this.instructionCoverage.getOrDefault(location, Collections.emptySet()); @@ -117,23 +145,7 @@ public int getNumberOfCoveredLines(final Collection mutatedClass) { @Override public Collection getTestsForClass(final ClassName clazz) { - return this.instructionCoverage.entrySet().stream() - .filter(isFor(clazz)) - .flatMap(toTests()) - .collect(toCollection(() -> new TreeSet<>(new TestInfoNameComparator()))); - } - - public void calculateClassCoverage(final CoverageResult cr) { - - checkForFailedTest(cr); - final TestInfo ti = this.createTestInfo(cr.getTestUnitDescription(), - cr.getExecutionTime(), cr.getNumberOfCoveredBlocks()); - for (final BlockLocation each : cr.getCoverage()) { - for (int i = each.getFirstInsnInBlock(); - i <= each.getLastInsnInBlock(); i++) { - addTestsToBlockMap(ti, new InstructionLocation(each, i)); - } - } + return classCoverage.getOrDefault(clazz, Collections.emptySet()); } private void addTestsToBlockMap(final TestInfo ti, InstructionLocation each) { @@ -272,8 +284,8 @@ private Map> convertInstructionCoverageToLineCoverageFo } private static Set getLineTestSet(ClassName clazz, - Map> linesToTests, - Entry> each, int line) { + Map> linesToTests, + Entry> each, int line) { final ClassLine cl = new ClassLine(clazz, line); Set tis = linesToTests.get(cl); if (tis == null) { diff --git a/pitest-entry/src/test/java/org/pitest/coverage/CoverageDataTest.java b/pitest-entry/src/test/java/org/pitest/coverage/CoverageDataTest.java index 5363866cc..eff3b0e2c 100644 --- a/pitest-entry/src/test/java/org/pitest/coverage/CoverageDataTest.java +++ b/pitest-entry/src/test/java/org/pitest/coverage/CoverageDataTest.java @@ -15,25 +15,6 @@ package org.pitest.coverage; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.pitest.coverage.CoverageMother.aBlockLocation; -import static org.pitest.coverage.CoverageMother.aCoverageResult; -import static org.pitest.mutationtest.LocationMother.aLocation; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Function; - import org.junit.Before; import org.junit.Test; import org.mockito.Mock; @@ -45,11 +26,31 @@ import org.pitest.coverage.CoverageMother.BlockLocationBuilder; import org.pitest.coverage.CoverageMother.CoverageResultBuilder; import org.pitest.functional.FCollection; -import java.util.Optional; import org.pitest.mutationtest.engine.Location; import org.pitest.mutationtest.engine.MethodName; import org.pitest.testapi.Description; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.pitest.coverage.CoverageMother.aBlockLocation; +import static org.pitest.coverage.CoverageMother.aCoverageResult; +import static org.pitest.mutationtest.LocationMother.aLocation; + public class CoverageDataTest { private CoverageData testee; @@ -138,8 +139,10 @@ public void shouldReturnUniqueTestsForClassWhenSomeTestsCoverClass() { 2)); this.testee.calculateClassCoverage(makeCoverageResult("foo", "fooTest2", 0, 2)); - assertEquals(Arrays.asList("fooTest", "fooTest2"), FCollection.map( - this.testee.getTestsForClass(this.foo), testInfoToString())); + + List actual = FCollection.map(this.testee.getTestsForClass(this.foo), testInfoToString()); + + assertThat(actual).containsExactlyInAnyOrder("fooTest", "fooTest2"); } @Test