blob: cf6a6ef80ececabb4d12cc164f364b9803a3d391 [file] [log] [blame]
package org.junit.tests.experimental.theories.extendingwithstubs;
import java.util.ArrayList;
import java.util.List;
import org.junit.experimental.theories.ParameterSignature;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.internal.Assignments;
import org.junit.internal.AssumptionViolatedException;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;
import org.junit.runners.model.TestClass;
public class StubbedTheories extends Theories {
public StubbedTheories(Class<?> klass) throws InitializationError {
super(klass);
}
@Override
public Statement methodBlock(FrameworkMethod method) {
return new StubbedTheoryAnchor(method, getTestClass());
}
public static class StubbedTheoryAnchor extends TheoryAnchor {
public StubbedTheoryAnchor(FrameworkMethod method, TestClass testClass) {
super(method, testClass);
}
private List<GuesserQueue> queues = new ArrayList<GuesserQueue>();
@Override
protected void handleAssumptionViolation(AssumptionViolatedException e) {
super.handleAssumptionViolation(e);
for (GuesserQueue queue : queues) {
queue.update(e);
}
}
@Override
protected void runWithIncompleteAssignment(Assignments incomplete)
throws Throwable {
GuesserQueue guessers = createGuesserQueue(incomplete);
queues.add(guessers);
while (!guessers.isEmpty())
runWithAssignment(incomplete.assignNext(guessers.remove(0)));
queues.remove(guessers);
}
private GuesserQueue createGuesserQueue(Assignments incomplete)
throws Throwable {
ParameterSignature nextUnassigned = incomplete.nextUnassigned();
if (nextUnassigned.hasAnnotation(Stub.class)) {
GuesserQueue queue = new GuesserQueue();
queue.add(new Guesser<Object>(nextUnassigned.getType()));
return queue;
}
return GuesserQueue.forSingleValues(incomplete.potentialsForNextUnassigned());
}
}
}