Index: /trunk/test/unit/org/openstreetmap/josm/data/projection/ProjectionRefTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/projection/ProjectionRefTest.java	(revision 18026)
+++ /trunk/test/unit/org/openstreetmap/josm/data/projection/ProjectionRefTest.java	(revision 18027)
@@ -19,4 +19,5 @@
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -29,11 +30,11 @@
 import java.util.TreeMap;
 import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.junit.Assert;
+import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
@@ -43,4 +44,6 @@
 import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.PlatformManager;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
@@ -374,10 +377,14 @@
     @Test
     void testProjections() throws IOException {
-        StringBuilder fail = new StringBuilder();
-        Map<String, Set<String>> failingProjs = new HashMap<>();
+        Set<String> failures = Collections.synchronizedSet(new TreeSet<>());
+        Map<String, Set<String>> failingProjs = new ConcurrentHashMap<>();
         Set<String> allCodes = new HashSet<>(Projections.getAllProjectionCodes());
         Collection<RefEntry> refs = readData();
-
-        for (RefEntry ref : refs) {
+        refs.stream().map(ref -> ref.code).forEach(allCodes::remove);
+        if (!allCodes.isEmpty()) {
+            Assert.fail("no reference data for following projections: "+allCodes);
+        }
+
+        refs.parallelStream().forEach(ref -> {
             String def0 = Projections.getInit(ref.code);
             if (def0 == null) {
@@ -385,5 +392,5 @@
             }
             if (!ref.def.equals(def0)) {
-                fail.append("definitions for ").append(ref.code).append(" do not match\n");
+                failures.add("definitions for ".concat(ref.code).concat(" do not match\n"));
             } else {
                 CustomProjection proj = (CustomProjection) Projections.getProjectionByCode(ref.code);
@@ -405,16 +412,12 @@
                                 "        but got:  eastnorth(%s,%s)!%n",
                                 proj.toString(), proj.toCode(), ll.lat(), ll.lon(), enRef.east(), enRef.north(), en.east(), en.north());
-                        fail.append(errorEN);
+                        failures.add(errorEN);
                         failingProjs.computeIfAbsent(proj.proj.getProj4Id(), x -> new TreeSet<>()).add(ref.code);
                     }
                 }
             }
-            allCodes.remove(ref.code);
-        }
-        if (!allCodes.isEmpty()) {
-            Assert.fail("no reference data for following projections: "+allCodes);
-        }
-        if (fail.length() > 0) {
-            System.err.println(fail.toString());
+        });
+        if (!failures.isEmpty()) {
+            System.err.println(failures.toString());
             throw new AssertionError("Failing:\n" +
                     failingProjs.keySet().size() + " projections: " + failingProjs.keySet() + "\n" +
