package org.pitest.mutationtest.engine.gregor;
import java.util.HashSet;
import java.util.Set;
import org.pitest.mutationtest.engine.Location;
import org.pitest.mutationtest.engine.MutationDetails;
import org.pitest.mutationtest.engine.MutationIdentifier;
import org.pitest.mutationtest.engine.gregor.analysis.InstructionCounter;
class MethodMutationContext implements MutationContext, InstructionCounter {
private final ClassContext classContext;
private final Location location;
private int instructionIndex;
private int lastLineNumber;
private final Set<String> mutationFindingDisabledReasons = new HashSet<String>();
MethodMutationContext(final ClassContext classContext, final Location location) {
this.classContext = classContext;
this.location = location;
}
@Override
public MutationIdentifier registerMutation(
final MethodMutatorFactory factory, final String description) {
final MutationIdentifier newId = getNextMutationIdentifer(factory,
this.classContext.getJavaClassName());
final MutationDetails details = new MutationDetails(newId,
this.classContext.getFileName(), description, this.lastLineNumber,
this.classContext.getCurrentBlock(),
this.classContext.isWithinFinallyBlock(), false);
registerMutation(details);
return newId;
}
private MutationIdentifier getNextMutationIdentifer(
final MethodMutatorFactory factory, final String className) {
return new MutationIdentifier(this.location, this.instructionIndex,
factory.getGloballyUniqueId());
}
private void registerMutation(final MutationDetails details) {
if (!isMutationFindingDisabled()) {
this.classContext.addMutation(details);
}
}
private boolean isMutationFindingDisabled() {
return !this.mutationFindingDisabledReasons.isEmpty();
}
@Override
public void registerCurrentLine(final int line) {
this.lastLineNumber = line;
}
@Override
public void registerNewBlock() {
this.classContext.registerNewBlock();
}
@Override
public void registerFinallyBlockStart() {
this.classContext.registerFinallyBlockStart();
}
@Override
public void registerFinallyBlockEnd() {
this.classContext.registerFinallyBlockEnd();
}
@Override
public ClassInfo getClassInfo() {
return this.classContext.getClassInfo();
}
@Override
public boolean shouldMutate(final MutationIdentifier newId) {
return this.classContext.shouldMutate(newId);
}
@Override
public void disableMutations(final String reason) {
this.mutationFindingDisabledReasons.add(reason);
}
@Override
public void enableMutatations(final String reason) {
this.mutationFindingDisabledReasons.remove(reason);
}
@Override
public void increment() {
this.instructionIndex = this.instructionIndex + 1;
}
@Override
public int currentInstructionCount() {
return this.instructionIndex;
}
}