1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.lang3.time;
19
20 import java.text.ParseException;
21 import java.text.SimpleDateFormat;
22 import java.util.Calendar;
23 import java.util.GregorianCalendar;
24 import java.util.Locale;
25 import java.util.TimeZone;
26
27 import org.apache.commons.lang3.AbstractLangTest;
28 import org.apache.commons.lang3.function.TriFunction;
29 import org.junit.jupiter.api.Test;
30 import org.junit.jupiter.params.ParameterizedTest;
31 import org.junit.jupiter.params.provider.MethodSource;
32
33
34
35
36
37
38
39
40 public class Java15BugFastDateParserTest extends AbstractLangTest {
41
42
43 private static final String DATE_PARSER_PARAMETERS = "org.apache.commons.lang3.time.FastDateParserTest#dateParserParameters()";
44
45 @Test
46 public void testJava15BuggyLocaleTest() throws ParseException {
47 final String buggyLocaleName = "ff_LR_#Adlm";
48 Locale buggyLocale = null;
49 for (final Locale locale : Locale.getAvailableLocales()) {
50 if (buggyLocaleName.equals(locale.toString())) {
51 buggyLocale = locale;
52 break;
53 }
54 }
55 if (buggyLocale == null) {
56 return;
57 }
58 testSingleLocale(buggyLocale);
59 }
60
61 @Test
62 public void testJava15BuggyLocaleTestAll() throws ParseException {
63 for (final Locale locale : Locale.getAvailableLocales()) {
64 testSingleLocale(locale);
65 }
66 }
67
68 private void testLocales(final TriFunction<String, TimeZone, Locale, DateParser> dbProvider, final String format,
69 final boolean eraBC) throws Exception {
70
71 final Calendar cal = Calendar.getInstance(TimeZones.GMT);
72 cal.clear();
73 cal.set(2003, Calendar.FEBRUARY, 10);
74 if (eraBC) {
75 cal.set(Calendar.ERA, GregorianCalendar.BC);
76 }
77
78 for (final Locale locale : Locale.getAvailableLocales()) {
79
80 if (eraBC && locale.equals(FastDateParser.JAPANESE_IMPERIAL)) {
81 continue;
82 }
83 final SimpleDateFormat sdf = new SimpleDateFormat(format, locale);
84 final DateParser fdf = dbProvider.apply(format, TimeZone.getDefault(), locale);
85
86
87 FastDateParserTest.checkParse(locale, cal, sdf, fdf);
88 }
89 }
90
91 @ParameterizedTest
92 @MethodSource(DATE_PARSER_PARAMETERS)
93 public void testLocales_Long_AD(final TriFunction<String, TimeZone, Locale, DateParser> dpProvider)
94 throws Exception {
95 testLocales(dpProvider, FastDateParserTest.LONG_FORMAT, false);
96 }
97
98 @ParameterizedTest
99 @MethodSource(DATE_PARSER_PARAMETERS)
100 public void testLocales_Long_BC(final TriFunction<String, TimeZone, Locale, DateParser> dpProvider)
101 throws Exception {
102 testLocales(dpProvider, FastDateParserTest.LONG_FORMAT, true);
103 }
104
105 @ParameterizedTest
106 @MethodSource(DATE_PARSER_PARAMETERS)
107 public void testLocales_LongNoEra_AD(final TriFunction<String, TimeZone, Locale, DateParser> dpProvider)
108 throws Exception {
109 testLocales(dpProvider, FastDateParserTest.LONG_FORMAT_NOERA, false);
110 }
111
112 @ParameterizedTest
113 @MethodSource(DATE_PARSER_PARAMETERS)
114 public void testLocales_LongNoEra_BC(final TriFunction<String, TimeZone, Locale, DateParser> dpProvider)
115 throws Exception {
116 testLocales(dpProvider, FastDateParserTest.LONG_FORMAT_NOERA, true);
117 }
118
119 @ParameterizedTest
120 @MethodSource(DATE_PARSER_PARAMETERS)
121 public void testLocales_Short_AD(final TriFunction<String, TimeZone, Locale, DateParser> dpProvider)
122 throws Exception {
123 testLocales(dpProvider, FastDateParserTest.SHORT_FORMAT, false);
124 }
125
126 @ParameterizedTest
127 @MethodSource(DATE_PARSER_PARAMETERS)
128 public void testLocales_Short_BC(final TriFunction<String, TimeZone, Locale, DateParser> dpProvider)
129 throws Exception {
130 testLocales(dpProvider, FastDateParserTest.SHORT_FORMAT, true);
131 }
132
133 @ParameterizedTest
134 @MethodSource(DATE_PARSER_PARAMETERS)
135 public void testLocales_ShortNoEra_AD(final TriFunction<String, TimeZone, Locale, DateParser> dpProvider)
136 throws Exception {
137 testLocales(dpProvider, FastDateParserTest.SHORT_FORMAT_NOERA, false);
138 }
139
140 @ParameterizedTest
141 @MethodSource(DATE_PARSER_PARAMETERS)
142 public void testLocales_ShortNoEra_BC(final TriFunction<String, TimeZone, Locale, DateParser> dpProvider)
143 throws Exception {
144 testLocales(dpProvider, FastDateParserTest.SHORT_FORMAT_NOERA, true);
145 }
146
147 private void testSingleLocale(final Locale locale) throws ParseException {
148 final Calendar cal = Calendar.getInstance(TimeZones.GMT);
149 cal.clear();
150 cal.set(2003, Calendar.FEBRUARY, 10);
151 final SimpleDateFormat sdf = new SimpleDateFormat(FastDateParserTest.LONG_FORMAT, locale);
152 final String formattedDate = sdf.format(cal.getTime());
153 sdf.parse(formattedDate);
154 sdf.parse(formattedDate.toUpperCase(locale));
155 sdf.parse(formattedDate.toLowerCase(locale));
156 }
157
158 }