package org.pitest.mutationtest.build;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when;
import static org.pitest.mutationtest.LocationMother.aLocation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.pitest.classinfo.ClassByteArraySource;
import org.pitest.classinfo.ClassName;
import org.pitest.coverage.ClassLine;
import org.pitest.coverage.CoverageDatabase;
import org.pitest.coverage.TestInfo;
import org.pitest.functional.F;
import org.pitest.functional.FCollection;
import org.pitest.functional.Option;
import org.pitest.mutationtest.engine.MutationDetails;
import org.pitest.mutationtest.engine.MutationIdentifier;
public class DefaultTestPrioritiserTest {
private DefaultTestPrioritiser testee;
@Mock
private CoverageDatabase coverage;
@Mock
private ClassByteArraySource source;
private final ClassName foo = ClassName.fromString("foo");
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
this.testee = new DefaultTestPrioritiser(this.coverage);
}
@Test
public void shouldAssignTestsForRelevantLineToGeneratedMutations() {
final List<TestInfo> expected = makeTestInfos(0);
when(this.coverage.getTestsForClassLine(any(ClassLine.class))).thenReturn(
expected);
final List<TestInfo> actual = this.testee.assignTests(makeMutation("foo"));
assertEquals(expected, actual);
}
@Test
public void shouldAssignAllTestsForClassWhenMutationInStaticInitialiser() {
final List<TestInfo> expected = makeTestInfos(0);
when(this.coverage.getTestsForClass(this.foo)).thenReturn(expected);
final List<TestInfo> actual = this.testee
.assignTests(makeMutation("<clinit>"));
assertEquals(expected, actual);
}
@Test
public void shouldPrioritiseTestsByExecutionTime() {
final List<TestInfo> unorderedTests = makeTestInfos(10000, 100, 1000, 1);
when(this.coverage.getTestsForClassLine(any(ClassLine.class))).thenReturn(
unorderedTests);
final List<TestInfo> actual = this.testee.assignTests(makeMutation("foo"));
assertEquals(Arrays.asList(1, 100, 1000, 10000),
FCollection.map(actual, toTime()));
}
private F<TestInfo, Integer> toTime() {
return new F<TestInfo, Integer>() {
@Override
public Integer apply(TestInfo a) {
return a.getTime();
}
};
}
private List<TestInfo> makeTestInfos(final Integer... times) {
return new ArrayList<TestInfo>(FCollection.map(Arrays.asList(times),
timeToTestInfo()));
}
private F<Integer, TestInfo> timeToTestInfo() {
return new F<Integer, TestInfo>() {
@Override
public TestInfo apply(final Integer a) {
return new TestInfo("foo", "bar", a, Option.<ClassName> none(), 0);
}
};
}
private MutationDetails makeMutation(final String method) {
final MutationIdentifier id = new MutationIdentifier(aLocation()
.withClass(this.foo).withMethod(method).build(), 0, "mutator");
return new MutationDetails(id, "file", "desc", 1, 2);
}
}