While looking into something else, I got down a rabbit hole of modernizing the file handling in TestTestUnicodeInvariants.testAdditionComparisons().
- File.listFiles() and other APIs point to Files.newDirectoryStream() as a modern replacement
- Path is new/better(?) for dealing with paths
- get the one rmgIssueFilter file ahead of the loop instead of listing all files and ignoring most of them
I didn't have time to get to my main goal, and while this code should be "better" I wasn't sure it's worth the change. And I have to work on something else.
So I am parking this here for now. @eggrobin WDYT?
@Test
void testAdditionComparisons() throws IOException {
// Ideally, this would be a @ParameterizedTest, and we would use the Dtest parameter of the
// mvn command line to filter a specific test.
// Unfortunately, this does not appear to be possible with JUnit 5 and Surefire, see
// https://stackoverflow.com/questions/69198795/junit5-running-a-single-instance-of-parameterized-test,
// so we have one big test and we filter by hand.
final var dir = Path.of(getClass().getResource("AdditionComparisons").getPath());
List<File> files;
final String rmgIssueFilter = CldrUtility.getProperty("RMG_ISSUE", null);
if (rmgIssueFilter == null) {
try (var contents = Files.newDirectoryStream(dir)) {
files =
StreamSupport.stream(contents.spliterator(), false)
.filter(p -> p.toString().endsWith(".txt"))
.map(Path::toFile)
.toList();
}
} else {
File rmgFile = dir.resolve(rmgIssueFilter + ".txt").toFile();
assertTrue(rmgFile.exists(), "Could not find test " + rmgIssueFilter + ".txt");
files = List.of(rmgFile);
}
int rc = 0;
for (var file : files) {
final String filename = file.getName();
final String nameWithoutExtension = filename.substring(0, filename.length() - 4);
final int errors =
TestUnicodeInvariants.testInvariants(
"AdditionComparisons/" + filename,
"addition-comparisons-" + nameWithoutExtension,
true);
if (errors != 0) {
System.err.println(errors + " errors in " + filename);
}
rc += errors;
}
assertEquals(0, rc, "TestUnicodeInvariants.testInvariants(addition-comparisons) failed");
}
diff --git a/unicodetools/src/test/java/org/unicode/text/UCD/TestTestUnicodeInvariants.java b/unicodetools/src/test/java/org/unicode/text/UCD/TestTestUnicodeInvariants.java
index 093f806c..69df9238 100644
--- a/unicodetools/src/test/java/org/unicode/text/UCD/TestTestUnicodeInvariants.java
+++ b/unicodetools/src/test/java/org/unicode/text/UCD/TestTestUnicodeInvariants.java
@@ -8,8 +8,12 @@
import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.text.ParseException;
import java.text.ParsePosition;
+import java.util.List;
+import java.util.stream.StreamSupport;
import org.junit.jupiter.api.Test;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.text.UCD.TestUnicodeInvariants.BackwardParseException;
@@ -42,31 +46,31 @@ void testUnicodeInvariants() throws IOException {
@Test
void testAdditionComparisons() throws IOException {
- final var directory = new File(getClass().getResource("AdditionComparisons").getPath());
- if (!directory.exists()) {
- throw new IOException(directory.getAbsolutePath() + " does not exist");
- }
- int rc = 0;
// Ideally, this would be a @ParameterizedTest, and we would use the Dtest parameter of the
// mvn command line to filter a specific test.
// Unfortunately, this does not appear to be possible with JUnit 5 and Surefire, see
// https://stackoverflow.com/questions/69198795/junit5-running-a-single-instance-of-parameterized-test,
// so we have one big test and we filter by hand.
+ final var dir = Path.of(getClass().getResource("AdditionComparisons").getPath());
+ List<File> files;
final String rmgIssueFilter = CldrUtility.getProperty("RMG_ISSUE", null);
- boolean matchedFilter = false;
- for (var file : directory.listFiles()) {
- final String filename = file.getName();
- if (!file.getName().endsWith(".txt")) {
- continue;
+ if (rmgIssueFilter == null) {
+ try (var contents = Files.newDirectoryStream(dir)) {
+ files =
+ StreamSupport.stream(contents.spliterator(), false)
+ .filter(p -> p.toString().endsWith(".txt"))
+ .map(Path::toFile)
+ .toList();
}
+ } else {
+ File rmgFile = dir.resolve(rmgIssueFilter + ".txt").toFile();
+ assertTrue(rmgFile.exists(), "Could not find test " + rmgIssueFilter + ".txt");
+ files = List.of(rmgFile);
+ }
+ int rc = 0;
+ for (var file : files) {
+ final String filename = file.getName();
final String nameWithoutExtension = filename.substring(0, filename.length() - 4);
- if (rmgIssueFilter != null) {
- if (nameWithoutExtension.equals(rmgIssueFilter)) {
- matchedFilter = true;
- } else {
- continue;
- }
- }
final int errors =
TestUnicodeInvariants.testInvariants(
"AdditionComparisons/" + filename,
@@ -77,9 +81,6 @@ void testAdditionComparisons() throws IOException {
}
rc += errors;
}
- if (rmgIssueFilter != null) {
- assertTrue(matchedFilter, "Could not find test " + rmgIssueFilter + ".txt");
- }
assertEquals(0, rc, "TestUnicodeInvariants.testInvariants(addition-comparisons) failed");
}
While looking into something else, I got down a rabbit hole of modernizing the file handling in TestTestUnicodeInvariants.testAdditionComparisons().
I didn't have time to get to my main goal, and while this code should be "better" I wasn't sure it's worth the change. And I have to work on something else.
So I am parking this here for now. @eggrobin WDYT?