private static Function<MutationDetails, Integer> mutationToBlock() { return a -> a.getBlock(); }
private void checkForInlinedCode(final Collection<MutationDetails> combined, final Entry<LineMutatorPair, Collection<MutationDetails>> each) { final List<MutationDetails> mutationsInHandlerBlock = FCollection .filter(each.getValue(), isInFinallyHandler()); if (!isPossibleToCorrectInlining(mutationsInHandlerBlock)) { combined.addAll(each.getValue()); return; } final MutationDetails baseMutation = mutationsInHandlerBlock.get(0); final int firstBlock = baseMutation.getBlock(); // check that we have at least on mutation in a different block // to the base one (is this not implied by there being only 1 mutation in // the handler ????) final List<Integer> ids = map(each.getValue(), mutationToBlock()); if (ids.stream().filter(not(isEqualTo(firstBlock))).findFirst().isPresent()) { combined.add(makeCombinedMutant(each.getValue())); } else { combined.addAll(each.getValue()); } }
@Test public void shouldRecordMutationsAsInDifferentBlocksWhenInDifferentBranchesOfSwitchStatement() { createTesteeWith(Mutator.byName("INCREMENTS")); final List<MutationDetails> actualDetails = findMutationsFor(SwitchStatement.class); assertEquals(3, actualDetails.size()); final int firstMutationBlock = actualDetails.get(0).getBlock(); assertEquals(firstMutationBlock + 1, actualDetails.get(1).getBlock()); assertEquals(firstMutationBlock + 2, actualDetails.get(2).getBlock()); }
private static MutationDetails makeCombinedMutant( final Collection<MutationDetails> value) { final MutationDetails first = value.iterator().next(); final Set<Integer> indexes = new HashSet<>(); mapTo(value, mutationToIndex(), indexes); final MutationIdentifier id = new MutationIdentifier(first.getId() .getLocation(), indexes, first.getId().getMutator()); return new MutationDetails(id, first.getFilename(), first.getDescription(), first.getLineNumber(), first.getBlock()); }
@Test public void shouldRecordMutationsAsInSameBlockWhenSwitchStatementFallsThrough() { createTesteeWith(Mutator.byName("INCREMENTS")); final List<MutationDetails> actualDetails = findMutationsFor(FallThroughSwitch.class); assertEquals(2, actualDetails.size()); final int firstMutationBlock = actualDetails.get(0).getBlock(); assertEquals(firstMutationBlock, actualDetails.get(1).getBlock()); }
@Test public void shouldRecordMutationsAsInSameBlockWhenForAStraightThroughMethod() { createTesteeWith(Mutator.byName("INCREMENTS")); final List<MutationDetails> actualDetails = findMutationsFor(OneStraightThroughMethod.class); assertEquals(2, actualDetails.size()); final int firstMutationBlock = actualDetails.get(0).getBlock(); assertEquals(firstMutationBlock, actualDetails.get(1).getBlock()); }
private String makeMutationNode(final MutationResult mutation) { final MutationDetails details = mutation.getDetails(); return makeNode(clean(details.getFilename()), sourceFile) + makeNode(clean(details.getClassName().asJavaName()), mutatedClass) + makeNode(clean(details.getMethod().name()), mutatedMethod) + makeNode(clean(details.getId().getLocation().getMethodDesc()), methodDescription) + makeNode("" + details.getLineNumber(), lineNumber) + makeNode(clean(details.getMutator()), mutator) + makeNode("" + details.getFirstIndex(), index) + makeNode("" + details.getBlock(), block) + makeNodeWhenConditionSatisfied(!fullMutationMatrix, createKillingTestDesc(mutation.getKillingTest()), killingTest) + makeNodeWhenConditionSatisfied(fullMutationMatrix, createTestDesc(mutation.getKillingTests()), killingTests) + makeNodeWhenConditionSatisfied(fullMutationMatrix, createTestDesc(mutation.getSucceedingTests()), succeedingTests) + makeNode(clean(details.getDescription()), description); }