Skip to content

Commit e59b227

Browse files
committed
Consider *.java source files as classes in source mode
1 parent 2fdb122 commit e59b227

File tree

3 files changed

+41
-27
lines changed

3 files changed

+41
-27
lines changed

junit-platform-commons/src/main/java/org/junit/platform/commons/util/ClasspathFilters.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,21 @@
1919
class ClasspathFilters {
2020

2121
static final String CLASS_FILE_SUFFIX = ".class";
22+
static final String SOURCE_FILE_SUFFIX = ".java";
23+
24+
// System property defined since Java 12: https://bugs.java/bugdatabase/JDK-8210877
25+
private static final boolean SOURCE_MODE = System.getProperty("jdk.launcher.sourcefile") != null;
26+
2227
private static final String PACKAGE_INFO_FILE_NAME = "package-info" + CLASS_FILE_SUFFIX;
2328
private static final String MODULE_INFO_FILE_NAME = "module-info" + CLASS_FILE_SUFFIX;
2429

30+
static boolean isClassOrSourceFileName(String name) {
31+
return name.endsWith(CLASS_FILE_SUFFIX) || (SOURCE_MODE && name.endsWith(SOURCE_FILE_SUFFIX));
32+
}
33+
2534
static Predicate<Path> classFiles() {
26-
return file -> isNotPackageInfo(file) && isNotModuleInfo(file) && isClassFile(file);
35+
return file -> isNotPackageInfo(file) && isNotModuleInfo(file)
36+
&& (isClassFile(file) || (SOURCE_MODE && isSourceFile(file)));
2737
}
2838

2939
static Predicate<Path> resourceFiles() {
@@ -42,6 +52,10 @@ private static boolean isClassFile(Path file) {
4252
return file.getFileName().toString().endsWith(CLASS_FILE_SUFFIX);
4353
}
4454

55+
private static boolean isSourceFile(Path file) {
56+
return file.getFileName().toString().endsWith(SOURCE_FILE_SUFFIX);
57+
}
58+
4559
private ClasspathFilters() {
4660
}
4761

junit-platform-commons/src/main/java/org/junit/platform/commons/util/DefaultClasspathScanner.java

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
package org.junit.platform.commons.util;
1212

1313
import static java.util.stream.Collectors.joining;
14-
import static org.junit.platform.commons.util.ClasspathFilters.CLASS_FILE_SUFFIX;
1514
import static org.junit.platform.commons.util.StringUtils.isNotBlank;
1615

1716
import java.io.IOException;
@@ -32,6 +31,7 @@
3231
import java.util.function.Supplier;
3332
import java.util.stream.Stream;
3433

34+
import org.junit.platform.commons.JUnitException;
3535
import org.junit.platform.commons.PreconditionViolationException;
3636
import org.junit.platform.commons.function.Try;
3737
import org.junit.platform.commons.io.Resource;
@@ -182,10 +182,10 @@ private static void walkFilesForUri(URI baseUri, Predicate<Path> filter, BiConsu
182182
}
183183
}
184184

185-
private void processClassFileSafely(Path baseDir, String basePackageName, ClassFilter classFilter, Path classFile,
185+
private void processClassFileSafely(Path baseDir, String basePackageName, ClassFilter classFilter, Path file,
186186
Consumer<Class<?>> classConsumer) {
187187
try {
188-
String fullyQualifiedClassName = determineFullyQualifiedClassName(baseDir, basePackageName, classFile);
188+
String fullyQualifiedClassName = determineFullyQualifiedClassName(baseDir, basePackageName, file);
189189
if (classFilter.match(fullyQualifiedClassName)) {
190190
try {
191191
// @formatter:off
@@ -196,12 +196,12 @@ private void processClassFileSafely(Path baseDir, String basePackageName, ClassF
196196
// @formatter:on
197197
}
198198
catch (InternalError internalError) {
199-
handleInternalError(classFile, fullyQualifiedClassName, internalError);
199+
handleInternalError(file, fullyQualifiedClassName, internalError);
200200
}
201201
}
202202
}
203203
catch (Throwable throwable) {
204-
handleThrowable(classFile, throwable);
204+
handleThrowable(file, throwable);
205205
}
206206
}
207207

@@ -221,12 +221,12 @@ private void processResourceFileSafely(Path baseDir, String basePackageName, Res
221221
}
222222
}
223223

224-
private String determineFullyQualifiedClassName(Path baseDir, String basePackageName, Path classFile) {
224+
private String determineFullyQualifiedClassName(Path baseDir, String basePackageName, Path file) {
225225
// @formatter:off
226226
return Stream.of(
227227
basePackageName,
228-
determineSubpackageName(baseDir, classFile),
229-
determineSimpleClassName(classFile)
228+
determineSubpackageName(baseDir, file),
229+
determineSimpleClassName(file)
230230
)
231231
.filter(value -> !value.isEmpty()) // Handle default package appropriately.
232232
.collect(joining(PACKAGE_SEPARATOR_STRING));
@@ -253,21 +253,29 @@ private String determineFullyQualifiedResourceName(Path baseDir, String basePack
253253
// @formatter:on
254254
}
255255

256-
private String determineSimpleClassName(Path classFile) {
257-
String fileName = classFile.getFileName().toString();
258-
return fileName.substring(0, fileName.length() - CLASS_FILE_SUFFIX.length());
256+
private String determineSimpleClassName(Path file) {
257+
String fileName = file.getFileName().toString();
258+
return determineSimpleClassName(fileName);
259+
}
260+
261+
static String determineSimpleClassName(String fileName) {
262+
int lastDot = fileName.lastIndexOf('.');
263+
if (lastDot < 0) {
264+
throw new JUnitException("Expected file name with file extension, but got: " + fileName);
265+
}
266+
return fileName.substring(0, lastDot);
259267
}
260268

261269
private String determineSimpleResourceName(Path resourceFile) {
262270
return resourceFile.getFileName().toString();
263271
}
264272

265-
private String determineSubpackageName(Path baseDir, Path classFile) {
266-
Path relativePath = baseDir.relativize(classFile.getParent());
273+
private String determineSubpackageName(Path baseDir, Path file) {
274+
Path relativePath = baseDir.relativize(file.getParent());
267275
String pathSeparator = baseDir.getFileSystem().getSeparator();
268276
String subpackageName = relativePath.toString().replace(pathSeparator, PACKAGE_SEPARATOR_STRING);
269277
if (subpackageName.endsWith(pathSeparator)) {
270-
// Workaround for JDK bug: https://bugs.openjdk.java.net/browse/JDK-8153248
278+
// TODO: Remove workaround for JDK bug: https://bugs.openjdk.org/browse/JDK-8153248
271279
subpackageName = subpackageName.substring(0, subpackageName.length() - pathSeparator.length());
272280
}
273281
return subpackageName;

junit-platform-commons/src/main/java/org/junit/platform/commons/util/ModuleUtils.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,10 @@ List<Class<?>> scan(ModuleReference reference) {
253253
try (ModuleReader reader = reference.open()) {
254254
try (Stream<String> names = reader.list()) {
255255
// @formatter:off
256-
return names.filter(name -> name.endsWith(".class"))
257-
.map(this::className)
258-
.filter(name -> !"module-info".equals(name))
256+
return names.filter(ClasspathFilters::isClassOrSourceFileName)
257+
.map(DefaultClasspathScanner::determineSimpleClassName)
258+
.map(name -> name.replace('/', '.'))
259+
.filter(name -> !"package-info".equals(name))
259260
.filter(classFilter::match)
260261
.<Class<?>> map(this::loadClassUnchecked)
261262
.filter(classFilter::match)
@@ -268,15 +269,6 @@ List<Class<?>> scan(ModuleReference reference) {
268269
}
269270
}
270271

271-
/**
272-
* Convert resource name to binary class name.
273-
*/
274-
private String className(String resourceName) {
275-
resourceName = resourceName.substring(0, resourceName.length() - 6); // 6 = ".class".length()
276-
resourceName = resourceName.replace('/', '.');
277-
return resourceName;
278-
}
279-
280272
/**
281273
* Load class by its binary name.
282274
*

0 commit comments

Comments
 (0)