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

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


The following commit(s) were added to refs/heads/master by this push:
     new 78a9ebca Locale-dependent tests: calculate expected results as output 
varies between JVMs
78a9ebca is described below

commit 78a9ebca83a66620fb71a921b48f9068e398d760
Author: Sebb <[email protected]>
AuthorDate: Sat Dec 21 17:51:02 2024 +0000

    Locale-dependent tests: calculate expected results as output varies between 
JVMs
---
 pom.xml                                            | 35 +---------
 src/changes/changes.xml                            |  1 +
 .../validator/routines/CalendarValidatorTest.java  | 76 +++++++++++++++++----
 .../validator/routines/CurrencyValidatorTest.java  | 79 ++++++++++++++++------
 .../validator/routines/DateValidatorTest.java      | 26 ++-----
 .../validator/routines/TimeValidatorTest.java      | 39 ++++++++---
 6 files changed, 157 insertions(+), 99 deletions(-)

diff --git a/pom.xml b/pom.xml
index 88e5a001..700b0e60 100644
--- a/pom.xml
+++ b/pom.xml
@@ -64,7 +64,7 @@
     <commons.jacoco.instructionRatio>0.87</commons.jacoco.instructionRatio>
     <commons.jacoco.methodRatio>0.81</commons.jacoco.methodRatio>
     <commons.jacoco.branchRatio>0.74</commons.jacoco.branchRatio>
-    <commons.jacoco.lineRatio>0.78</commons.jacoco.lineRatio>    
+    <commons.jacoco.lineRatio>0.78</commons.jacoco.lineRatio>
     <commons.jacoco.complexityRatio>0.71</commons.jacoco.complexityRatio>
   </properties>
 
@@ -316,37 +316,6 @@
         </plugins>
       </build>
     </profile>
-    <profile>
-      <id>jdk9-cldr</id>
-      <activation>
-        <jdk>[1.9,)</jdk>
-      </activation>
-      <!--
-       Temporary fix to allow tests to work under Java 9+, which changed to 
use CLDR names.
-       This causes several Date/Time tests to fail, as some language strings 
have changed.
-       e.g. German now uses "Dez." rather than "Dez" for the short version of 
"December"
-       (see: TimeValidatorTest#testTimeZone)
-       Is the test data wrong, or should the code still be able to parse "Dez"?
-      -->
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-surefire-plugin</artifactId>
-            <configuration>
-              <!--
-                systemPropertyVariables are set too late in Surefire
-                versions after 2.21.0 and before 3.0-M4 (but only on Windows!)
-                Use the command-line instead to ensure the property is set 
early enough
-                
-                Use ${argLine} to get JaCoCo to work properly.
-              -->
-              <argLine>${argLine} -Djava.locale.providers=COMPAT,SPI</argLine>
-            </configuration>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
   </profiles>
 
   <developers>
@@ -426,7 +395,7 @@
       <email>ggregory at apache.org</email>
       <url>https://www.garygregory.com</url>
       <organization>The Apache Software Foundation</organization>
-      <organizationUrl>https://www.apache.org/</organizationUrl>      
+      <organizationUrl>https://www.apache.org/</organizationUrl>
       <roles>
         <role>PMC Member</role>
       </roles>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index c2b05205..e327602f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -64,6 +64,7 @@ The <action> type attribute can be add,update,fix,remove.
   <body>
   <release version="1.10.0" date="YYYY-MM-DD" description="This is a 
maintenance and bug fix release; requires Java 8.">
     <!-- FIX -->
+    <action type="fix" dev="sebb">Locale-dependent tests: calculate expected 
results as output varies between JVMs</action>
     <action type="fix" dev="sebb">Locale default tests: ensure original is 
restored on failure</action>
     <action type="fix" dev="ggregory" due-to="Johannes Weberhofer">Fix order 
of actual and expected parameters in assertEquals() #246.</action>
     <action type="fix" dev="ggregory" due-to="Johannes 
Weberhofer">InetAddressValidator does not need its instance variable, so uses a 
touch less memory.</action>
diff --git 
a/src/test/java/org/apache/commons/validator/routines/CalendarValidatorTest.java
 
b/src/test/java/org/apache/commons/validator/routines/CalendarValidatorTest.java
index 44a21e0f..3bc3a76a 100644
--- 
a/src/test/java/org/apache/commons/validator/routines/CalendarValidatorTest.java
+++ 
b/src/test/java/org/apache/commons/validator/routines/CalendarValidatorTest.java
@@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.text.DateFormat;
 import java.text.Format;
+import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Locale;
@@ -115,8 +116,12 @@ public class CalendarValidatorTest extends 
AbstractCalendarValidatorTest {
         final Locale locale = Locale.GERMAN;
         final String pattern = "yyyy-MM-dd";
         final String patternVal = "2005-12-31";
-        final String germanVal = "31 Dez 2005";
         final String germanPattern = "dd MMM yyyy";
+        // Don't rely on specific German format - it varies between JVMs
+        DateFormat df = new SimpleDateFormat(germanPattern, locale);
+        Calendar cal = Calendar.getInstance(Locale.US);
+        cal.set(2005, 11, 31); // month is 0-based
+        final String germanVal = df.format(cal.getTime());
         final String localeVal = "31.12.2005";
         final String defaultVal = "12/31/05";
         final String xxxx = "XXXX";
@@ -228,7 +233,7 @@ public class CalendarValidatorTest extends 
AbstractCalendarValidatorTest {
 
         // invalid compare
         final Exception e = assertThrows(IllegalArgumentException.class, () -> 
calValidator.compare(value, value, -1), "Invalid Compare field");
-        assertEquals(e.getMessage(), "Invalid field: -1", "check message");
+        assertEquals("Invalid field: -1", e.getMessage(), "check message");
     }
 
     /**
@@ -237,6 +242,16 @@ public class CalendarValidatorTest extends 
AbstractCalendarValidatorTest {
     @Test
     public void testDateTimeStyle() {
         Locale.setDefault(Locale.UK);
+        // Formats vary between JVMs, so create the test strings using the 
current JVM
+        final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, 
DateFormat.SHORT);
+        final Calendar cal = Calendar.getInstance();
+        cal.set(2005, 11, 31, 14, 23); // month is 0-based
+        final String val = df.format(cal.getTime());
+
+        final DateFormat usdf = 
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.US);
+        final Calendar uscal = Calendar.getInstance(Locale.US);
+        uscal.set(2005, 11, 31, 14, 23); // month is 0-based
+        final String usval = usdf.format(uscal.getTime());
 
         final AbstractCalendarValidator dateTimeValidator = new 
AbstractCalendarValidator(true, DateFormat.SHORT, DateFormat.SHORT) {
             private static final long serialVersionUID = 1L;
@@ -246,8 +261,8 @@ public class CalendarValidatorTest extends 
AbstractCalendarValidatorTest {
                 return value;
             }
         };
-        assertTrue(dateTimeValidator.isValid("31/12/05 14:23"), "validate(A) 
default");
-        assertTrue(dateTimeValidator.isValid("12/31/05 2:23 PM", Locale.US), 
"validate(A) locale ");
+        assertTrue(dateTimeValidator.isValid(val), "validate(A) default");
+        assertTrue(dateTimeValidator.isValid(usval, Locale.US), "validate(A) 
locale ");
     }
 
     /**
@@ -259,20 +274,51 @@ public class CalendarValidatorTest extends 
AbstractCalendarValidatorTest {
         // Set the default Locale
         Locale.setDefault(Locale.UK);
 
-        final Calendar cal20050101 = createCalendar(GMT, 20051231, 11500);
+        final Calendar cal20051231 = createCalendar(GMT, 20051231, 11500);
+         // validator defaults to SHORT, but the format varies between JVMs
+        final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
+        final String val = df.format(cal20051231.getTime());
+        final DateFormat dfus = DateFormat.getDateInstance(DateFormat.SHORT, 
Locale.US);
+        final String usval = dfus.format(cal20051231.getTime());
+        final String germanPattern = "dd MMM yyyy";
+        final DateFormat dedf = new SimpleDateFormat(germanPattern, 
Locale.GERMAN);
+        final String deval = dedf.format(cal20051231.getTime());
         assertNull(calValidator.format(null), "null");
-        assertEquals("31/12/05", calValidator.format(cal20050101), "default");
-        assertEquals("12/31/05", calValidator.format(cal20050101, Locale.US), 
"locale");
-        assertEquals(calValidator.format(cal20050101, "yyyy-MM-dd HH:mm"), 
"2005-12-31 01:15", "patternA");
-        assertEquals(calValidator.format(cal20050101, "yyyy-MM-dd z"), 
"2005-12-31 GMT", "patternB");
-        assertEquals("31 Dez 2005", calValidator.format(cal20050101, "dd MMM 
yyyy", Locale.GERMAN), "both");
+        assertEquals(val, calValidator.format(cal20051231), "default");
+        assertEquals(usval, calValidator.format(cal20051231, Locale.US), 
"locale");
+        assertEquals(calValidator.format(cal20051231, "yyyy-MM-dd HH:mm"), 
"2005-12-31 01:15", "patternA");
+        assertEquals(calValidator.format(cal20051231, "yyyy-MM-dd z"), 
"2005-12-31 GMT", "patternB");
+        assertEquals(deval, calValidator.format(cal20051231, germanPattern, 
Locale.GERMAN), "both");
 
         // EST Time Zone
-        assertEquals("30/12/05", calValidator.format(cal20050101, EST), "EST 
default");
-        assertEquals("12/30/05", calValidator.format(cal20050101, Locale.US, 
EST), "EST locale");
-        assertEquals(calValidator.format(cal20050101, "yyyy-MM-dd HH:mm", 
EST), "2005-12-30 20:15", "EST patternA");
-        assertEquals(calValidator.format(cal20050101, "yyyy-MM-dd z", EST), 
"2005-12-30 EST", "EST patternB");
-        assertEquals("30 Dez 2005", calValidator.format(cal20050101, "dd MMM 
yyyy", Locale.GERMAN, EST), "EST both");
+        final DateFormat dfest = DateFormat.getDateInstance(DateFormat.SHORT);
+        dfest.setTimeZone(EST);
+        final String valest = dfest.format(cal20051231.getTime());
+
+        final DateFormat dfusest = 
DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
+        dfusest.setTimeZone(EST);
+        final String valusest = dfusest.format(cal20051231.getTime());
+
+        final DateFormat dedfest = new SimpleDateFormat(germanPattern, 
Locale.GERMAN);
+        dedfest.setTimeZone(EST);
+        final String devalest = dedfest.format(cal20051231.getTime());
+
+        assertEquals(valest, calValidator.format(cal20051231, EST), "EST 
default");
+        assertEquals(valusest, calValidator.format(cal20051231, Locale.US, 
EST), "EST locale");
+
+        final String patternA = "yyyy-MM-dd HH:mm";
+        final DateFormat dfA = new SimpleDateFormat(patternA);
+        dfA.setTimeZone(EST);
+        final String valA = dfA.format(cal20051231.getTime());
+        assertEquals(valA, calValidator.format(cal20051231, patternA, EST), 
"EST patternA");
+
+        final String patternB = "yyyy-MM-dd z";
+        final DateFormat dfB = new SimpleDateFormat(patternB);
+        dfB.setTimeZone(EST);
+        final String valB = dfB.format(cal20051231.getTime());
+
+        assertEquals(valB, calValidator.format(cal20051231, patternB, EST), 
"EST patternB");
+        assertEquals(devalest, calValidator.format(cal20051231, germanPattern, 
Locale.GERMAN, EST), "EST both");
     }
 
 }
diff --git 
a/src/test/java/org/apache/commons/validator/routines/CurrencyValidatorTest.java
 
b/src/test/java/org/apache/commons/validator/routines/CurrencyValidatorTest.java
index 509601d8..20d491fe 100644
--- 
a/src/test/java/org/apache/commons/validator/routines/CurrencyValidatorTest.java
+++ 
b/src/test/java/org/apache/commons/validator/routines/CurrencyValidatorTest.java
@@ -18,10 +18,12 @@ package org.apache.commons.validator.routines;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
 import java.math.BigDecimal;
 import java.text.DecimalFormatSymbols;
+import java.text.NumberFormat;
 import java.util.Locale;
 
 import org.junit.jupiter.api.AfterEach;
@@ -88,14 +90,19 @@ public class CurrencyValidatorTest {
         final CurrencyValidator validator = new CurrencyValidator();
         final BigDecimal expected = new BigDecimal("1234.00");
         final BigDecimal negative = new BigDecimal("-1234.00");
+        // Generate the exected strings, as these vary between JVMs
+        final String ukPlus = 
NumberFormat.getCurrencyInstance(Locale.UK).format(1234);
+        final String ukMinus = 
NumberFormat.getCurrencyInstance(Locale.UK).format(-1234);
+        final String usPlus = 
NumberFormat.getCurrencyInstance(Locale.US).format(1234);
+        final String usMinus = 
NumberFormat.getCurrencyInstance(Locale.US).format(-1234);
 
-        assertEquals(expected, validator.validate(ukPound + "1,234"), "Default 
locale");
+        assertEquals(expected, validator.validate(ukPlus), "Default locale");
 
-        assertEquals(expected, validator.validate(ukPound + "1,234", 
Locale.UK), "UK locale");
-        assertEquals(negative, validator.validate("-" + ukPound + "1,234", 
Locale.UK), "UK negative");
+        assertEquals(expected, validator.validate(ukPlus, Locale.UK), "UK 
locale");
+        assertEquals(negative, validator.validate(ukMinus, Locale.UK), "UK 
negative");
 
-        assertEquals(expected, validator.validate(usDollar + "1,234", 
Locale.US), "US locale");
-        assertEquals(negative, validator.validate("(" + usDollar + "1,234)", 
Locale.US), "US negative");
+        assertEquals(expected, validator.validate(usPlus, Locale.US), "US 
locale");
+        assertEquals(negative, validator.validate(usMinus, Locale.US), "US 
negative");
     }
 
     /**
@@ -105,6 +112,11 @@ public class CurrencyValidatorTest {
     public void testInvalid() {
         final BigDecimalValidator validator = CurrencyValidator.getInstance();
 
+        final String ukPlus = 
NumberFormat.getCurrencyInstance(Locale.UK).format(1234.56);
+        final String usPlus = 
NumberFormat.getCurrencyInstance(Locale.US).format(1234.56);
+        final String ukMinus = 
NumberFormat.getCurrencyInstance(Locale.UK).format(-1234.56);
+        final String usMinus = 
NumberFormat.getCurrencyInstance(Locale.US).format(-1234.56);
+
         // Invalid Missing
         assertFalse(validator.isValid(null), "isValid() Null Value");
         assertFalse(validator.isValid(""), "isValid() Empty Value");
@@ -112,12 +124,20 @@ public class CurrencyValidatorTest {
         assertNull(validator.validate(""), "validate() Empty Value");
 
         // Invalid UK
-        assertFalse(validator.isValid(usDollar + "1,234.56", Locale.UK), "UK 
wrong symbol");
-        assertFalse(validator.isValid("(" + ukPound + "1,234.56)", Locale.UK), 
"UK wrong negative");
+        assertFalse(validator.isValid(usPlus, Locale.UK), "UK wrong symbol: " 
+ usPlus);
+        if (ukMinus.startsWith("-")) {
+            assertFalse(validator.isValid("(" + ukPound + "1,234.56)", 
Locale.UK), "UK wrong negative: " + ukMinus);
+        } else {
+            assertFalse(validator.isValid("-" + ukPound + "1,234.56", 
Locale.UK), "UK wrong negative: " + ukMinus);
+        }
 
         // Invalid US
-        assertFalse(validator.isValid(ukPound + "1,234.56", Locale.US), "US 
wrong symbol");
-        assertFalse(validator.isValid("-" + usDollar + "1,234.56", Locale.US), 
"US wrong negative");
+        assertFalse(validator.isValid(ukPlus, Locale.US), "US wrong symbol: " 
+ ukPlus);
+        if (usMinus.startsWith("-")) {
+            assertFalse(validator.isValid("(" + usDollar + "1,234.56)", 
Locale.US), "UK wrong negative: " + usMinus);
+        } else {
+            assertFalse(validator.isValid("-" + usDollar + "1,234.56", 
Locale.US), "UK wrong negative: " + usMinus);
+        }
     }
 
     /**
@@ -165,20 +185,37 @@ public class CurrencyValidatorTest {
         final BigDecimal noDecimal = new BigDecimal("1234.00");
         final BigDecimal oneDecimal = new BigDecimal("1234.50");
 
-        assertEquals(expected, validator.validate(ukPound + "1,234.56"), 
"Default locale");
-
-        assertEquals(expected, validator.validate(ukPound + "1,234.56", 
Locale.UK), "UK locale");
-        assertEquals(negative, validator.validate("-" + ukPound + "1,234.56", 
Locale.UK), "UK negative");
-        assertEquals(noDecimal, validator.validate(ukPound + "1,234", 
Locale.UK), "UK no decimal");
-        assertEquals(oneDecimal, validator.validate(ukPound + "1,234.5", 
Locale.UK), "UK 1 decimal");
-        assertEquals(expected, validator.validate(ukPound + "1,234.567", 
Locale.UK), "UK 3 decimal");
+        // Generate the exected strings, as these vary between JVMs
+        final String ukPlus = 
NumberFormat.getCurrencyInstance(Locale.UK).format(1234.56);
+        final String ukPlus0Decimal = 
NumberFormat.getCurrencyInstance(Locale.UK).format(1234);
+        final String ukPlus1Decimal = 
NumberFormat.getCurrencyInstance(Locale.UK).format(1234.5);
+        // Note that NumberFormat may perform rounding up or truncation, so we 
cheat
+        final String ukPlus3Decimal = 
NumberFormat.getCurrencyInstance(Locale.UK).format(1234.56) + "7";
+        final String ukMinus = 
NumberFormat.getCurrencyInstance(Locale.UK).format(-1234.56);
+        final String usPlus = 
NumberFormat.getCurrencyInstance(Locale.US).format(1234.56);
+        final String usPlus0Decimal = 
NumberFormat.getCurrencyInstance(Locale.US).format(1234);
+        final String usPlus1Decimal = 
NumberFormat.getCurrencyInstance(Locale.US).format(1234.5);
+        // Note that NumberFormat may perform rounding up or truncation, so we 
cheat
+        final String usPlus3Decimal = 
NumberFormat.getCurrencyInstance(Locale.US).format(1234.56) + "7";
+        final String usMinus = 
NumberFormat.getCurrencyInstance(Locale.US).format(-1234.56);
+
+        assertEquals(expected, validator.validate(ukPlus), "Default locale");
+
+        assertEquals(expected, validator.validate(ukPlus, Locale.UK), "UK 
locale");
+        assertEquals(negative, validator.validate(ukMinus, Locale.UK), "UK 
negative");
+        assertEquals(noDecimal, validator.validate(ukPlus0Decimal, Locale.UK), 
"UK no decimal");
+        assertEquals(oneDecimal, validator.validate(ukPlus1Decimal, 
Locale.UK), "UK 1 decimal");
+        assertEquals(expected, validator.validate(ukPlus3Decimal, Locale.UK), 
"UK 3 decimal: " + ukPlus3Decimal);
+        // TODO: The following expects the value to be truncated, rather than 
rounded up - is that correct?
+        assertEquals(expected, validator.validate(ukPlus3Decimal, Locale.UK), 
"UK 3 decimal: " + ukPlus3Decimal);
         assertEquals(expected, validator.validate("1,234.56", Locale.UK), "UK 
no symbol");
 
-        assertEquals(expected, validator.validate(usDollar + "1,234.56", 
Locale.US), "US locale");
-        assertEquals(negative, validator.validate("(" + usDollar + 
"1,234.56)", Locale.US), "US negative");
-        assertEquals(noDecimal, validator.validate(usDollar + "1,234", 
Locale.US), "US no decimal");
-        assertEquals(oneDecimal, validator.validate(usDollar + "1,234.5", 
Locale.US), "US 1 decimal");
-        assertEquals(expected, validator.validate(usDollar + "1,234.567", 
Locale.US), "US 3 decimal");
+        assertEquals(expected, validator.validate(usPlus, Locale.US), "US 
locale");
+        assertEquals(negative, validator.validate(usMinus, Locale.US), "US 
negative");
+        assertEquals(noDecimal, validator.validate(usPlus0Decimal, Locale.US), 
"US no decimal");
+        assertEquals(oneDecimal, validator.validate(usPlus1Decimal, 
Locale.US), "US 1 decimal");
+        // TODO: The following expects the value to be truncated, rather than 
rounded up - is that correct?
+        assertEquals(expected, validator.validate(usPlus3Decimal, Locale.US), 
"US 3 decimal: " + usPlus3Decimal);
         assertEquals(expected, validator.validate("1,234.56", Locale.US), "US 
no symbol");
     }
 }
diff --git 
a/src/test/java/org/apache/commons/validator/routines/DateValidatorTest.java 
b/src/test/java/org/apache/commons/validator/routines/DateValidatorTest.java
index 6d965d71..c3f57765 100644
--- a/src/test/java/org/apache/commons/validator/routines/DateValidatorTest.java
+++ b/src/test/java/org/apache/commons/validator/routines/DateValidatorTest.java
@@ -19,16 +19,16 @@ package org.apache.commons.validator.routines;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.Locale;
 import java.util.TimeZone;
 
-import org.apache.commons.lang3.SystemProperties;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -139,8 +139,12 @@ public class DateValidatorTest extends 
AbstractCalendarValidatorTest {
         final Locale locale = Locale.GERMAN;
         final String pattern = "yyyy-MM-dd";
         final String patternVal = "2005-12-31";
-        final String germanVal = "31 Dez 2005";
         final String germanPattern = "dd MMM yyyy";
+        // Don't rely on specific German format - it varies between JVMs
+        final DateFormat df = new SimpleDateFormat(germanPattern, locale);
+        final Calendar cal = Calendar.getInstance(Locale.US);
+        cal.set(2005, 11, 31); // month is 0-based
+        final String germanVal = df.format(cal.getTime());
         final String localeVal = "31.12.2005";
         final String defaultVal = "12/31/05";
         final String xxxx = "XXXX";
@@ -176,20 +180,4 @@ public class DateValidatorTest extends 
AbstractCalendarValidatorTest {
         assertEquals(expectedZone, 
DateValidator.getInstance().validate(patternVal, pattern, zone), "validate(C) 
pattern");
         assertEquals(expectedZone, 
DateValidator.getInstance().validate(germanVal, germanPattern, Locale.GERMAN, 
zone), "validate(C) both");
     }
-
-    /**
-     * Check that locale providers are set up correctly If not, the parse will 
fail
-     */
-    @Test
-    public void testLocaleProviders() throws Exception {
-        final String localeProviders = 
SystemProperties.getJavaLocaleProviders();
-        if (localeProviders != null) { // may be null before Java 9
-            assertTrue(localeProviders.startsWith("COMPAT"), 
"java.locale.providers must start with COMPAT");
-        }
-        final String txt = "3/20/15 10:59:00 PM"; // This relies on the locale 
format prior to Java 9 to parse correctly
-        final DateFormat dateformat = 
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, Locale.US);
-        dateformat.setTimeZone(TimeZone.getTimeZone("GMT"));
-        final Date date = dateformat.parse(txt);
-        assertNotNull(date);
-    }
 }
diff --git 
a/src/test/java/org/apache/commons/validator/routines/TimeValidatorTest.java 
b/src/test/java/org/apache/commons/validator/routines/TimeValidatorTest.java
index bbeca924..243e2aca 100644
--- a/src/test/java/org/apache/commons/validator/routines/TimeValidatorTest.java
+++ b/src/test/java/org/apache/commons/validator/routines/TimeValidatorTest.java
@@ -22,6 +22,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Locale;
@@ -183,11 +185,17 @@ public class TimeValidatorTest {
         // Set the default Locale
         Locale.setDefault(Locale.UK);
 
+        // The JVM format varies; calculate expected results
+        final Calendar cal = createTime(null, 164923, 0);
+        final DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT);
+        final String val = df.format(cal.getTime());
+        final DateFormat dfus = DateFormat.getTimeInstance(DateFormat.SHORT, 
Locale.US);
+        final String valus = dfus.format(cal.getTime());
         final Object test = TimeValidator.getInstance().validate("16:49:23", 
"HH:mm:ss");
         assertNotNull(test, "Test Date ");
         assertEquals("16-49-23", validator.format(test, "HH-mm-ss"), "Format 
pattern");
-        assertEquals("4:49 PM", validator.format(test, Locale.US), "Format 
locale");
-        assertEquals("16:49", validator.format(test), "Format default");
+        assertEquals(valus, validator.format(test, Locale.US), "Format 
locale");
+        assertEquals(val, validator.format(test), "Format default");
     }
 
     /**
@@ -282,16 +290,25 @@ public class TimeValidatorTest {
         result = null;
 
         // Locale, diff TimeZone
-        result = validator.validate("7:18 PM", Locale.US, EST);
-        assertNotNull(result, "locale result");
-        assertEquals(EST, result.getTimeZone(), "locale zone");
-        assertEquals(19, result.get(Calendar.HOUR_OF_DAY), "locale hour");
-        assertEquals(18, result.get(Calendar.MINUTE), "locale minute");
+        final DateFormat usdf = DateFormat.getTimeInstance(DateFormat.SHORT, 
Locale.US);
+        final Calendar uscal = Calendar.getInstance(Locale.US);
+        uscal.set(2005, 0, 1, 19, 18); // month is 0-based
+        final String usVal = usdf.format(uscal.getTime());
+        result = validator.validate(usVal, Locale.US, EST);
+        assertNotNull(result, "locale result: " + usVal);
+        assertEquals(EST, result.getTimeZone(), "locale zone: " + usVal);
+        assertEquals(19, result.get(Calendar.HOUR_OF_DAY), "locale hour: " + 
usVal);
+        assertEquals(18, result.get(Calendar.MINUTE), "locale minute: " + 
usVal);
         result = null;
 
+        final String dateTimePattern = "dd/MMM/yy HH-mm";
+        final Calendar decal = Calendar.getInstance(Locale.GERMAN);
+        decal.set(2005, 11, 31, 21, 05); // month is 0-based
+        final String germanSample = new SimpleDateFormat(dateTimePattern, 
Locale.GERMAN).format(decal.getTime());
+
         // Locale & Pattern, diff TimeZone
-        result = validator.validate("31/Dez/05 21-05", "dd/MMM/yy HH-mm", 
Locale.GERMAN, EST);
-        assertNotNull(result, "pattern result");
+        result = validator.validate(germanSample, dateTimePattern, 
Locale.GERMAN, EST);
+        assertNotNull(result, "pattern result: " + germanSample);
         assertEquals(EST, result.getTimeZone(), "pattern zone");
         assertEquals(2005, result.get(Calendar.YEAR), "pattern day");
         assertEquals(11, result.get(Calendar.MONTH), "pattern day"); // months 
are 0-11
@@ -301,8 +318,8 @@ public class TimeValidatorTest {
         result = null;
 
         // Locale & Pattern, default TimeZone
-        result = validator.validate("31/Dez/05 21-05", "dd/MMM/yy HH-mm", 
Locale.GERMAN);
-        assertNotNull(result, "pattern result");
+        result = validator.validate(germanSample, dateTimePattern, 
Locale.GERMAN);
+        assertNotNull(result, "pattern result: " + germanSample);
         assertEquals(GMT, result.getTimeZone(), "pattern zone");
         assertEquals(2005, result.get(Calendar.YEAR), "pattern day");
         assertEquals(11, result.get(Calendar.MONTH), "pattern day"); // months 
are 0-11

Reply via email to