| 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()); |
| } |
| } |
| |
| } |