Skip to content

Commit 9891333

Browse files
Simeon AndreevSimeon Andreev
authored andcommitted
testing JUnit 5 equivalent of XpectRunner
1 parent e27f2f2 commit 9891333

File tree

15 files changed

+594
-32
lines changed

15 files changed

+594
-32
lines changed

org.eclipse.xpect.ui/src/org/eclipse/xpect/ui/util/XpectFileAccess.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.eclipse.xpect.XpectFile;
3131
import org.eclipse.xpect.registry.ILanguageInfo;
3232
import org.eclipse.xpect.runner.XpectRunner;
33+
import org.eclipse.xpect.runner.XpectTestGlobalState;
3334

3435
import com.google.inject.Injector;
3536

@@ -67,8 +68,8 @@ protected static ResourceSet cloneResourceSet(ResourceSet rs) {
6768
// need delegation or nothing because of "java" protocol
6869
// result.setResourceFactoryRegistry(rs.getResourceFactoryRegistry());
6970
result.setURIConverter(rs.getURIConverter());
70-
if (XpectRunner.testClassloader != null) {
71-
result.setClasspathURIContext(XpectRunner.testClassloader);
71+
if (XpectTestGlobalState.INSTANCE.testClass() != null) {
72+
result.setClasspathURIContext(XpectTestGlobalState.INSTANCE.testClass().getClassLoader());
7273
result.setClasspathUriResolver(new ClassloaderClasspathUriResolver());
7374
} else if (rs instanceof XtextResourceSet) {
7475
XtextResourceSet xrs = (XtextResourceSet) rs;

org.eclipse.xpect.ui/src/org/eclipse/xpect/ui/util/XpectUtil.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.eclipse.xpect.XpectFile;
2929
import org.eclipse.xpect.XpectJavaModel;
3030
import org.eclipse.xpect.runner.XpectRunner;
31+
import org.eclipse.xpect.runner.XpectTestGlobalState;
3132
import org.eclipse.xpect.ui.internal.XpectActivator;
3233

3334
import com.google.inject.Injector;
@@ -40,8 +41,8 @@ public static XpectFile loadFile(IFile file) {
4041
Injector injector = XpectActivator.getInstance().getInjector(XpectActivator.ORG_ECLIPSE_XPECT_XPECT);
4142
XtextResourceSet rs = new XtextResourceSet();
4243
IJavaProject javaProject = JavaCore.create(file.getProject());
43-
if (XpectRunner.testClassloader != null) {
44-
rs.setClasspathURIContext(XpectRunner.testClassloader);
44+
if (XpectTestGlobalState.INSTANCE.testClass() != null) {
45+
rs.setClasspathURIContext(XpectTestGlobalState.INSTANCE.testClass().getClassLoader());
4546
rs.setClasspathUriResolver(new ClassloaderClasspathUriResolver());
4647
} else if (javaProject != null && javaProject.exists()) {
4748
rs.setClasspathURIContext(javaProject);

org.eclipse.xpect/META-INF/MANIFEST.MF

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,15 @@ Require-Bundle: org.eclipse.xtext,
2121
org.junit;bundle-version="4.11.0";visibility:=reexport,
2222
org.eclipse.xtext.common.types;visibility:=reexport,
2323
org.apache.log4j;bundle-version="1.2.0";visibility:=reexport,
24-
org.objectweb.asm;bundle-version="[9.5.0,10.0.0)";resolution:=optional
24+
org.objectweb.asm;bundle-version="[9.5.0,10.0.0)";resolution:=optional,
25+
junit-jupiter-api;bundle-version="5.10.2"
2526
Bundle-RequiredExecutionEnvironment: JavaSE-11
2627
Export-Package: org.eclipse.xpect,
28+
org.eclipse.xpect.dynamic,
2729
org.eclipse.xpect.expectation,
28-
org.eclipse.xpect.expectation.impl;
29-
x-friends:="org.eclipse.xpect.xtext.lib,
30-
org.eclipse.xpect.tests",
30+
org.eclipse.xpect.expectation.impl;x-friends:="org.eclipse.xpect.xtext.lib,org.eclipse.xpect.tests",
3131
org.eclipse.xpect.formatting,
32-
org.eclipse.xpect.lexer;
33-
x-friends:="org.eclipse.xpect.tests",
32+
org.eclipse.xpect.lexer;x-friends:="org.eclipse.xpect.tests",
3433
org.eclipse.xpect.lib,
3534
org.eclipse.xpect.model,
3635
org.eclipse.xpect.parameter,
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.eclipse.xpect.dynamic;
2+
3+
import java.util.stream.Stream;
4+
5+
import org.eclipse.xpect.XpectImport;
6+
import org.eclipse.xpect.runner.TestTitleProvider;
7+
import org.junit.jupiter.api.DynamicContainer;
8+
import org.junit.jupiter.api.TestFactory;
9+
10+
@XpectImport(TestTitleProvider.class)
11+
public interface IXpectDynamicTestFactory {
12+
13+
@TestFactory
14+
default Stream<DynamicContainer> generateTests() {
15+
return XpectDynamicTestFactory.xpectTests(getClass());
16+
}
17+
}
18+
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package org.eclipse.xpect.dynamic;
2+
3+
import java.lang.reflect.InvocationTargetException;
4+
5+
import org.eclipse.xpect.XjmTestMethod;
6+
import org.eclipse.xpect.runner.ValidatingSetup;
7+
import org.eclipse.xpect.runner.XpectTestGlobalState;
8+
import org.eclipse.xpect.setup.ThisTestObject;
9+
import org.eclipse.xpect.state.Creates;
10+
import org.eclipse.xpect.state.StateContainer;
11+
import org.junit.jupiter.api.DynamicTest;
12+
13+
import com.google.common.base.Preconditions;
14+
15+
public class XpectDynamicTest {
16+
17+
private final String className;
18+
private XjmTestMethod method;
19+
private final StateContainer state;
20+
21+
public XpectDynamicTest(StateContainer state, XjmTestMethod method) {
22+
Preconditions.checkNotNull(method);
23+
this.className = XpectTestGlobalState.INSTANCE.testClass().getName();
24+
this.method = method;
25+
this.state = state;
26+
}
27+
28+
@Creates
29+
public XpectDynamicTest create() {
30+
return this;
31+
}
32+
33+
public XjmTestMethod getMethod() {
34+
return method;
35+
}
36+
37+
public StateContainer getState() {
38+
return state;
39+
}
40+
41+
public DynamicTest test() {
42+
String testName = getName();
43+
return DynamicTest.dynamicTest(testName, () -> {
44+
state.get(ValidatingSetup.class).get().validate();
45+
try {
46+
runInternal();
47+
} finally {
48+
state.invalidate();
49+
}
50+
});
51+
}
52+
53+
public String getName() {
54+
String testName = formatDisplayName(method.getName(), className);
55+
return testName;
56+
}
57+
58+
protected void runInternal() throws Throwable {
59+
Object test = state.get(Object.class, ThisTestObject.class).get();
60+
// Object test = method.getTest().getJavaClass().newInstance();
61+
// ctx.setMethod(method);
62+
// ctx.setTestInstance(test);
63+
try {
64+
// if (setup != null)
65+
// ctx.setUserTestCtx(setup.beforeTest(ctx, ctx.getUserFileCtx()));
66+
method.getJavaMethod().invoke(test);
67+
} catch (InvocationTargetException e) {
68+
throw e.getCause();
69+
}
70+
// finally {
71+
// if (setup != null)
72+
// setup.afterTest(ctx, ctx.getUserTestCtx());
73+
// }
74+
}
75+
76+
private static String formatDisplayName(String name, String className) {
77+
return String.format("%s(%s)", name, className);
78+
}
79+
80+
}
81+
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package org.eclipse.xpect.dynamic;
2+
3+
import static org.eclipse.xpect.runner.DescriptionFactory.*;
4+
5+
import java.util.Arrays;
6+
import java.util.List;
7+
import java.util.stream.Stream;
8+
9+
import org.eclipse.emf.common.util.URI;
10+
import org.eclipse.xpect.XjmMethod;
11+
import org.eclipse.xpect.XjmTestMethod;
12+
import org.eclipse.xpect.XpectFile;
13+
import org.eclipse.xpect.XpectInvocation;
14+
import org.eclipse.xpect.XpectJavaModel;
15+
import org.eclipse.xpect.runner.IXpectURIProvider;
16+
import org.eclipse.xpect.runner.TestExecutor;
17+
import org.eclipse.xpect.runner.TestRunner;
18+
import org.eclipse.xpect.runner.ValidatingSetup;
19+
import org.eclipse.xpect.runner.XpectTestRunner;
20+
import org.eclipse.xpect.setup.ThisRootTestClass;
21+
import org.eclipse.xpect.state.Creates;
22+
import org.eclipse.xpect.state.StateContainer;
23+
import org.junit.jupiter.api.DynamicContainer;
24+
import org.junit.jupiter.api.DynamicTest;
25+
import org.junit.runner.Description;
26+
import org.junit.runner.Runner;
27+
import org.junit.runner.notification.Failure;
28+
import org.junit.runner.notification.RunNotifier;
29+
30+
import com.google.common.collect.Lists;
31+
32+
public class XpectDynamicTestCase {
33+
private List<DynamicContainer> children;
34+
private Description description;
35+
private final StateContainer state;
36+
private final XpectFile xpectFile;
37+
38+
public XpectDynamicTestCase(StateContainer state, XpectFile file) {
39+
this.xpectFile = file;
40+
this.state = state;
41+
}
42+
43+
@Creates
44+
public XpectDynamicTestCase create() {
45+
return this;
46+
}
47+
48+
public DynamicContainer dynamicContainer() {
49+
return DynamicContainer.dynamicContainer(getName(), getChildren().stream());
50+
}
51+
52+
protected List<DynamicContainer> createChildren() {
53+
List<DynamicContainer> children = Lists.newArrayList();
54+
if (xpectFile != null) {
55+
XpectJavaModel xjm = xpectFile.getJavaModel();
56+
for (XjmMethod method : xjm.getMethods().values())
57+
if (method instanceof XjmTestMethod) {
58+
XpectDynamicTest test = createDynamicTest((XjmTestMethod) method);
59+
if (test != null)
60+
children.add(DynamicContainer.dynamicContainer(test.getName(), Arrays.asList(test.test())));
61+
}
62+
for (XpectInvocation inv : xpectFile.getInvocations()) {
63+
DynamicContainer test = createDynamicTest(inv);
64+
if (test != null)
65+
children.add(test);
66+
}
67+
}
68+
return children;
69+
}
70+
71+
protected XpectDynamicTest createDynamicTest(XjmTestMethod method) {
72+
StateContainer childState = TestExecutor.createState(state, TestExecutor.createTestConfiguration(method));
73+
return childState.get(XpectDynamicTest.class).get();
74+
}
75+
76+
protected DynamicContainer createDynamicTest(XpectInvocation invocation) {
77+
StateContainer childState = TestExecutor.createState(state, TestExecutor.createXpectConfiguration(invocation));
78+
List<DynamicTest> tests = Arrays.asList(childState.get(XpectInvocationDynamicTest.class).get().test());
79+
String testClassName = getJavaTestClass().getName();
80+
IXpectURIProvider uriProvider = getURIProvider();
81+
String testName = XpectInvocationDynamicTest.getTestNameForInvocation(uriProvider, testClassName, invocation);
82+
return DynamicContainer.dynamicContainer(testName, tests);
83+
}
84+
85+
protected List<DynamicContainer> getChildren() {
86+
if (children == null)
87+
children = createChildren();
88+
return children;
89+
}
90+
91+
public Class<?> getJavaTestClass() {
92+
return state.get(Class.class, ThisRootTestClass.class).get();
93+
}
94+
95+
public IXpectURIProvider getURIProvider() {
96+
return state.get(IXpectURIProvider.class).get();
97+
}
98+
99+
public StateContainer getState() {
100+
return state;
101+
}
102+
103+
public URI getUri() {
104+
return xpectFile.eResource().getURI();
105+
}
106+
107+
public XpectFile getXpectFile() {
108+
return xpectFile;
109+
}
110+
111+
public String getName() {
112+
IXpectURIProvider uriProvider = getURIProvider();
113+
URI uri = getUri();
114+
URI deresolved = uriProvider.deresolveToProject(uri);
115+
String pathInProject = deresolved.trimSegments(1).toString();
116+
String fileName = deresolved.lastSegment();
117+
return fileName + ": " + pathInProject;
118+
}
119+
}
120+

0 commit comments

Comments
 (0)