Skip to content

Commit 69c0f67

Browse files
Quang TranGitHub Enterprise
Quang Tran
authored and
GitHub Enterprise
committed
Merge pull request #266 from NumberFour/IDE-2453
IDE-2453: IDE does not add .n4jsx files to the test-catalog
2 parents 6d71236 + 32a6fc6 commit 69c0f67

File tree

15 files changed

+360
-13
lines changed

15 files changed

+360
-13
lines changed

plugins/eu.numberfour.n4js.tester/plugin.xml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,13 @@ Contributors:
1212
<?eclipse version="3.4"?>
1313
<plugin>
1414
<extension-point id="eu.numberfour.n4js.tester.testers" name="N4JS Testers" schema="schema/eu.numberfour.n4js.tester.testers.exsd"/>
15-
15+
<extension-point id="eu.numberfour.n4js.tester.testFileExtensions" name="Test File Extensions" schema="schema/eu.numberfour.n4js.tester.testfileExtensions.exsd"/>
16+
17+
<!-- Register .n4js file extension as test file extension -->
18+
<extension
19+
point="eu.numberfour.n4js.tester.testFileExtensions">
20+
<testFileExtension
21+
fileExtension="n4js">
22+
</testFileExtension>
23+
</extension>
1624
</plugin>
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<?xml version='1.0' encoding='UTF-8'?>
2+
<!-- Schema file written by PDE -->
3+
<schema targetNamespace="eu.numberfour.n4js.tester" xmlns="http://www.w3.org/2001/XMLSchema">
4+
<annotation>
5+
<appinfo>
6+
<meta.schema plugin="eu.numberfour.n4js.tester" id="testfileExtensions" name="Test File Extensions"/>
7+
</appinfo>
8+
<documentation>
9+
This extension point allows third-party plug-ins to specify file extensions that are considered as test files.
10+
</documentation>
11+
</annotation>
12+
13+
<element name="extension">
14+
<annotation>
15+
<appinfo>
16+
<meta.element />
17+
</appinfo>
18+
</annotation>
19+
<complexType>
20+
<sequence minOccurs="1" maxOccurs="unbounded">
21+
<element ref="testFileExtension"/>
22+
</sequence>
23+
<attribute name="point" type="string" use="required">
24+
<annotation>
25+
<documentation>
26+
27+
</documentation>
28+
</annotation>
29+
</attribute>
30+
<attribute name="id" type="string">
31+
<annotation>
32+
<documentation>
33+
34+
</documentation>
35+
</annotation>
36+
</attribute>
37+
<attribute name="name" type="string">
38+
<annotation>
39+
<documentation>
40+
41+
</documentation>
42+
<appinfo>
43+
<meta.attribute translatable="true"/>
44+
</appinfo>
45+
</annotation>
46+
</attribute>
47+
</complexType>
48+
</element>
49+
50+
<element name="testFileExtension">
51+
<complexType>
52+
<attribute name="fileExtension" type="string">
53+
<annotation>
54+
<documentation>
55+
The file extension to be included in the test catalog
56+
</documentation>
57+
</annotation>
58+
</attribute>
59+
</complexType>
60+
</element>
61+
62+
63+
<annotation>
64+
<appinfo>
65+
<meta.section type="examples"/>
66+
</appinfo>
67+
<documentation>
68+
The following example shows how to specify .n4jsx as files:
69+
&lt;pre&gt;
70+
&lt;extension
71+
point=&quot;eu.numberfour.n4js.tester.testFileExtensions&quot;&gt;
72+
&lt;testFileExtension
73+
fileExtension=&quot;n4jsx&quot;&gt;
74+
&lt;/testFileExtension&gt;
75+
&lt;/extension&gt;
76+
&lt;/pre&gt;
77+
</documentation>
78+
</annotation>
79+
80+
<annotation>
81+
<appinfo>
82+
<meta.section type="apiinfo"/>
83+
</appinfo>
84+
<documentation>
85+
Third-party plugins only need to specify file extensions without implementing any code.
86+
</documentation>
87+
</annotation>
88+
89+
<annotation>
90+
<appinfo>
91+
<meta.section type="implementation"/>
92+
</appinfo>
93+
<documentation>
94+
See plugin.xml of the project n4jsx.xspec.ui to see how this extension point is used.
95+
</documentation>
96+
</annotation>
97+
98+
<annotation>
99+
<appinfo>
100+
<meta.section type="copyright"/>
101+
</appinfo>
102+
<documentation>
103+
&lt;pre&gt;
104+
Copyright (c) 2016 NumberFour AG.
105+
All rights reserved. This program and the accompanying materials
106+
are made available under the terms of the Eclipse Public License v1.0
107+
which accompanies this distribution, and is available at
108+
http://www.eclipse.org/legal/epl-v10.html
109+
110+
Contributors:
111+
NumberFour AG - Initial API and implementation
112+
&lt;/pre&gt;
113+
</documentation>
114+
</annotation>
115+
116+
</schema>

plugins/eu.numberfour.n4js.tester/src/eu/numberfour/n4js/tester/TestDiscoveryHelper.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,12 @@
1212

1313
import static com.google.common.base.Optional.absent;
1414
import static com.google.common.base.Optional.fromNullable;
15-
import static com.google.common.base.Strings.nullToEmpty;
1615
import static com.google.common.collect.FluentIterable.from;
1716
import static com.google.common.collect.Iterables.isEmpty;
1817
import static com.google.common.collect.Lists.newArrayList;
1918
import static com.google.common.collect.Maps.newHashMap;
2019
import static com.google.common.collect.Sets.newHashSet;
2120
import static eu.numberfour.n4js.AnnotationDefinition.TEST_METHOD;
22-
import static eu.numberfour.n4js.N4JSGlobals.N4JS_FILE_EXTENSION;
2321
import static eu.numberfour.n4js.resource.N4JSResourceDescriptionStrategy.ABSTRACT_KEY;
2422
import static eu.numberfour.n4js.resource.N4JSResourceDescriptionStrategy.EXPORTED_CLASS_KEY;
2523
import static eu.numberfour.n4js.resource.N4JSResourceDescriptionStrategy.TEST_CLASS_KEY;
@@ -60,6 +58,7 @@
6058
import eu.numberfour.n4js.tester.domain.TestCase;
6159
import eu.numberfour.n4js.tester.domain.TestSuite;
6260
import eu.numberfour.n4js.tester.domain.TestTree;
61+
import eu.numberfour.n4js.tester.extension.TestFileExtensionsRegistry;
6362
import eu.numberfour.n4js.ts.types.TClass;
6463
import eu.numberfour.n4js.ts.types.TMember;
6564
import eu.numberfour.n4js.ts.types.TMethod;
@@ -73,6 +72,9 @@
7372
*/
7473
public class TestDiscoveryHelper {
7574

75+
@Inject
76+
private TestFileExtensionsRegistry testFileExtensionRegistry;
77+
7678
private static final EClass T_CLASS = TypesPackage.eINSTANCE.getTClass();
7779

7880
/**
@@ -221,7 +223,7 @@ private Stream<URI> collectTestLocations(final IResourceDescriptions index, fina
221223
.stream()
222224
.filter(IN4JSSourceContainer::isTest)
223225
.flatMap(TestDiscoveryHelper::stream) // note: IN4JSSourceContainer is an Iterable<URI>
224-
.filter(uri -> isN4jsFile(uri)) // filter out everything but N4JS files.
226+
.filter(uri -> isTestFile(uri)) // filter out everything but N4JS files.
225227
.filter(uri -> isTestModule(resSet, index.getResourceDescription(uri)));
226228
}
227229

@@ -303,7 +305,10 @@ private TestTree collectTests(final ResourceSet resSet, final IResourceDescripti
303305
if (locations.length > 0) {
304306
final URI uri = locations[0];
305307
name = valueOf(uri.trimFragment()).replaceFirst("platform:/resource/", "");
306-
name = name.replace("." + N4JS_FILE_EXTENSION, "");
308+
// name = name.replace("." + N4JS_FILE_EXTENSION, "");
309+
if (name.lastIndexOf('.') > 0) {
310+
name = name.substring(0, name.lastIndexOf('.'));
311+
}
307312
// Assuming one single test case.
308313
if (uri.hasFragment() && !suites.isEmpty() && !suites.get(0).getTestCases().isEmpty()) {
309314
name = name + "#" + suites.get(0).getTestCases().get(0).getDisplayName();
@@ -412,8 +417,8 @@ private boolean isProject(final URI location) {
412417
}
413418
}
414419

415-
private boolean isN4jsFile(final URI uri) {
416-
return null != uri && nullToEmpty(uri.lastSegment()).endsWith("." + N4JS_FILE_EXTENSION);
420+
private boolean isTestFile(final URI uri) {
421+
return testFileExtensionRegistry.getTestFileExtensions().contains(uri.fileExtension());
417422
}
418423

419424
private boolean isTestModule(final ResourceSet resourceSet, final IResourceDescription module) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/**
2+
* Copyright (c) 2016 NumberFour AG.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v1.0
5+
* which accompanies this distribution, and is available at
6+
* http://www.eclipse.org/legal/epl-v10.html
7+
*
8+
* Contributors:
9+
* NumberFour AG - Initial API and implementation
10+
*/
11+
package eu.numberfour.n4js.tester.extension;
12+
13+
import java.util.ArrayList;
14+
import java.util.Collection;
15+
import java.util.Collections;
16+
17+
import org.apache.log4j.Logger;
18+
import org.eclipse.core.runtime.IConfigurationElement;
19+
import org.eclipse.core.runtime.IExtensionRegistry;
20+
import org.eclipse.core.runtime.RegistryFactory;
21+
22+
import com.google.inject.Singleton;
23+
24+
/**
25+
* This class collect test file extensions from extensions to extension point.
26+
*/
27+
@Singleton
28+
public class TestFileExtensionsRegistry {
29+
private final static Logger log = Logger.getLogger(TesterRegistry.class);
30+
31+
/* The extension point to test file extensions */
32+
private static final String TEST_FILE_EXTENSIONS_POINT_ID = "eu.numberfour.n4js.tester.testFileExtensions";
33+
private static final String ATT_FILE_EXTENSION = "fileExtension";
34+
private boolean isInitialized = false;
35+
private final Collection<String> testFileExtensions = new ArrayList<>();
36+
37+
/**
38+
* Register a test file extension. This method should only be invoked by client code directly in headless mode. When
39+
* running in Eclipse, test file extensions will be registered via the 'testFileExtension' extension point.
40+
*/
41+
public void register(String testFileExtension) {
42+
testFileExtensions.add(testFileExtension);
43+
}
44+
45+
/**
46+
* Return test file extensions
47+
*/
48+
public Collection<String> getTestFileExtensions() {
49+
if (!isInitialized) {
50+
initialize();
51+
}
52+
return Collections.unmodifiableCollection(testFileExtensions);
53+
}
54+
55+
/**
56+
* Read information from extensions defined in plugin.xml files
57+
*/
58+
private void initialize() {
59+
if (isInitialized) {
60+
throw new IllegalStateException("may invoke method initialize() only once");
61+
}
62+
isInitialized = true;
63+
64+
final IExtensionRegistry registry = RegistryFactory.getRegistry();
65+
if (registry != null) {
66+
final IConfigurationElement[] configElems = registry
67+
.getConfigurationElementsFor(TEST_FILE_EXTENSIONS_POINT_ID);
68+
69+
for (IConfigurationElement elem : configElems) {
70+
try {
71+
testFileExtensions.add(elem.getAttribute(ATT_FILE_EXTENSION));
72+
} catch (Exception ex) {
73+
log.error("Error while reading extensions for extension point " + TEST_FILE_EXTENSIONS_POINT_ID,
74+
ex);
75+
}
76+
}
77+
}
78+
}
79+
80+
/**
81+
* Reset the list of test file extensions to empty
82+
*/
83+
public void reset() {
84+
isInitialized = false;
85+
testFileExtensions.clear();
86+
}
87+
}

plugins/eu.numberfour.n4js/src/eu/numberfour/n4js/internal/N4JSRuntimeCore.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,11 @@ private void createAllResourcesWorkspace(ResourceSet resourceSet) {
143143
}
144144
}
145145

146-
private boolean isN4File(final URI uri) {
146+
/**
147+
* Return true if the URI is a recognized N4 file. Sub-languages should override this method to provide additional
148+
* file extensions!
149+
*/
150+
protected boolean isN4File(final URI uri) {
147151
final String ext = uri != null ? uri.fileExtension() : null;
148152
return N4JSGlobals.ALL_N4_FILE_EXTENSIONS.contains(ext);
149153
}

plugins/eu.numberfour.n4jsx.xpect.ui/plugin.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,5 +106,13 @@ Contributors:
106106
fileExtension="n4jsx">
107107
</testSuite>
108108
</extension>
109+
110+
<!-- Register .n4jsx file extension as test file extension -->
111+
<extension
112+
point="eu.numberfour.n4js.tester.testFileExtensions">
113+
<testFileExtension
114+
fileExtension="n4jsx">
115+
</testFileExtension>
116+
</extension>
109117

110118
</plugin>

plugins/eu.numberfour.n4jsx/src/eu/numberfour/n4jsx/N4JSXGlobals.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@
1010
*/
1111
package eu.numberfour.n4jsx;
1212

13+
import static com.google.common.collect.Sets.newLinkedHashSet;
14+
import static java.util.Arrays.asList;
15+
import static java.util.Collections.unmodifiableCollection;
16+
17+
import java.util.Collection;
18+
1319
/**
1420
* Globals for N4JSX sub-language
1521
*/
@@ -25,6 +31,13 @@ public final class N4JSXGlobals {
2531
*/
2632
public static final String N4JSX_FILE_EXTENSION = "n4jsx";
2733

34+
/**
35+
* Unmodifiable list containing {@link #N4JSX_FILE_EXTENSION} and {@link #JSX_FILE_EXTENSION}.
36+
*/
37+
public static final Collection<String> ALL_JSX_FILE_EXTENSIONS = unmodifiableCollection(newLinkedHashSet(asList(
38+
N4JSX_FILE_EXTENSION,
39+
JSX_FILE_EXTENSION)));
40+
2841
private N4JSXGlobals() {
2942
// private to prevent inheritance & instantiation.
3043
}

plugins/eu.numberfour.n4jsx/src/eu/numberfour/n4jsx/internal/N4JSXRuntimeCore.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import eu.numberfour.n4js.internal.FileBasedWorkspace;
1919
import eu.numberfour.n4js.internal.N4JSModel;
2020
import eu.numberfour.n4js.internal.N4JSRuntimeCore;
21+
import eu.numberfour.n4jsx.N4JSXGlobals;
2122
import eu.numberfour.n4jsx.validation.N4JSXResourceType;
2223

2324
/**
@@ -51,4 +52,14 @@ protected boolean isJsFile(URI uri) {
5152
}
5253
return super.isJsFile(uri);
5354
}
55+
56+
/**
57+
* Return true if the URI is a recognized N4 file. Provide .n4jsx and .jsx recognized file extensions file
58+
* extensions!
59+
*/
60+
@Override
61+
protected boolean isN4File(final URI uri) {
62+
final String ext = uri != null ? uri.fileExtension() : null;
63+
return N4JSXGlobals.ALL_JSX_FILE_EXTENSIONS.contains(ext) || super.isN4File(uri);
64+
}
5465
}

tests/eu.numberfour.n4js.tester.tests/META-INF/MANIFEST.MF

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8
99
Require-Bundle: eu.numberfour.n4js.tester.tests.helper,
1010
com.google.guava,
1111
org.eclipse.xtend.lib,
12-
org.junit
12+
org.junit,
13+
eu.numberfour.n4jsx
1314
Import-Package: org.apache.log4j.varia;version="1.2.15"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
ProjectId: test.discovery.example.project.n4jsx
2+
VendorId: eu.numberfour
3+
VendorName: "NumberFour AG"
4+
ProjectType: library
5+
ProjectVersion: 0.0.1-SNAPSHOT
6+
Output: "src-gen"
7+
Sources {
8+
test {
9+
"src"
10+
}
11+
}

0 commit comments

Comments
 (0)