package org.eclipse.cdt.tests.dsf.gdb.framework; import java.util.HashSet; import java.util.Set; import org.junit.internal.builders.IgnoredClassRunner; import org.junit.runner.Runner; import org.junit.runners.Suite; import org.junit.runners.model.InitializationError; import org.junit.runners.model.RunnerBuilder; /** * This custom suite runner ensures that a class runs only once, no matter how * many times it appears in a suite. Redundant appearances are possible with * hierarchical suites. In some cases, this is intentional and desirable--i.e., * we want the same class to run multiple times (usually with some slight * variation). However, in some cases, the redundant appearances are * unintentional and unavoidable consequences of how the suites are defined and * used. This runner caters to the latter scenario. * * <p> * Thanks to Bill Venners and David Saff for suggesting this solution on the * junit mailing list. See <a * href="http://tech.groups.yahoo.com/group/junit/message/23208" * >http://tech.groups.yahoo.com/group/junit/message/23208</a> */ @SuppressWarnings("restriction") public class OnceOnlySuite extends Suite { private static Set<Class<?>> alreadySeen = new HashSet<Class<?>>(); public OnceOnlySuite(Class<?> testClass, final RunnerBuilder builder) throws InitializationError { super(testClass, new RunnerBuilder() { @Override public Runner runnerForClass(Class<?> testClass) throws Throwable { if (alreadySeen.contains(testClass)) { return new IgnoredClassRunner(testClass); } alreadySeen.add(testClass); return builder.runnerForClass(testClass); } }); } }