/******************************************************************************* * 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.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.internal.junit.JUnitCorePlugin; import org.eclipse.jdt.internal.junit.util.CoreTestSearchEngine; public class TestKindRegistry { public static final String JUNIT3_TEST_KIND_ID= "org.eclipse.jdt.junit.loader.junit3"; //$NON-NLS-1$ public static final String JUNIT4_TEST_KIND_ID= "org.eclipse.jdt.junit.loader.junit4"; //$NON-NLS-1$ public static TestKindRegistry getDefault() { if (fgRegistry != null) return fgRegistry; fgRegistry= new TestKindRegistry(Platform.getExtensionRegistry().getExtensionPoint(JUnitCorePlugin.ID_EXTENSION_POINT_TEST_KINDS)); return fgRegistry; } private static TestKindRegistry fgRegistry; private final IExtensionPoint fPoint; private ArrayList<TestKind> fTestKinds; private TestKindRegistry(IExtensionPoint point) { fPoint = point; } public ArrayList<TestKind> getAllKinds() { loadKinds(); return fTestKinds; } private void loadKinds() { if (fTestKinds != null) return; ArrayList<TestKind> items= new ArrayList<>(); for (Iterator<IConfigurationElement> iter= getConfigurationElements().iterator(); iter.hasNext();) { IConfigurationElement element= iter.next(); items.add(new TestKind(element)); } Collections.sort(items, new Comparator<TestKind>() { @Override public int compare(TestKind kind0, TestKind kind1) { if (kind0.precedes(kind1)) return -1; if (kind1.precedes(kind0)) return 1; return 0; } }); fTestKinds= items; } public ArrayList<String> getDisplayNames() { ArrayList<String> result = new ArrayList<>(); ArrayList<TestKind> testTypes = getAllKinds(); for (Iterator<TestKind> iter = testTypes.iterator(); iter.hasNext();) { ITestKind type = iter.next(); result.add(type.getDisplayName()); } return result; } /** * @param testKindId an id, can be <code>null</code> * @return a TestKind, ITestKind.NULL if not available */ public ITestKind getKind(String testKindId) { if (testKindId != null) { for (Iterator<TestKind> iter= getAllKinds().iterator(); iter.hasNext();) { TestKind kind= iter.next(); if (testKindId.equals(kind.getId())) return kind; } } return ITestKind.NULL; } public static String getContainerTestKindId(IJavaElement element) { if (element != null) { IJavaProject project= element.getJavaProject(); if (CoreTestSearchEngine.is50OrHigher(project) && CoreTestSearchEngine.hasTestAnnotation(project)) { return JUNIT4_TEST_KIND_ID; } } return JUNIT3_TEST_KIND_ID; } public static ITestKind getContainerTestKind(IJavaElement element) { return getDefault().getKind(getContainerTestKindId(element)); } private ArrayList<IConfigurationElement> getConfigurationElements() { ArrayList<IConfigurationElement> items= new ArrayList<>(); IExtension[] extensions= fPoint.getExtensions(); for (int i= 0; i < extensions.length; i++) { IExtension extension= extensions[i]; IConfigurationElement[] elements= extension.getConfigurationElements(); for (int j= 0; j < elements.length; j++) { IConfigurationElement element= elements[j]; items.add(element); } } return items; } public String getAllKindIds() { ArrayList<TestKind> allKinds= getAllKinds(); String returnThis= ""; //$NON-NLS-1$ for (Iterator<TestKind> iter= allKinds.iterator(); iter.hasNext();) { ITestKind kind= iter.next(); returnThis+= "(" + kind.getId() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } return returnThis; } }