/******************************************************************************* * Copyright (c) 2006, 2015 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) - initial API and implementation * (bug 102632: [JUnit] Support for JUnit 4.) *******************************************************************************/ package org.eclipse.jdt.internal.junit.launcher; import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IRegion; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.ITypeHierarchy; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.junit.JUnitCorePlugin; import org.eclipse.jdt.internal.junit.JUnitMessages; import org.eclipse.jdt.internal.junit.util.CoreTestSearchEngine; public class JUnit3TestFinder implements ITestFinder { @Override public void findTestsInContainer(IJavaElement element, Set<IType> result, IProgressMonitor pm) throws CoreException { if (element == null || result == null) { throw new IllegalArgumentException(); } if (pm == null) pm= new NullProgressMonitor(); pm.beginTask(JUnitMessages.TestSearchEngine_message_searching, 10); try { if (element instanceof IType) { if (isTest((IType) element)) { result.add((IType) element); } } else if (element instanceof ICompilationUnit) { IType[] types= ((ICompilationUnit) element).getAllTypes(); for (int i= 0; i < types.length; i++) { IType type= types[i]; if (isTest(types[i])) { result.add(type); } } } else { findTestCases(element, result, new SubProgressMonitor(pm, 7)); if (pm.isCanceled()) { return; } CoreTestSearchEngine.findSuiteMethods(element, result, new SubProgressMonitor(pm, 3)); } if (pm.isCanceled()) { return; } } finally { pm.done(); } } private static void findTestCases(IJavaElement element, Set<IType> result, IProgressMonitor pm) throws JavaModelException { IJavaProject javaProject= element.getJavaProject(); IType testCaseType= javaProject.findType(JUnitCorePlugin.TEST_INTERFACE_NAME); if (testCaseType == null) return; IRegion region= CoreTestSearchEngine.getRegion(element); ITypeHierarchy typeHierarchy= javaProject.newTypeHierarchy(testCaseType, region, pm); CoreTestSearchEngine.findTestImplementorClasses(typeHierarchy, testCaseType, region, result); } @Override public boolean isTest(IType type) throws JavaModelException { return CoreTestSearchEngine.isAccessibleClass(type) && (CoreTestSearchEngine.hasSuiteMethod(type) || isTestImplementor(type)); } private static boolean isTestImplementor(IType type) throws JavaModelException { if (!Flags.isAbstract(type.getFlags()) && CoreTestSearchEngine.isTestImplementor(type)) { return true; } return false; } }