| /******************************************************************************* |
| * Copyright (c) 2016, 2017 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.jdt.internal.junit5.runner; |
| |
| import java.util.Set; |
| |
| import org.junit.platform.launcher.Launcher; |
| import org.junit.platform.launcher.LauncherDiscoveryRequest; |
| import org.junit.platform.launcher.TestIdentifier; |
| import org.junit.platform.launcher.TestPlan; |
| |
| import org.eclipse.jdt.internal.junit.runner.ITestIdentifier; |
| import org.eclipse.jdt.internal.junit.runner.ITestReference; |
| import org.eclipse.jdt.internal.junit.runner.IVisitsTestTrees; |
| import org.eclipse.jdt.internal.junit.runner.RemoteTestRunner; |
| import org.eclipse.jdt.internal.junit.runner.TestExecution; |
| import org.eclipse.jdt.internal.junit.runner.TestIdMap; |
| |
| public class JUnit5TestReference implements ITestReference { |
| |
| private LauncherDiscoveryRequest fRequest; |
| |
| private Launcher fLauncher; |
| |
| private TestPlan fTestPlan; |
| |
| private RemoteTestRunner fRemoteTestRunner; |
| |
| public JUnit5TestReference(LauncherDiscoveryRequest request, Launcher launcher, RemoteTestRunner remoteTestRunner) { |
| fRequest= request; |
| fLauncher= launcher; |
| fRemoteTestRunner= remoteTestRunner; |
| fTestPlan= fLauncher.discover(fRequest); |
| } |
| |
| @Override |
| public int countTestCases() { |
| return (int) fTestPlan.countTestIdentifiers(TestIdentifier::isTest); |
| } |
| |
| @Override |
| public void sendTree(IVisitsTestTrees notified) { |
| for (TestIdentifier root : fTestPlan.getRoots()) { |
| for (TestIdentifier child : fTestPlan.getChildren(root)) { |
| sendTree(notified, child); |
| } |
| } |
| } |
| |
| private void sendTree(IVisitsTestTrees notified, TestIdentifier testIdentifier) { |
| JUnit5Identifier identifier= new JUnit5Identifier(testIdentifier); |
| String parentId= getParentId(testIdentifier, fTestPlan); |
| if (testIdentifier.isTest()) { |
| notified.visitTreeEntry(identifier, false, 1, false, parentId); |
| } else { |
| Set<TestIdentifier> children= fTestPlan.getChildren(testIdentifier); |
| notified.visitTreeEntry(identifier, true, children.size(), false, parentId); |
| for (TestIdentifier child : children) { |
| sendTree(notified, child); |
| } |
| } |
| } |
| |
| /** |
| * @param testIdentifier the test identifier whose parent id is required |
| * @param testPlan the test plan containing the test |
| * @return the parent id from {@link TestIdMap} if the parent is present, otherwise |
| * <code>"-1"</code> |
| */ |
| private String getParentId(TestIdentifier testIdentifier, TestPlan testPlan) { |
| // Same as JUnit5TestListener.getParentId(TestIdentifier testIdentifier, TestPlan testPlan) |
| return testPlan.getParent(testIdentifier).map(parent -> fRemoteTestRunner.getTestId(new JUnit5Identifier(parent))).orElse("-1"); //$NON-NLS-1$ |
| } |
| |
| @Override |
| public void run(TestExecution execution) { |
| fLauncher.execute(fRequest, new JUnit5TestListener(execution.getListener(), fRemoteTestRunner)); |
| } |
| |
| @Override |
| public ITestIdentifier getIdentifier() { // not used |
| return new JUnit5Identifier(fTestPlan.getRoots().iterator().next()); |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (!(obj instanceof JUnit5TestReference)) |
| return false; |
| |
| JUnit5TestReference ref= (JUnit5TestReference) obj; |
| return (ref.fRequest.equals(fRequest)); |
| } |
| |
| @Override |
| public int hashCode() { |
| return fRequest.hashCode(); |
| } |
| |
| @Override |
| public String toString() { |
| return fRequest.toString(); |
| } |
| |
| } |