package org.pitest.mutationtest.build;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when;
import static org.pitest.mutationtest.LocationMother.aLocation;
import static org.pitest.mutationtest.LocationMother.aMutationId;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.pitest.classinfo.ClassName;
import org.pitest.mutationtest.NullAnalyser;
import org.pitest.mutationtest.engine.MutationDetails;
public class MutationTestBuilderTest {
private MutationTestBuilder testee;
@Mock
private MutationSource source;
@Mock
private WorkerFactory wf;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
makeTesteeWithUnitSizeOf(0);
}
@Test
public void shouldCreateSingleUnitPerClassWhenUnitSizeIsZero() {
makeTesteeWithUnitSizeOf(0);
assertCreatesOneTestUnitForTwoMutations();
}
@Test
public void shouldCreateSingleUnitPerClassWhenUnitSizeIsLessThanZero() {
makeTesteeWithUnitSizeOf(-1);
assertCreatesOneTestUnitForTwoMutations();
}
@Test
public void shouldCreateMultipleTestUnitsWhenUnitSizeIsLessThanNumberOfMutations() {
makeTesteeWithUnitSizeOf(1);
when(this.source.createMutations(any(ClassName.class))).thenReturn(
Arrays.asList(createDetails("foo"), createDetails("foo"),
createDetails("foo")));
final List<MutationAnalysisUnit> actual = this.testee
.createMutationTestUnits(Arrays.asList(new ClassName("foo")));
assertEquals(3, actual.size());
}
@Test
public void shouldCreateNoUnitsWhenNoMutationsFound() {
when(this.source.createMutations(any(ClassName.class))).thenReturn(
Collections.<MutationDetails> emptyList());
assertTrue(this.testee.createMutationTestUnits(
Arrays.asList(new ClassName("foo"))).isEmpty());
}
@Test
public void shouldOrderLargestUnitFirst() {
final MutationDetails mutation1 = createDetails("foo");
final MutationDetails mutation2 = createDetails("bar");
final ClassName foo = ClassName.fromString("foo");
final ClassName bar = ClassName.fromString("bar");
when(this.source.createMutations(foo)).thenReturn(Arrays.asList(mutation1));
when(this.source.createMutations(bar)).thenReturn(
Arrays.asList(mutation2, mutation2));
final List<MutationAnalysisUnit> actual = this.testee
.createMutationTestUnits(Arrays.asList(foo, bar));
assertTrue(actual.get(0).priority() > actual.get(1).priority());
}
private void assertCreatesOneTestUnitForTwoMutations() {
final MutationDetails mutation1 = createDetails("foo");
final MutationDetails mutation2 = createDetails("foo");
when(this.source.createMutations(any(ClassName.class))).thenReturn(
Arrays.asList(mutation1, mutation2));
final List<MutationAnalysisUnit> actual = this.testee
.createMutationTestUnits(Arrays.asList(new ClassName("foo")));
assertEquals(1, actual.size());
}
private void makeTesteeWithUnitSizeOf(int unitSize) {
this.testee = new MutationTestBuilder(this.wf, new NullAnalyser(),
this.source, new DefaultGrouper(unitSize));
}
public static MutationDetails createDetails(String clazz) {
return new MutationDetails(aMutationId().withLocation(aLocation(clazz))
.build(), "", "desc", 42, 0);
}
}