1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.validator.routines;
18
19 import static org.junit.jupiter.api.Assertions.assertEquals;
20 import static org.junit.jupiter.api.Assertions.assertFalse;
21 import static org.junit.jupiter.api.Assertions.assertNotEquals;
22 import static org.junit.jupiter.api.Assertions.assertNotSame;
23 import static org.junit.jupiter.api.Assertions.assertNull;
24 import static org.junit.jupiter.api.Assertions.assertThrows;
25 import static org.junit.jupiter.api.Assertions.assertTrue;
26
27 import java.text.DateFormat;
28 import java.text.Format;
29 import java.text.SimpleDateFormat;
30 import java.util.Calendar;
31 import java.util.Date;
32 import java.util.Locale;
33 import java.util.TimeZone;
34
35 import org.apache.commons.lang3.time.TimeZones;
36 import org.apache.commons.validator.util.TestTimeZones;
37 import org.junit.jupiter.api.BeforeEach;
38 import org.junit.jupiter.api.Test;
39 import org.junitpioneer.jupiter.DefaultLocale;
40 import org.junitpioneer.jupiter.DefaultTimeZone;
41
42
43
44
45 class CalendarValidatorTest extends AbstractCalendarValidatorTest {
46
47 private static final int DATE_2005_11_23 = 20051123;
48 private static final int TIME_12_03_45 = 120345;
49
50 private CalendarValidator calValidator;
51
52 @BeforeEach
53 protected void setUp() {
54 calValidator = new CalendarValidator();
55 validator = calValidator;
56 }
57
58
59
60
61 @Test
62 void testAdjustToTimeZone() {
63
64 final Calendar calEST = createCalendar(TestTimeZones.EST, DATE_2005_11_23, TIME_12_03_45);
65 final Date dateEST = calEST.getTime();
66
67 final Calendar calGMT = createCalendar(TimeZones.GMT, DATE_2005_11_23, TIME_12_03_45);
68 final Date dateGMT = calGMT.getTime();
69
70 final Calendar calCET = createCalendar(TestTimeZones.EET, DATE_2005_11_23, TIME_12_03_45);
71 final Date dateCET = calCET.getTime();
72
73
74 assertNotEquals(dateGMT.getTime(), dateCET.getTime(), "Check GMT != CET");
75 assertNotEquals(dateGMT.getTime(), dateEST.getTime(), "Check GMT != EST");
76 assertNotEquals(dateCET.getTime(), dateEST.getTime(), "Check CET != EST");
77
78
79 CalendarValidator.adjustToTimeZone(calEST, TimeZones.GMT);
80 assertEquals(dateGMT, calEST.getTime(), "EST to GMT");
81 assertNotSame(dateEST, calEST.getTime(), "Check EST = GMT");
82 CalendarValidator.adjustToTimeZone(calEST, TestTimeZones.EST);
83 assertEquals(dateEST, calEST.getTime(), "back to EST");
84 assertNotSame(dateGMT, calEST.getTime(), "Check EST != GMT");
85
86
87 CalendarValidator.adjustToTimeZone(calCET, TimeZones.GMT);
88 assertEquals(dateGMT, calCET.getTime(), "CET to GMT");
89 assertNotSame(dateCET, calCET.getTime(), "Check CET = GMT");
90 CalendarValidator.adjustToTimeZone(calCET, TestTimeZones.EET);
91 assertEquals(dateCET, calCET.getTime(), "back to CET");
92 assertNotSame(dateGMT, calCET.getTime(), "Check CET != GMT");
93
94
95 final Calendar calUTC = createCalendar(TestTimeZones.UTC, DATE_2005_11_23, TIME_12_03_45);
96 assertTrue(TestTimeZones.UTC.hasSameRules(TimeZones.GMT), "SAME: UTC = GMT");
97 assertEquals(calUTC.getTime(), calGMT.getTime(), "SAME: Check time (A)");
98 assertNotEquals(TimeZones.GMT, calUTC.getTimeZone(), "SAME: Check GMT(A)");
99 assertEquals(TestTimeZones.UTC, calUTC.getTimeZone(), "SAME: Check UTC(A)");
100 CalendarValidator.adjustToTimeZone(calUTC, TimeZones.GMT);
101 assertEquals(calUTC.getTime(), calGMT.getTime(), "SAME: Check time (B)");
102 assertEquals(TimeZones.GMT, calUTC.getTimeZone(), "SAME: Check GMT(B)");
103 assertNotEquals(TestTimeZones.UTC, calUTC.getTimeZone(), "SAME: Check UTC(B)");
104 }
105
106
107
108
109 @Test
110 @DefaultLocale(country = "US", language = "en")
111 void testCalendarValidatorMethods() {
112 final Locale locale = Locale.GERMAN;
113 final String pattern = "yyyy-MM-dd";
114 final String patternVal = "2005-12-31";
115 final String germanPattern = "dd MMM yyyy";
116
117 final DateFormat df = new SimpleDateFormat(germanPattern, locale);
118 final Calendar cal = Calendar.getInstance(Locale.US);
119 cal.set(2005, Calendar.DECEMBER, 31);
120 final String germanVal = df.format(cal.getTime());
121 final String localeVal = "31.12.2005";
122 final String defaultVal = "12/31/05";
123 final String xxxx = "XXXX";
124 final Date expected = createCalendar(null, 20051231, 0).getTime();
125 assertEquals(expected, CalendarValidator.getInstance().validate(defaultVal).getTime(), "validate(A) default");
126 assertEquals(expected, CalendarValidator.getInstance().validate(localeVal, locale).getTime(), "validate(A) locale ");
127 assertEquals(expected, CalendarValidator.getInstance().validate(patternVal, pattern).getTime(), "validate(A) pattern");
128 assertEquals(expected, CalendarValidator.getInstance().validate(germanVal, germanPattern, Locale.GERMAN).getTime(), "validate(A) both");
129
130 assertTrue(CalendarValidator.getInstance().isValid(defaultVal), "isValid(A) default");
131 assertTrue(CalendarValidator.getInstance().isValid(localeVal, locale), "isValid(A) locale ");
132 assertTrue(CalendarValidator.getInstance().isValid(patternVal, pattern), "isValid(A) pattern");
133 assertTrue(CalendarValidator.getInstance().isValid(germanVal, germanPattern, Locale.GERMAN), "isValid(A) both");
134
135 assertNull(CalendarValidator.getInstance().validate(xxxx), "validate(B) default");
136 assertNull(CalendarValidator.getInstance().validate(xxxx, locale), "validate(B) locale ");
137 assertNull(CalendarValidator.getInstance().validate(xxxx, pattern), "validate(B) pattern");
138 assertNull(CalendarValidator.getInstance().validate("31 Dec 2005", germanPattern, Locale.GERMAN), "validate(B) both");
139
140 assertFalse(CalendarValidator.getInstance().isValid(xxxx), "isValid(B) default");
141 assertFalse(CalendarValidator.getInstance().isValid(xxxx, locale), "isValid(B) locale ");
142 assertFalse(CalendarValidator.getInstance().isValid(xxxx, pattern), "isValid(B) pattern");
143 assertFalse(CalendarValidator.getInstance().isValid("31 Dec 2005", germanPattern, Locale.GERMAN), "isValid(B) both");
144
145
146 final TimeZone zone = TimeZone.getDefault().getRawOffset() == TestTimeZones.EET.getRawOffset() ? TestTimeZones.EST : TestTimeZones.EET;
147 final Date expectedZone = createCalendar(zone, 20051231, 0).getTime();
148 assertNotEquals(expected.getTime(), expectedZone.getTime(), "default/EET same ");
149
150 assertEquals(expectedZone, CalendarValidator.getInstance().validate(defaultVal, zone).getTime(), "validate(C) default");
151 assertEquals(expectedZone, CalendarValidator.getInstance().validate(localeVal, locale, zone).getTime(), "validate(C) locale ");
152 assertEquals(expectedZone, CalendarValidator.getInstance().validate(patternVal, pattern, zone).getTime(), "validate(C) pattern");
153 assertEquals(expectedZone, CalendarValidator.getInstance().validate(germanVal, germanPattern, Locale.GERMAN, zone).getTime(), "validate(C) both");
154 }
155
156
157
158
159 @Test
160 void testCompare() {
161 final int sameTime = 124522;
162 final int testDate = 20050823;
163 final Calendar diffHour = createCalendar(TimeZones.GMT, testDate, 115922);
164 final Calendar diffMin = createCalendar(TimeZones.GMT, testDate, 124422);
165 final Calendar diffSec = createCalendar(TimeZones.GMT, testDate, 124521);
166
167 final Calendar value = createCalendar(TimeZones.GMT, testDate, sameTime);
168 final Calendar cal20050824 = createCalendar(TimeZones.GMT, 20050824, sameTime);
169 final Calendar cal20050822 = createCalendar(TimeZones.GMT, 20050822, sameTime);
170
171 final Calendar cal20050830 = createCalendar(TimeZones.GMT, 20050830, sameTime);
172 final Calendar cal20050816 = createCalendar(TimeZones.GMT, 20050816, sameTime);
173
174 final Calendar cal20050901 = createCalendar(TimeZones.GMT, 20050901, sameTime);
175 final Calendar cal20050801 = createCalendar(TimeZones.GMT, 20050801, sameTime);
176 final Calendar cal20050731 = createCalendar(TimeZones.GMT, 20050731, sameTime);
177
178 final Calendar cal20051101 = createCalendar(TimeZones.GMT, 20051101, sameTime);
179 final Calendar cal20051001 = createCalendar(TimeZones.GMT, 20051001, sameTime);
180 final Calendar cal20050701 = createCalendar(TimeZones.GMT, 20050701, sameTime);
181 final Calendar cal20050630 = createCalendar(TimeZones.GMT, 20050630, sameTime);
182
183 final Calendar cal20060101 = createCalendar(TimeZones.GMT, 20060101, sameTime);
184 final Calendar cal20050101 = createCalendar(TimeZones.GMT, 20050101, sameTime);
185 final Calendar cal20041231 = createCalendar(TimeZones.GMT, 20041231, sameTime);
186
187 assertEquals(1, calValidator.compare(value, diffHour, Calendar.HOUR_OF_DAY), "hour GT");
188 assertEquals(0, calValidator.compare(value, diffMin, Calendar.HOUR_OF_DAY), "hour EQ");
189 assertEquals(1, calValidator.compare(value, diffMin, Calendar.MINUTE), "mins GT");
190 assertEquals(0, calValidator.compare(value, diffSec, Calendar.MINUTE), "mins EQ");
191 assertEquals(1, calValidator.compare(value, diffSec, Calendar.SECOND), "secs GT");
192
193 assertEquals(-1, calValidator.compareDates(value, cal20050824), "date LT");
194 assertEquals(0, calValidator.compareDates(value, diffHour), "date EQ");
195 assertEquals(0, calValidator.compare(value, diffHour, Calendar.DAY_OF_YEAR), "date(B)");
196 assertEquals(1, calValidator.compareDates(value, cal20050822), "date GT");
197
198 assertEquals(-1, calValidator.compareWeeks(value, cal20050830), "week LT");
199 assertEquals(0, calValidator.compareWeeks(value, cal20050824), "week =1");
200 assertEquals(0, calValidator.compareWeeks(value, cal20050822), "week =2");
201 assertEquals(0, calValidator.compare(value, cal20050822, Calendar.WEEK_OF_MONTH), "week =3");
202 assertEquals(0, calValidator.compareWeeks(value, cal20050822), "week =4");
203 assertEquals(1, calValidator.compareWeeks(value, cal20050816), "week GT");
204
205 assertEquals(-1, calValidator.compareMonths(value, cal20050901), "mnth LT");
206 assertEquals(0, calValidator.compareMonths(value, cal20050830), "mnth =1");
207 assertEquals(0, calValidator.compareMonths(value, cal20050801), "mnth =2");
208 assertEquals(0, calValidator.compareMonths(value, cal20050816), "mnth =3");
209 assertEquals(1, calValidator.compareMonths(value, cal20050731), "mnth GT");
210
211 assertEquals(-1, calValidator.compareQuarters(value, cal20051101), "qtrA <1");
212 assertEquals(-1, calValidator.compareQuarters(value, cal20051001), "qtrA <2");
213 assertEquals(0, calValidator.compareQuarters(value, cal20050901), "qtrA =1");
214 assertEquals(0, calValidator.compareQuarters(value, cal20050701), "qtrA =2");
215 assertEquals(0, calValidator.compareQuarters(value, cal20050731), "qtrA =3");
216 assertEquals(1, calValidator.compareQuarters(value, cal20050630), "qtrA GT");
217
218
219 assertEquals(-1, calValidator.compareQuarters(value, cal20051101, 2), "qtrB LT");
220 assertEquals(0, calValidator.compareQuarters(value, cal20051001, 2), "qtrB =1");
221 assertEquals(0, calValidator.compareQuarters(value, cal20050901, 2), "qtrB =2");
222 assertEquals(1, calValidator.compareQuarters(value, cal20050701, 2), "qtrB =3");
223 assertEquals(1, calValidator.compareQuarters(value, cal20050731, 2), "qtrB =4");
224 assertEquals(1, calValidator.compareQuarters(value, cal20050630, 2), "qtrB GT");
225
226 assertEquals(-1, calValidator.compareYears(value, cal20060101), "year LT");
227 assertEquals(0, calValidator.compareYears(value, cal20050101), "year EQ");
228 assertEquals(1, calValidator.compareYears(value, cal20041231), "year GT");
229
230
231 final Exception e = assertThrows(IllegalArgumentException.class, () -> calValidator.compare(value, value, -1), "Invalid Compare field");
232 assertEquals("Invalid field: -1", e.getMessage(), "check message");
233 }
234
235
236
237
238 @Test
239 @DefaultLocale(country = "UK", language = "en")
240 void testDateTimeStyle() {
241
242 final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
243 final Calendar cal = Calendar.getInstance();
244 cal.set(2005, Calendar.DECEMBER, 31, 14, 23);
245 final String val = df.format(cal.getTime());
246
247 final DateFormat usdf = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.US);
248 final Calendar uscal = Calendar.getInstance(Locale.US);
249 uscal.set(2005, Calendar.DECEMBER, 31, 14, 23);
250 final String usval = usdf.format(uscal.getTime());
251
252 final AbstractCalendarValidator dateTimeValidator = new AbstractCalendarValidator(true, DateFormat.SHORT, DateFormat.SHORT) {
253 private static final long serialVersionUID = 1L;
254
255 @Override
256 protected Object processParsedValue(final Object value, final Format formatter) {
257 return value;
258 }
259 };
260 assertTrue(dateTimeValidator.isValid(val), "validate(A) default");
261 assertTrue(dateTimeValidator.isValid(usval, Locale.US), "validate(A) locale ");
262 }
263
264
265
266
267 @Override
268 @Test
269 @DefaultLocale(country = "UK", language = "en")
270 @DefaultTimeZone("GMT")
271 void testFormat() {
272 final Calendar cal20051231 = createCalendar(TimeZones.GMT, 20051231, 11500);
273
274 final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
275 final String val = df.format(cal20051231.getTime());
276 final DateFormat dfus = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
277 final String usval = dfus.format(cal20051231.getTime());
278 final String germanPattern = "dd MMM yyyy";
279 final DateFormat dedf = new SimpleDateFormat(germanPattern, Locale.GERMAN);
280 final String deval = dedf.format(cal20051231.getTime());
281 assertNull(calValidator.format(null), "null");
282 assertEquals(val, calValidator.format(cal20051231), "default");
283 assertEquals(usval, calValidator.format(cal20051231, Locale.US), "locale");
284 assertEquals("2005-12-31 01:15", calValidator.format(cal20051231, "yyyy-MM-dd HH:mm"), "patternA");
285 assertEquals("2005-12-31 GMT", calValidator.format(cal20051231, "yyyy-MM-dd z"), "patternB");
286 assertEquals(deval, calValidator.format(cal20051231, germanPattern, Locale.GERMAN), "both");
287
288
289 final DateFormat dfest = DateFormat.getDateInstance(DateFormat.SHORT);
290 dfest.setTimeZone(TestTimeZones.EST);
291 final String valest = dfest.format(cal20051231.getTime());
292
293 final DateFormat dfusest = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
294 dfusest.setTimeZone(TestTimeZones.EST);
295 final String valusest = dfusest.format(cal20051231.getTime());
296
297 final DateFormat dedfest = new SimpleDateFormat(germanPattern, Locale.GERMAN);
298 dedfest.setTimeZone(TestTimeZones.EST);
299 final String devalest = dedfest.format(cal20051231.getTime());
300
301 assertEquals(valest, calValidator.format(cal20051231, TestTimeZones.EST), "EST default");
302 assertEquals(valusest, calValidator.format(cal20051231, Locale.US, TestTimeZones.EST), "EST locale");
303
304 final String patternA = "yyyy-MM-dd HH:mm";
305 final DateFormat dfA = new SimpleDateFormat(patternA);
306 dfA.setTimeZone(TestTimeZones.EST);
307 final String valA = dfA.format(cal20051231.getTime());
308 assertEquals(valA, calValidator.format(cal20051231, patternA, TestTimeZones.EST), "EST patternA");
309
310 final String patternB = "yyyy-MM-dd z";
311 final DateFormat dfB = new SimpleDateFormat(patternB);
312 dfB.setTimeZone(TestTimeZones.EST);
313 final String valB = dfB.format(cal20051231.getTime());
314
315 assertEquals(valB, calValidator.format(cal20051231, patternB, TestTimeZones.EST), "EST patternB");
316 assertEquals(devalest, calValidator.format(cal20051231, germanPattern, Locale.GERMAN, TestTimeZones.EST), "EST both");
317 }
318
319 }