org.eclipse.mylyn.internal.java.ui.junit.InteractionContextTestUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mylyn.internal.java.ui.junit.InteractionContextTestUtil.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2008 Tasktop Technologies 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:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.internal.java.ui.junit;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeHierarchy;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.junit.launcher.JUnitLaunchConfigurationConstants;
import org.eclipse.jdt.internal.junit.launcher.TestKindRegistry;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
import org.eclipse.mylyn.context.core.ContextCore;
import org.eclipse.mylyn.context.core.IInteractionElement;
import org.eclipse.mylyn.context.core.IInteractionRelation;
import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
import org.eclipse.mylyn.internal.java.ui.search.JUnitReferencesProvider;

/**
 * @author Mik Kersten
 */
public class InteractionContextTestUtil {

    public static void setupTestConfiguration(Set<IType> contextTestCases, ILaunchConfiguration configuration,
            IProgressMonitor pm) throws CoreException {
        String testKindId = TestKindRegistry.JUNIT3_TEST_KIND_ID;

        IJavaProject javaProject = null;
        for (IType type : contextTestCases) {
            IProjectNature nature = type.getJavaProject().getProject().getNature("org.eclipse.pde.PluginNature"); //$NON-NLS-1$
            if (nature != null) {
                // HACK: might want another project
                javaProject = type.getJavaProject();
            }
        }

        ILaunchConfigurationWorkingCopy workingCopy = configuration.getWorkingCopy();
        if (javaProject != null) {
            workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
                    javaProject.getElementName());
        }

        // HACK: only checks first type
        if (contextTestCases.size() > 0) {
            testKindId = TestKindRegistry.getContainerTestKindId(contextTestCases.iterator().next());
            workingCopy.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_RUNNER_KIND, testKindId);
            //         testKind = TestKindRegistry.getDefault().getKind(configuration);// contextTestCases.iterator().next());
        }
        workingCopy.doSave();
    }

    public static Set<IType> getTestCasesInContext() {
        Set<IType> testTypes = new HashSet<IType>();
        List<IInteractionElement> interesting = ContextCore.getContextManager().getActiveContext().getInteresting();
        AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(JavaStructureBridge.CONTENT_TYPE);
        try {
            for (IInteractionElement element : interesting) {
                if (element.getContentType().equals(JavaStructureBridge.CONTENT_TYPE)) {
                    Object javaElement = bridge.getObjectForHandle(element.getHandleIdentifier());
                    if (javaElement instanceof IType) {
                        IType type = (IType) javaElement;
                        if (isTestType(type)) {
                            testTypes.add(type);
                        }
                    }
                    for (IInteractionRelation relation : element.getRelations()) {
                        if (relation.getRelationshipHandle().equals(JUnitReferencesProvider.ID)) {
                            IInteractionElement target = relation.getTarget();
                            Object targetObject = bridge.getObjectForHandle(target.getHandleIdentifier());
                            if (targetObject instanceof IMethod) {
                                IMethod testMethod = (IMethod) targetObject;
                                if (isTestType((IType) testMethod.getParent())) {
                                    testTypes.add((IType) testMethod.getParent());
                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            StatusHandler.log(
                    new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Could not add all test types", e)); //$NON-NLS-1$
        }
        return testTypes;
    }

    public static boolean isTestType(IType type) {
        ITypeHierarchy hierarchy;
        try {
            if (Flags.isAbstract(type.getFlags())) {
                return false;
            }
        } catch (JavaModelException e) {
            return false;
        }
        try {
            hierarchy = type.newSupertypeHierarchy(null);
            IType[] supertypes = hierarchy.getAllSuperclasses(type);
            for (IType supertype : supertypes) {
                if (supertype.getFullyQualifiedName().equals("junit.framework.TestCase")) { //$NON-NLS-1$
                    return true;
                }
            }
        } catch (JavaModelException e) {
            // ContextCorePlugin.log(e, "could not determine test type");
            // ignore, hierarchy is probably inconsistent
        }
        return false;
    }
}