Skip to content
This repository has been archived by the owner on Jul 9, 2021. It is now read-only.

Commit

Permalink
Polishing
Browse files Browse the repository at this point in the history
  • Loading branch information
sormuras committed Aug 30, 2018
1 parent ec20f38 commit 1655fc0
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 97 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import org.junit.platform.engine.support.descriptor.AbstractTestDescriptor;
import org.junit.platform.engine.support.descriptor.ClassSource;

public class NGClassDescriptor extends AbstractTestDescriptor {
public class ClassDescriptor extends AbstractTestDescriptor {

static boolean isCandidate(Class<?> candidate) {
if (!isPublic(candidate)) {
Expand All @@ -23,14 +23,14 @@ static boolean isCandidate(Class<?> candidate) {
return true;
}

static NGClassDescriptor newContainerDescriptor(UniqueId container, Class<?> testClass) {
static ClassDescriptor newContainerDescriptor(UniqueId container, Class<?> testClass) {
UniqueId id = container.append("testng-class", testClass.getTypeName());
return new NGClassDescriptor(id, testClass);
return new ClassDescriptor(id, testClass);
}

private final Class<?> testClass;

private NGClassDescriptor(UniqueId uniqueId, Class<?> testClass) {
private ClassDescriptor(UniqueId uniqueId, Class<?> testClass) {
super(uniqueId, testClass.getSimpleName(), ClassSource.from(testClass));
this.testClass = testClass;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
import org.junit.platform.engine.support.descriptor.AbstractTestDescriptor;
import org.junit.platform.engine.support.descriptor.MethodSource;

public class NGMethodDescriptor extends AbstractTestDescriptor {
public class MethodDescriptor extends AbstractTestDescriptor {

static NGMethodDescriptor newMethodDescriptor(UniqueId container, Method method) {
static MethodDescriptor newMethodDescriptor(UniqueId container, Method method) {
UniqueId id = container.append("testng-method", method.getName());
return new NGMethodDescriptor(id, method);
return new MethodDescriptor(id, method);
}

private final Method method;

private NGMethodDescriptor(UniqueId uniqueId, Method method) {
private MethodDescriptor(UniqueId uniqueId, Method method) {
super(uniqueId, method.getName(), MethodSource.from(method));
this.method = method;
}
Expand Down
59 changes: 59 additions & 0 deletions src/main/java/org/testng/junit5/TestListener.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package org.testng.junit5;

import static org.junit.platform.engine.TestExecutionResult.failed;
import static org.junit.platform.engine.TestExecutionResult.successful;

import java.lang.reflect.Method;
import org.junit.platform.engine.EngineExecutionListener;
import org.junit.platform.engine.TestDescriptor;
import org.junit.platform.engine.UniqueId;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;

class TestListener implements ITestListener {

private final EngineExecutionListener platform;
private final UniqueId classDescriptorId;

TestListener(EngineExecutionListener platform, UniqueId classDescriptorId) {
this.platform = platform;
this.classDescriptorId = classDescriptorId;
}

private TestDescriptor convert(ITestResult result) {
Method method = result.getMethod().getConstructorOrMethod().getMethod();
return MethodDescriptor.newMethodDescriptor(classDescriptorId, method);
}

@Override
public void onTestStart(ITestResult result) {
platform.executionStarted(convert(result));
}

@Override
public void onTestSuccess(ITestResult result) {
platform.executionFinished(convert(result), successful());
}

@Override
public void onTestFailure(ITestResult result) {
platform.executionFinished(convert(result), failed(result.getThrowable()));
}

@Override
public void onTestSkipped(ITestResult result) {
platform.executionSkipped(convert(result), "because");
}

@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
platform.executionFinished(convert(result), successful());
}

@Override
public void onStart(ITestContext context) {}

@Override
public void onFinish(ITestContext context) {}
}
113 changes: 24 additions & 89 deletions src/main/java/org/testng/junit5/TestNGine.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import static org.junit.platform.engine.support.filter.ClasspathScanningSupport.buildClassNamePredicate;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Optional;
import org.junit.platform.commons.util.ClassFilter;
Expand All @@ -14,10 +13,7 @@
import org.junit.platform.engine.TestExecutionResult;
import org.junit.platform.engine.UniqueId;
import org.junit.platform.engine.support.descriptor.EngineDescriptor;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestNGListener;
import org.testng.ITestResult;
import org.testng.TestNG;
import org.testng.annotations.Test;

Expand All @@ -31,25 +27,37 @@ public String getId() {
return ENGINE_ID;
}

public Optional<String> getGroupId() {
return Optional.of("org.testng");
}

public Optional<String> getArtifactId() {
return Optional.of("testng-junit5");
}

public Optional<String> getVersion() {
return Optional.of("DEVELOPMENT");
}

public TestDescriptor discover(EngineDiscoveryRequest request, UniqueId uniqueId) {
EngineDescriptor engine = new EngineDescriptor(uniqueId, ENGINE_DISPLAY_NAME);
// inspect "request" selectors and filters passed by the user
// find TestNG-based test containers (classes) and tests (methods)
// wrap each in a new TestDescriptor
// add the created descriptor in a tree, below the "engine" descriptor
ClassFilter filter =
ClassFilter.of(buildClassNamePredicate(request), NGClassDescriptor::isCandidate);
ClassFilter.of(buildClassNamePredicate(request), ClassDescriptor::isCandidate);
DiscoveryHelper helper = new DiscoveryHelper(request, filter);
helper.discover(engine, this::handle);
return engine;
}

private void handle(EngineDescriptor engine, Class<?> candidate) {
NGClassDescriptor container =
NGClassDescriptor.newContainerDescriptor(engine.getUniqueId(), candidate);
ClassDescriptor container =
ClassDescriptor.newContainerDescriptor(engine.getUniqueId(), candidate);
Arrays.stream(candidate.getMethods())
.filter(method -> method.isAnnotationPresent(Test.class))
.map(method -> NGMethodDescriptor.newMethodDescriptor(container.getUniqueId(), method))
.map(method -> MethodDescriptor.newMethodDescriptor(container.getUniqueId(), method))
.forEach(container::addChild);
if (container.getChildren().isEmpty()) {
return;
Expand All @@ -59,95 +67,22 @@ private void handle(EngineDescriptor engine, Class<?> candidate) {

public void execute(ExecutionRequest request) {
TestDescriptor engine = request.getRootTestDescriptor();
EngineExecutionListener listener = request.getEngineExecutionListener();
listener.executionStarted(engine);
EngineExecutionListener engineListener = request.getEngineExecutionListener();
engineListener.executionStarted(engine);

// iterate engine.getChildren() recursively and process each via:
// 1. tell the listener we started
// 2. try to execute the container/test and evaluate its result
// 3. tell the listener about the test execution result
for (TestDescriptor classDescriptor : engine.getChildren()) {
listener.executionStarted(classDescriptor);
engineListener.executionStarted(classDescriptor);

Class<?>[] testClasses = {((NGClassDescriptor) classDescriptor).getTestClass()};
TestListener testListener = new TestListener(listener, classDescriptor.getUniqueId());
UniqueId classId = classDescriptor.getUniqueId();
Class<?>[] testClasses = {((ClassDescriptor) classDescriptor).getTestClass()};

TestNG testNG = new TestNG(false);
testNG.addListener((ITestNGListener) testListener);
testNG.addListener((ITestNGListener) new TestListener(engineListener, classId));
testNG.setTestClasses(testClasses);
testNG.run();

listener.executionFinished(classDescriptor, TestExecutionResult.successful());
}
listener.executionFinished(engine, TestExecutionResult.successful());
}

public Optional<String> getGroupId() {
return Optional.of("org.testng");
}

public Optional<String> getArtifactId() {
return Optional.of("testng-junit5");
}

public Optional<String> getVersion() {
return Optional.of("DEVELOPMENT");
}

class TestListener implements ITestListener {

final EngineExecutionListener platform;
final UniqueId classDescriptorId;

TestListener(EngineExecutionListener platform, UniqueId classDescriptorId) {
this.platform = platform;
this.classDescriptorId = classDescriptorId;
}

private TestDescriptor toDescriptor(ITestResult result) {
Method method = result.getMethod().getConstructorOrMethod().getMethod();
return NGMethodDescriptor.newMethodDescriptor(classDescriptorId, method);
}

@Override
public void onTestStart(ITestResult result) {
// System.out.println("TestListener.onTestStart" + " " + result);
platform.executionStarted(toDescriptor(result));
}

@Override
public void onTestSuccess(ITestResult result) {
// System.out.println("TestListener.onTestSuccess" + " " + result);
platform.executionFinished(toDescriptor(result), TestExecutionResult.successful());
}

@Override
public void onTestFailure(ITestResult result) {
// System.out.println("TestListener.onTestFailure" + " " + result);
platform.executionFinished(
toDescriptor(result), TestExecutionResult.failed(result.getThrowable()));
}

@Override
public void onTestSkipped(ITestResult result) {
// System.out.println("TestListener.onTestSkipped" + " " + result);
platform.executionSkipped(toDescriptor(result), "because");
}

@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
// System.out.println("TestListener.onTestFailedButWithinSuccessPercentage" + " " + result);
platform.executionFinished(toDescriptor(result), TestExecutionResult.successful());
}

@Override
public void onStart(ITestContext context) {
// System.out.println("TestListener.onStart" + " " + context);
}

@Override
public void onFinish(ITestContext context) {
// System.out.println("TestListener.onFinish" + " " + context);
engineListener.executionFinished(classDescriptor, TestExecutionResult.successful());
}
engineListener.executionFinished(engine, TestExecutionResult.successful());
}
}

0 comments on commit 1655fc0

Please sign in to comment.