From eb3891557a2b417d5594009cb53924d1210e183c Mon Sep 17 00:00:00 2001 From: Henry Coles Date: Thu, 3 Aug 2023 12:08:18 +0100 Subject: [PATCH] explicitly order history file entries --- .../tooling/MutationCoverage.java | 12 ++++++-- .../tooling/MutationCoverageReportTest.java | 29 ++++++++++++++++++- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/tooling/MutationCoverage.java b/pitest-entry/src/main/java/org/pitest/mutationtest/tooling/MutationCoverage.java index e50402464..3818414f7 100644 --- a/pitest-entry/src/main/java/org/pitest/mutationtest/tooling/MutationCoverage.java +++ b/pitest-entry/src/main/java/org/pitest/mutationtest/tooling/MutationCoverage.java @@ -67,6 +67,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Optional; @@ -289,9 +290,14 @@ private MutationResultInterceptor resultInterceptor() { } private void recordClassPath(HistoryStore history, CoverageDatabase coverageData) { - final Set allClassNames = getAllClassesAndTests(coverageData); - final Collection ids = FCollection.map( - this.code.getClassInfo(allClassNames), ClassInfo::getHierarchicalId); + Set allClassNames = getAllClassesAndTests(coverageData); + + // sort by classname to ensure order consistent across machines + List ids = this.code.getClassInfo(allClassNames).stream() + .map(ClassInfo::getHierarchicalId) + .sorted(Comparator.comparing(HierarchicalClassId::getName)) + .collect(Collectors.toList()); + history.recordClassPath(ids, coverageData); } diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/tooling/MutationCoverageReportTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/tooling/MutationCoverageReportTest.java index b2578b33b..15a333540 100644 --- a/pitest-entry/src/test/java/org/pitest/mutationtest/tooling/MutationCoverageReportTest.java +++ b/pitest-entry/src/test/java/org/pitest/mutationtest/tooling/MutationCoverageReportTest.java @@ -14,6 +14,7 @@ */ package org.pitest.mutationtest.tooling; +import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.anyCollection; @@ -163,7 +164,33 @@ public void shouldRecordClassPath() { createAndRunTestee(); - verify(this.history).recordClassPath(Arrays.asList(fooId), this.coverageDb); + verify(this.history).recordClassPath(asList(fooId), this.coverageDb); + } + + @Test + public void ordersHistoryEntries() { + + final ClassName clazz = ClassName.fromClass(Foo.class); + + final HierarchicalClassId fooId = new HierarchicalClassId( + new ClassIdentifier(0, clazz), "0"); + final HierarchicalClassId barId = new HierarchicalClassId( + new ClassIdentifier(0, ClassName.fromString("Bar")), "0"); + final ClassInfo foo = ClassInfoMother.make(fooId.getId()); + final ClassInfo bar = ClassInfoMother.make(barId.getId()); + + when(this.mutater.findMutations(ClassName.fromClass(Foo.class))).thenReturn(aMutantIn(Foo.class)); + + when(this.code.getCodeUnderTestNames()).thenReturn( + Collections.singleton(clazz)); + when(this.code.getClassInfo(anyCollection())).thenReturn( + asList(foo, bar)); + when(this.coverageDb.getCodeLinesForClass(clazz)).thenReturn(new ClassLines(clazz, Collections.emptySet())); + + createAndRunTestee(); + + // bar comes first alphabetically + verify(this.history).recordClassPath(asList(barId, fooId), this.coverageDb); } @Test