/******************************************************************************* * Copyright (c) 2000, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * David Saff (saff@mit.edu) - bug 102632: [JUnit] Support for JUnit 4. *******************************************************************************/ package org.eclipse.jdt.internal.junit.runner; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.HashSet; import java.util.List; import java.util.Vector; import junit.extensions.TestDecorator; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class FailuresFirstPrioritizer implements ITestPrioritizer { private HashSet fPriorities; public FailuresFirstPrioritizer(String[] priorities) { fPriorities= new HashSet(Arrays.asList(priorities)); } public Test prioritize(Test suite) { doPrioritize(suite, new ArrayList()); return suite; } private void doPrioritize(Test suite, List path) { if (suite instanceof TestCase) { TestCase testCase= (TestCase) suite; if (hasPriority(testCase)) reorder(testCase, path); } else if (suite instanceof TestSuite) { TestSuite aSuite= (TestSuite)suite; path.add(suite); loopTests(path, aSuite); path.remove(path.size()-1); } else if (suite instanceof TestDecorator) { TestDecorator aDecorator= (TestDecorator)suite; path.add(aDecorator); doPrioritize(aDecorator.getTest(), path); path.remove(path.size()-1); } } private void loopTests(List path, TestSuite aSuite) { for (Enumeration e= aSuite.tests(); e.hasMoreElements();) { doPrioritize((Test)e.nextElement(), path); } } private void reorder(Test test, List path) { doReorder(test, path, path.size()-1); } private void doReorder(Test test, List path, int top) { if (top < 0) return; Test topTest= (Test) path.get(top); // only reorder TestSuites if (topTest instanceof TestSuite) { TestSuite suite= (TestSuite) topTest; moveTestToFront(suite, test); } doReorder(topTest, path, top-1); } void moveTestToFront(TestSuite suite, Test test) { Vector tests= (Vector)getField(suite, "fTests"); //$NON-NLS-1$ for(int i= 0; i < tests.size(); i++) { if (tests.get(i) == test) { tests.remove(i); tests.insertElementAt(test, 0); } } } private boolean hasPriority(TestCase testCase) { return fPriorities.contains(testCase.toString()); } public static Object getField(Object object, String fieldName) { return getFieldInClass(object, fieldName, object.getClass()); } private static Object getFieldInClass(Object object, String fieldName, Class clazz) { Field field= null; if (clazz == null) return null; try { field= clazz.getDeclaredField(fieldName); field.setAccessible(true); return field.get(object); } catch (Exception e) { // fall through } return getFieldInClass(object, fieldName, clazz.getSuperclass()); } }