This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git

commit 1c05980f3d73efa1829b00f54b87eae520e65097
Author: Gary Gregory <[email protected]>
AuthorDate: Fri Dec 19 18:49:01 2025 -0500

    Make test Java15BugFastDateParserTest more lenient on Java 26-ea
---
 .../java/org/apache/commons/lang3/SystemUtils.java |  2 +-
 .../org/apache/commons/lang3/LocaleProblems.java   | 75 ++++++++++++++++++++++
 .../commons/lang3/time/FastDateParserTest.java     | 11 ++--
 .../lang3/time/Java15BugFastDateParserTest.java    | 23 ++++---
 4 files changed, 98 insertions(+), 13 deletions(-)

diff --git a/src/main/java/org/apache/commons/lang3/SystemUtils.java 
b/src/main/java/org/apache/commons/lang3/SystemUtils.java
index 074384145..519a5560a 100644
--- a/src/main/java/org/apache/commons/lang3/SystemUtils.java
+++ b/src/main/java/org/apache/commons/lang3/SystemUtils.java
@@ -383,7 +383,7 @@ public class SystemUtils {
     /**
      * A constant for the Java version, may be null.
      */
-    private static final JavaVersion JAVA_SPECIFICATION_VERSION_ENUM = 
JavaVersion.get(JAVA_SPECIFICATION_VERSION);
+    static final JavaVersion JAVA_SPECIFICATION_VERSION_ENUM = 
JavaVersion.get(JAVA_SPECIFICATION_VERSION);
 
     /**
      * A constant for the System Property {@code 
java.util.prefs.PreferencesFactory}. A class name.
diff --git a/src/test/java/org/apache/commons/lang3/LocaleProblems.java 
b/src/test/java/org/apache/commons/lang3/LocaleProblems.java
new file mode 100644
index 000000000..1c73211f5
--- /dev/null
+++ b/src/test/java/org/apache/commons/lang3/LocaleProblems.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.lang3;
+
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
+
+import java.text.ParseException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * Offers tests a way to skip problematic Locales with a JUnit assumption.
+ */
+public class LocaleProblems {
+
+    // needs a better name.
+    private static final Map<JavaVersion, List<String>> UNSUPPORTED_CAT_A;
+    static {
+        UNSUPPORTED_CAT_A = new HashMap<>();
+        // "cv_RU" is a problem on Java version: 26-beta, vendor: Eclipse 
Adoptium, runtime: 
/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/26.0.0-ea.27.0.ea/x64
+        // Same for "cv"
+        UNSUPPORTED_CAT_A.put(JavaVersion.JAVA_26, Arrays.asList("cv", 
"cv_RU"));
+    }
+
+    // needs a better name.
+    private static final Map<JavaVersion, List<String>> UNSUPPORTED_CAT_B;
+    static {
+        UNSUPPORTED_CAT_B = new HashMap<>();
+        // "cv_RU_#Cyrl" is a problem on Java version: 26-beta, vendor: 
Eclipse Adoptium, runtime: 
/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/26.0.0-ea.27.0.ea/x64
+        UNSUPPORTED_CAT_B.put(JavaVersion.JAVA_26, Arrays.asList("cv", 
"cv_RU", "cv_RU_#Cyrl"));
+    }
+
+    private static void assumeLocaleSupported(final Locale locale, final 
Map<JavaVersion, List<String>> unsupportedCatA, final ParseException e) {
+        final boolean supported = isSupported(locale, unsupportedCatA);
+        if (!supported) {
+            System.out.printf("Failing test assumption for locale '%s' on Java 
version %s.%n", locale, SystemUtils.JAVA_SPECIFICATION_VERSION_ENUM);
+            if (e != null) {
+                // Not the whole stack trace, just the exception message.
+                System.out.printf("\t%s%n", e);
+            }
+        }
+        assumeTrue(supported);
+    }
+
+    public static void assumeLocaleSupportedA(final Locale locale) {
+        assumeLocaleSupported(locale, UNSUPPORTED_CAT_A, null);
+    }
+
+    public static void assumeLocaleSupportedB(final Locale locale, final 
ParseException e) {
+        assumeLocaleSupported(locale, UNSUPPORTED_CAT_B, e);
+    }
+
+    private static boolean isSupported(final Locale locale, final 
Map<JavaVersion, List<String>> unsupported) {
+        final List<String> list = 
unsupported.get(SystemUtils.JAVA_SPECIFICATION_VERSION_ENUM);
+        return list == null || !list.contains(locale.toString());
+    }
+}
diff --git 
a/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java 
b/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java
index 3c6ecf011..c8b9099a2 100644
--- a/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java
+++ b/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java
@@ -39,6 +39,7 @@
 import java.util.stream.Stream;
 
 import org.apache.commons.lang3.AbstractLangTest;
+import org.apache.commons.lang3.LocaleProblems;
 import org.apache.commons.lang3.LocaleUtils;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.SystemUtils;
@@ -55,6 +56,7 @@
 import org.junitpioneer.jupiter.ReadsDefaultTimeZone;
 import org.junitpioneer.jupiter.cartesian.ArgumentSets;
 import org.junitpioneer.jupiter.cartesian.CartesianTest;
+import org.opentest4j.AssertionFailedError;
 
 /**
  * Tests {@link org.apache.commons.lang3.time.FastDateParser}.
@@ -724,7 +726,7 @@ void testTzParses(final Locale locale) throws Exception {
     }
 
     private void validateSdfFormatFdpParseEquality(final String formatStr, 
final Locale locale, final TimeZone timeZone,
-        final FastDateParser dateParser, final Date inDate, final int year, 
final Date csDate) throws ParseException {
+        final FastDateParser fastDateParser, final Date inDate, final int 
year, final Date csDate) throws ParseException {
         final SimpleDateFormat sdf = new SimpleDateFormat(formatStr, locale);
         sdf.setTimeZone(timeZone);
         if (formatStr.equals(SHORT_FORMAT)) {
@@ -734,13 +736,14 @@ private void validateSdfFormatFdpParseEquality(final 
String formatStr, final Loc
 //        System.out.printf("[Java %s] Date: '%s' formatted with '%s' -> 
'%s'%n", SystemUtils.JAVA_RUNTIME_VERSION, inDate,
 //            formatStr, fmt);
         try {
-            final Date out = dateParser.parse(fmt);
+            final Date out = fastDateParser.parse(fmt);
             assertEquals(inDate, out, "format: '" + formatStr + "', locale: '" 
+ locale + "', time zone: '"
                 + timeZone.getID() + "', year: " + year + ", parse: '" + fmt);
-        } catch (final ParseException pe) {
+        } catch (final ParseException e) {
+            LocaleProblems.assumeLocaleSupportedB(locale, e);
             if (year >= 1868 || !locale.getCountry().equals("JP")) {
                 // LANG-978
-                throw pe;
+                throw new AssertionFailedError("locale " + locale, e);
             }
         }
     }
diff --git 
a/src/test/java/org/apache/commons/lang3/time/Java15BugFastDateParserTest.java 
b/src/test/java/org/apache/commons/lang3/time/Java15BugFastDateParserTest.java
index ce4986d54..f89860be2 100644
--- 
a/src/test/java/org/apache/commons/lang3/time/Java15BugFastDateParserTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/time/Java15BugFastDateParserTest.java
@@ -25,6 +25,7 @@
 import java.util.TimeZone;
 
 import org.apache.commons.lang3.AbstractLangTest;
+import org.apache.commons.lang3.LocaleProblems;
 import org.apache.commons.lang3.LocaleUtils;
 import org.apache.commons.lang3.function.TriFunction;
 import org.junit.jupiter.api.Test;
@@ -65,6 +66,19 @@ void testJava15BuggyLocaleTestAll(final Locale locale) 
throws ParseException {
         testSingleLocale(locale);
     }
 
+    private void testLocale(final TriFunction<String, TimeZone, Locale, 
DateParser> dbProvider, final String format, final boolean eraBC, final 
Calendar cal,
+            final Locale locale) {
+        LocaleProblems.assumeLocaleSupportedA(locale);
+        // ja_JP_JP cannot handle dates before 1868 properly
+        if (eraBC && locale.equals(FastDateParser.JAPANESE_IMPERIAL)) {
+            return;
+        }
+        final SimpleDateFormat sdf = new SimpleDateFormat(format, locale);
+        final DateParser fdf = dbProvider.apply(format, TimeZone.getDefault(), 
locale);
+        // If parsing fails, a ParseException will be thrown and the test will 
fail
+        FastDateParserTest.checkParse(locale, cal, sdf, fdf);
+    }
+
     private void testLocales(final TriFunction<String, TimeZone, Locale, 
DateParser> dbProvider, final String format,
             final boolean eraBC) throws Exception {
         final Calendar cal = Calendar.getInstance(TimeZones.GMT);
@@ -74,14 +88,7 @@ private void testLocales(final TriFunction<String, TimeZone, 
Locale, DateParser>
             cal.set(Calendar.ERA, GregorianCalendar.BC);
         }
         for (final Locale locale : LocaleUtils.availableLocaleList()) {
-            // ja_JP_JP cannot handle dates before 1868 properly
-            if (eraBC && locale.equals(FastDateParser.JAPANESE_IMPERIAL)) {
-                continue;
-            }
-            final SimpleDateFormat sdf = new SimpleDateFormat(format, locale);
-            final DateParser fdf = dbProvider.apply(format, 
TimeZone.getDefault(), locale);
-            // If parsing fails, a ParseException will be thrown and the test 
will fail
-            FastDateParserTest.checkParse(locale, cal, sdf, fdf);
+            testLocale(dbProvider, format, eraBC, cal, locale);
         }
     }
 

Reply via email to