View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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.assertNotNull;
22  import static org.junit.jupiter.api.Assertions.assertNull;
23  import static org.junit.jupiter.api.Assertions.assertTrue;
24  
25  import java.util.Calendar;
26  import java.util.Date;
27  import java.util.Locale;
28  import java.util.TimeZone;
29  
30  import org.junit.jupiter.api.AfterEach;
31  import org.junit.jupiter.api.BeforeEach;
32  import org.junit.jupiter.api.Test;
33  
34  /**
35   * Test Case for TimeValidator.
36   */
37  public class TimeValidatorTest {
38  
39      protected static final TimeZone GMT = TimeZone.getTimeZone("GMT"); // 0 offset
40      protected static final TimeZone EST = TimeZone.getTimeZone("EST"); // - 5 hours
41  
42      /**
43       * Create a date instance for a specified time zone, date and time.
44       *
45       * @param zone        The time zone
46       * @param time        the time in HH:mm:ss format
47       * @param millisecond the milliseconds
48       * @return the new Date instance.
49       */
50      protected static Date createDate(final TimeZone zone, final int time, final int millisecond) {
51          final Calendar calendar = createTime(zone, time, millisecond);
52          return calendar.getTime();
53      }
54  
55      /**
56       * Create a calendar instance for a specified time zone, date and time.
57       *
58       * @param zone        The time zone
59       * @param time        the time in HH:mm:ss format
60       * @param millisecond the milliseconds
61       * @return the new Calendar instance.
62       */
63      protected static Calendar createTime(final TimeZone zone, final int time, final int millisecond) {
64          final Calendar calendar = zone == null ? Calendar.getInstance() : Calendar.getInstance(zone);
65          final int hour = time / 10000 * 10000;
66          final int min = time / 100 * 100 - hour;
67          final int sec = time - (hour + min);
68          calendar.set(Calendar.YEAR, 1970);
69          calendar.set(Calendar.MONTH, 0);
70          calendar.set(Calendar.DATE, 1);
71          calendar.set(Calendar.HOUR_OF_DAY, hour / 10000);
72          calendar.set(Calendar.MINUTE, min / 100);
73          calendar.set(Calendar.SECOND, sec);
74          calendar.set(Calendar.MILLISECOND, millisecond);
75          return calendar;
76      }
77  
78      protected TimeValidator validator;
79      protected String[] patternValid = { "23-59-59", "00-00-00", "00-00-01", "0-0-0", "1-12-1", "10-49-18", "16-23-46" };
80      protected Date[] patternExpect = { createDate(null, 235959, 0), createDate(null, 0, 0), createDate(null, 1, 0), createDate(null, 0, 0),
81              createDate(null, 11201, 0), createDate(null, 104918, 0), createDate(null, 162346, 0) };
82      protected String[] localeValid = { "23:59", "00:00", "00:01", "0:0", "1:12", "10:49", "16:23" };
83      protected Date[] localeExpect = { createDate(null, 235900, 0), createDate(null, 0, 0), createDate(null, 100, 0), createDate(null, 0, 0),
84              createDate(null, 11200, 0), createDate(null, 104900, 0), createDate(null, 162300, 0) };
85  
86      protected String[] patternInvalid = { "24-00-00" // midnight
87              , "24-00-01" // past midnight
88              , "25-02-03" // invalid hour
89              , "10-61-31" // invalid minute
90              , "10-01-61" // invalid second
91              , "05:02-29" // invalid sep
92              , "0X-01:01" // invalid sep
93              , "05-0X-01" // invalid char
94              , "10-01-0X" // invalid char
95              , "01:01:05" // invalid pattern
96              , "10-10" // invalid pattern
97              , "10--10" // invalid pattern
98              , "10-10-" }; // invalid pattern
99      protected String[] localeInvalid = { "24:00" // midnight
100             , "24:00" // past midnight
101             , "25:02" // invalid hour
102             , "10:61" // invalid minute
103             , "05-02" // invalid sep
104             , "0X:01" // invalid sep
105             , "05:0X" // invalid char
106             , "01-01" // invalid pattern
107             , "10:" // invalid pattern
108             , "10::1" // invalid pattern
109             , "10:1:" }; // invalid pattern
110 
111     private Locale origDefault;
112 
113     private TimeZone defaultZone;
114 
115     @BeforeEach
116     protected void setUp() {
117         validator = new TimeValidator();
118         defaultZone = TimeZone.getDefault();
119         origDefault = Locale.getDefault();
120     }
121 
122     /**
123      * Tear down
124      */
125     @AfterEach
126     protected void tearDown() {
127         validator = null;
128         Locale.setDefault(origDefault);
129         TimeZone.setDefault(defaultZone);
130     }
131 
132     /**
133      * Test compare date methods
134      */
135     @Test
136     public void testCompare() {
137         final int testTime = 154523;
138         final int min = 100;
139         final int hour = 10000;
140 
141         final Calendar milliGreater = createTime(GMT, testTime, 500); // > milli sec
142         final Calendar value = createTime(GMT, testTime, 400); // test value
143         final Calendar milliLess = createTime(GMT, testTime, 300); // < milli sec
144 
145         final Calendar secGreater = createTime(GMT, testTime + 1, 100); // +1 sec
146         final Calendar secLess = createTime(GMT, testTime - 1, 100); // -1 sec
147 
148         final Calendar minGreater = createTime(GMT, testTime + min, 100); // +1 min
149         final Calendar minLess = createTime(GMT, testTime - min, 100); // -1 min
150 
151         final Calendar hourGreater = createTime(GMT, testTime + hour, 100); // +1 hour
152         final Calendar hourLess = createTime(GMT, testTime - hour, 100); // -1 hour
153 
154         assertEquals(-1, validator.compareTime(value, milliGreater), "mili LT"); // > milli
155         assertEquals(0, validator.compareTime(value, value), "mili EQ"); // same time
156         assertEquals(1, validator.compareTime(value, milliLess), "mili GT"); // < milli
157 
158         assertEquals(-1, validator.compareSeconds(value, secGreater), "secs LT"); // +1 sec
159         assertEquals(0, validator.compareSeconds(value, milliGreater), "secs =1"); // > milli
160         assertEquals(0, validator.compareSeconds(value, value), "secs =2"); // same time
161         assertEquals(0, validator.compareSeconds(value, milliLess), "secs =3"); // < milli
162         assertEquals(1, validator.compareSeconds(value, secLess), "secs GT"); // -1 sec
163 
164         assertEquals(-1, validator.compareMinutes(value, minGreater), "mins LT"); // +1 min
165         assertEquals(0, validator.compareMinutes(value, secGreater), "mins =1"); // +1 sec
166         assertEquals(0, validator.compareMinutes(value, value), "mins =2"); // same time
167         assertEquals(0, validator.compareMinutes(value, secLess), "mins =3"); // -1 sec
168         assertEquals(1, validator.compareMinutes(value, minLess), "mins GT"); // -1 min
169 
170         assertEquals(-1, validator.compareHours(value, hourGreater), "hour LT"); // +1 hour
171         assertEquals(0, validator.compareHours(value, minGreater), "hour =1"); // +1 min
172         assertEquals(0, validator.compareHours(value, value), "hour =2"); // same time
173         assertEquals(0, validator.compareHours(value, minLess), "hour =3"); // -1 min
174         assertEquals(1, validator.compareHours(value, hourLess), "hour GT"); // -1 hour
175 
176     }
177 
178     /**
179      * Test Invalid Dates with "locale" validation
180      */
181     @Test
182     public void testFormat() {
183         // Set the default Locale
184         Locale.setDefault(Locale.UK);
185 
186         final Object test = TimeValidator.getInstance().validate("16:49:23", "HH:mm:ss");
187         assertNotNull(test, "Test Date ");
188         assertEquals(validator.format(test, "HH-mm-ss"), "16-49-23", "Format pattern");
189         assertEquals(validator.format(test, Locale.US), "4:49 PM", "Format locale");
190         assertEquals(validator.format(test), "16:49", "Format default");
191 
192     }
193 
194     /**
195      * Test Invalid Dates with "locale" validation
196      */
197     @Test
198     public void testLocaleInvalid() {
199         for (int i = 0; i < localeInvalid.length; i++) {
200             final String text = i + " value=[" + localeInvalid[i] + "] passed ";
201             final Object date = validator.validate(localeInvalid[i], Locale.US);
202             assertNull(date, () -> "validate() " + text + date);
203             assertFalse(validator.isValid(localeInvalid[i], Locale.UK), () -> "isValid() " + text);
204         }
205     }
206 
207     /**
208      * Test Valid Dates with "locale" validation
209      */
210     @Test
211     public void testLocaleValid() {
212         for (int i = 0; i < localeValid.length; i++) {
213             final String text = i + " value=[" + localeValid[i] + "] failed ";
214             final Calendar calendar = validator.validate(localeValid[i], Locale.UK);
215             assertNotNull(calendar, () -> "validate() " + text);
216             final Date date = calendar.getTime();
217             assertTrue(validator.isValid(localeValid[i], Locale.UK), () -> "isValid() " + text);
218             assertEquals(localeExpect[i], date, () -> "compare " + text);
219         }
220     }
221 
222     /**
223      * Test Invalid Dates with "pattern" validation
224      */
225     @Test
226     public void testPatternInvalid() {
227         for (int i = 0; i < patternInvalid.length; i++) {
228             final String text = i + " value=[" + patternInvalid[i] + "] passed ";
229             final Object date = validator.validate(patternInvalid[i], "HH-mm-ss");
230             assertNull(date, () -> "validate() " + text + date);
231             assertFalse(validator.isValid(patternInvalid[i], "HH-mm-ss"), () -> "isValid() " + text);
232         }
233     }
234 
235     /**
236      * Test Valid Dates with "pattern" validation
237      */
238     @Test
239     public void testPatternValid() {
240         for (int i = 0; i < patternValid.length; i++) {
241             final String text = i + " value=[" + patternValid[i] + "] failed ";
242             final Calendar calendar = validator.validate(patternValid[i], "HH-mm-ss");
243             assertNotNull(calendar, () -> "validateObj() " + text);
244             final Date date = calendar.getTime();
245             assertTrue(validator.isValid(patternValid[i], "HH-mm-ss"), () -> "isValid() " + text);
246             assertEquals(patternExpect[i], date, () -> "compare " + text);
247         }
248     }
249 
250     /**
251      * Test time zone methods.
252      */
253     @Test
254     public void testTimeZone() {
255         // Set the default Locale & TimeZone
256         Locale.setDefault(Locale.UK);
257         TimeZone.setDefault(GMT);
258 
259         Calendar result;
260 
261         // Default Locale, Default TimeZone
262         result = validator.validate("18:01");
263         assertNotNull(result, "default result");
264         assertEquals(GMT, result.getTimeZone(), "default zone");
265         assertEquals(18, result.get(Calendar.HOUR_OF_DAY), "default hour");
266         assertEquals(01, result.get(Calendar.MINUTE), "default minute");
267         result = null;
268 
269         // Default Locale, diff TimeZone
270         result = validator.validate("16:49", EST);
271         assertNotNull(result, "zone result");
272         assertEquals(EST, result.getTimeZone(), "zone zone");
273         assertEquals(16, result.get(Calendar.HOUR_OF_DAY), "zone hour");
274         assertEquals(49, result.get(Calendar.MINUTE), "zone minute");
275         result = null;
276 
277         // Pattern, diff TimeZone
278         result = validator.validate("14-34", "HH-mm", EST);
279         assertNotNull(result, "pattern result");
280         assertEquals(EST, result.getTimeZone(), "pattern zone");
281         assertEquals(14, result.get(Calendar.HOUR_OF_DAY), "pattern hour");
282         assertEquals(34, result.get(Calendar.MINUTE), "pattern minute");
283         result = null;
284 
285         // Locale, diff TimeZone
286         result = validator.validate("7:18 PM", Locale.US, EST);
287         assertNotNull(result, "locale result");
288         assertEquals(EST, result.getTimeZone(), "locale zone");
289         assertEquals(19, result.get(Calendar.HOUR_OF_DAY), "locale hour");
290         assertEquals(18, result.get(Calendar.MINUTE), "locale minute");
291         result = null;
292 
293         // Locale & Pattern, diff TimeZone
294         result = validator.validate("31/Dez/05 21-05", "dd/MMM/yy HH-mm", Locale.GERMAN, EST);
295         assertNotNull(result, "pattern result");
296         assertEquals(EST, result.getTimeZone(), "pattern zone");
297         assertEquals(2005, result.get(Calendar.YEAR), "pattern day");
298         assertEquals(11, result.get(Calendar.MONTH), "pattern day"); // months are 0-11
299         assertEquals(31, result.get(Calendar.DATE), "pattern day");
300         assertEquals(21, result.get(Calendar.HOUR_OF_DAY), "pattern hour");
301         assertEquals(05, result.get(Calendar.MINUTE), "pattern minute");
302         result = null;
303 
304         // Locale & Pattern, default TimeZone
305         result = validator.validate("31/Dez/05 21-05", "dd/MMM/yy HH-mm", Locale.GERMAN);
306         assertNotNull(result, "pattern result");
307         assertEquals(GMT, result.getTimeZone(), "pattern zone");
308         assertEquals(2005, result.get(Calendar.YEAR), "pattern day");
309         assertEquals(11, result.get(Calendar.MONTH), "pattern day"); // months are 0-11
310         assertEquals(31, result.get(Calendar.DATE), "pattern day");
311         assertEquals(21, result.get(Calendar.HOUR_OF_DAY), "pattern hour");
312         assertEquals(05, result.get(Calendar.MINUTE), "pattern minute");
313         result = null;
314 
315     }
316 }