View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.trinidad.convert;
20  
21  import java.util.Calendar;
22  import java.util.Date;
23  import java.util.GregorianCalendar;
24  import java.util.HashMap;
25  import java.util.Locale;
26  import java.util.TimeZone;
27  
28  import javax.faces.component.UIComponent;
29  import javax.faces.convert.ConverterException;
30  
31  import org.apache.myfaces.trinidad.convert.ConverterTestCase;
32  import org.apache.myfaces.trinidadbuild.test.MockUIComponentWrapper;
33  import org.jmock.Mock;
34  
35  /**
36   * Test DateTimeConverter
37   * @version $Name: $ ($version: $) $Date: 16-aug-2005.15:12:23 $
38   */
39  public abstract class DateTimeConverterTestCase extends ConverterTestCase
40  {
41    public DateTimeConverterTestCase(String testName)
42    {
43      super(testName);
44    }
45    
46    /**
47     * @todo once all test case work fine - we can move all in to one method
48     */
49    public void testCommonScenarios()
50    {
51      // FILED BUG ON JSF ID : 358594
52      //checkNullComponent(); // FAILING - early checking not done
53      //checkNullContext();   // FAILING - early checking not done
54  
55      // Failing since i have set locale to be null
56      // look for it in the faces context using getCurrentInstance()
57      // FAILING - same locale problem. :-( - temp fix for now
58      checkStateHolderSaveRestore();
59  
60      checkEquals(); // FAILING - same locale problem. :-( - temp fix for now
61      checkGetAsObject();
62      checkConversionOnLongPatternWithTimeZone();
63      checkDatesForPatternBasedChecks();
64      checkDateStyleValidity();
65      checkTimeStyleValidity();
66      doTestBlankValue(getDateTimeConverter());
67    }
68  
69    /**
70     * Tests that null returns immediately.
71     *
72     * @throws ConverterException  when test fails
73     */
74    protected void checkNullInputValue() throws ConverterException
75    {
76      Mock mock = mock(UIComponent.class);
77      UIComponent component = (UIComponent) mock.proxy();
78      MockUIComponentWrapper wrapper = new MockUIComponentWrapper(mock, component);
79  
80      javax.faces.convert.DateTimeConverter converter  = getDateTimeConverter();
81  
82      doTestNull(facesContext, wrapper, converter);
83    }
84  
85    /**
86     * Test when context is set to null
87     */
88    protected void checkNullContext()
89    {
90      Mock mock = mock(UIComponent.class);
91      UIComponent component = (UIComponent) mock.proxy();
92      MockUIComponentWrapper wrapper = new MockUIComponentWrapper(mock, component);
93      javax.faces.convert.DateTimeConverter converter = getDateTimeConverter();
94  
95      doTestNullContext(wrapper, converter);
96    }
97  
98    protected void checkNullComponent()
99    {
100     javax.faces.convert.DateTimeConverter converter  = getDateTimeConverter();
101 
102     doTestNullComponent(facesContext, converter);
103   }
104 
105   /**
106    * Test for equality of converters
107    */
108   protected void checkEquals()
109   {
110 
111     javax.faces.convert.DateTimeConverter converter      = getDateTimeConverter();
112     javax.faces.convert.DateTimeConverter otherConverter = getDateTimeConverter();
113 
114     /**
115      * @todo fix this up - Do not delete
116      */
117     // COMMENTING OF SINCE FACES CONVERTER LOOKS IN TO THE VIEW ROOT FOR
118     // LOCALE WHEN THE LOCALE IS NULL IN ITS getLocale() method.
119     // doTestEquals(converter, otherConverter, true);
120 
121 
122     for (int i = 0; i < _DATE_STYLES.length; i++)
123     {
124       converter.setDateStyle(_DATE_STYLES[i]);
125       otherConverter.setDateStyle(_DATE_STYLES[i]);
126 
127       /**
128        * @todo fix this up - Do not delete
129        */
130       // COMMENTING OF SINCE FACES CONVERTER LOOKS IN TO THE VIEW ROOT FOR
131       // LOCALE WHEN THE LOCALE IS NULL IN ITS getLocale() method.
132       //doTestEquals(converter, otherConverter, true);
133 
134       converter.setLocale(_LOCALES[i]);
135       otherConverter.setLocale(_LOCALES[i]);
136       doTestEquals(converter, otherConverter, true);
137 
138       converter.setPattern(_PATTERNS[i]);
139       otherConverter.setPattern(_PATTERNS[i]);
140       doTestEquals(converter, otherConverter, true);
141 
142       converter.setTimeStyle(_TIME_STYLES[i]);
143       otherConverter.setTimeStyle(_TIME_STYLES[i]);
144       doTestEquals(converter, otherConverter, true);
145 
146       converter.setTimeZone(_TIME_ZONES[i]);
147       otherConverter.setTimeZone(_TIME_ZONES[i]);
148       doTestEquals(converter, otherConverter, true);
149 
150       converter.setType(_TYPES[i]);
151       otherConverter.setType(_TYPES[i]);
152       doTestEquals(converter, otherConverter, true);
153 
154       String secPattern = _SECONDARY_PATTERNS[i];
155       setSecondaryPattern(converter, secPattern);
156       setSecondaryPattern(otherConverter, secPattern);
157       doTestEquals(converter, otherConverter, true);
158 
159 
160       converter.setTransient(_TRANSIENT_VALUES[i]);
161       otherConverter.setTransient(_TRANSIENT_VALUES[i]);
162       doTestEquals(converter, otherConverter, true);
163     }
164   }
165 
166   /**
167    * Tests that dates after the date range cause a ValidationException.
168    */
169   protected void checkStateHolderSaveRestore()
170   {
171 
172     javax.faces.convert.DateTimeConverter converter = getDateTimeConverter();
173     Mock mock = mock(UIComponent.class);
174     UIComponent component = (UIComponent) mock.proxy();
175     MockUIComponentWrapper wrapper = new MockUIComponentWrapper(mock, component);
176 
177     javax.faces.convert.DateTimeConverter restoreConverter = getDateTimeConverter();
178 
179     for (int i = 0; i < _DATE_STYLES.length; i++)
180     {
181       converter.setDateStyle(_DATE_STYLES[i]);
182       restoreConverter.setDateStyle(_DATE_STYLES[i]);
183 
184        /**
185        * @todo fix this up - Do not delete
186        */
187       // COMMENTING OF SINCE FACES CONVERTER LOOKS IN TO THE VIEW ROOT FOR
188       // LOCALE WHEN THE LOCALE IS NULL IN ITS getLocale() method.
189       // doTestStateHolderSaveRestore(converter, restoreConverter,
190       //                           context, component);
191       converter.setLocale(_LOCALES[i]);
192       restoreConverter.setLocale(_LOCALES[i]);
193       doTestStateHolderSaveRestore(converter, restoreConverter,
194                                  facesContext, wrapper);
195 
196       converter.setPattern(_PATTERNS[i]);
197       restoreConverter.setPattern(_PATTERNS[i]);
198       doTestStateHolderSaveRestore(converter, restoreConverter,
199                                  facesContext, wrapper);
200 
201       converter.setTimeStyle(_TIME_STYLES[i]);
202       restoreConverter.setTimeStyle(_TIME_STYLES[i]);
203       doTestStateHolderSaveRestore(converter, restoreConverter,
204                                  facesContext, wrapper);
205 
206       converter.setTimeZone(_TIME_ZONES[i]);
207       restoreConverter.setTimeZone(_TIME_ZONES[i]);
208       doTestStateHolderSaveRestore(converter, restoreConverter,
209                                  facesContext, wrapper);
210 
211       converter.setType(_TYPES[i]);
212       restoreConverter.setType(_TYPES[i]);
213       doTestStateHolderSaveRestore(converter, restoreConverter,
214                                  facesContext, wrapper);
215 
216       String secPattern = _SECONDARY_PATTERNS[i];
217       setSecondaryPattern(converter, secPattern);
218       setSecondaryPattern(restoreConverter, secPattern);
219 
220       doTestStateHolderSaveRestore(converter, restoreConverter,
221                                    facesContext, wrapper);
222 
223       converter.setTransient(_TRANSIENT_VALUES[i]);
224       restoreConverter.setTransient(_TRANSIENT_VALUES[i]);
225       doTestStateHolderSaveRestore(converter, restoreConverter,
226                                  facesContext, wrapper);
227       mock.verify();
228     }
229   }
230 
231   protected void checkGetAsObject()
232   {
233     for (int i = 0; i < _SDATE_STYLES.length; ++i)
234     {
235       javax.faces.convert.DateTimeConverter dtConv = getDateTimeConverter();
236 
237       dtConv.setDateStyle(_SDATE_STYLES[i]);
238       dtConv.setLocale(_SLOCALES[i]);
239       dtConv.setPattern(_SPATTERNS[i]);
240       setSecondaryPattern(dtConv, _SSECONDARY_PATTERNS[i]);
241       dtConv.setTimeStyle(_STIME_STYLES[i]);
242       dtConv.setTimeZone(_STIME_ZONES[i]);
243       dtConv.setType(_STYPES[i]);
244 
245       Mock mock = mock(UIComponent.class);
246       UIComponent component = (UIComponent) mock.proxy();
247       
248       setFacesContext(facesContext);
249       try
250       {
251         Date obj = (Date)dtConv.getAsObject(facesContext, component, _SINPUT_VALUES[i]);
252         assertEquals(true, isEqual(obj,_SEXPECTED_DATES[i]));
253       }
254       finally
255       {
256         setFacesContext(null);
257       }
258 
259       mock.verify();
260    }
261   }
262 
263   protected void checkConversionOnLongPatternWithTimeZone()
264   {
265     String pattern    = "yyyy.MM.dd G 'at' HH:mm:ss z";
266     String inputValue = "2001.07.04 AD at 12:08:56 " + "UTC";
267 
268     javax.faces.convert.DateTimeConverter dtConv = getDateTimeConverter();
269     dtConv.setTimeZone(null);
270     dtConv.setPattern(pattern);
271 
272     Mock mock = mock(UIComponent.class);
273     UIComponent component = (UIComponent) mock.proxy();
274 
275     TimeZone.setDefault(getTzone("UTC"));
276 
277     GregorianCalendar gcal = new GregorianCalendar(getTzone("UTC"));
278     gcal.set(2001,6,4,12,8,56);
279 
280     setFacesContext(facesContext);
281     facesContext.getViewRoot().setLocale(Locale.ENGLISH);
282 
283     try
284     {
285       Date dt = (Date) dtConv.getAsObject(facesContext, component, inputValue);
286       Date expectedDt = gcal.getTime();
287       assertEquals(true, isEqual(dt, expectedDt));
288     }
289     finally
290     {
291       setFacesContext(null);
292     }
293  }
294 
295   protected void checkDatesForPatternBasedChecks()
296   {
297     // check for conversion of Date --> pattern and pattern --> Date
298     // Check if TimeZone set on the converter is honoured.
299     // Check if locale set on the converter is honoured
300     // Check if locale set on the ViewRoot is honoured
301     //2001.07.04 AD at 12:08:56 GMT
302 
303     // Prepare a date object to be used for testing.
304     GregorianCalendar gcal = new GregorianCalendar();
305     gcal.set(2001,Calendar.JULY,4,12,8,56);
306 
307     gcal.setTimeZone(getTzone("GMT"));
308     // Make use of this date for testing.
309     Date date = gcal.getTime();
310 
311     // set of values for testing
312     Object[][] patternBasedValues
313       = {
314           // pattern, Locale, TimeZone, Expected Pattern
315           {"yyyy.MM.dd G 'at' HH:mm:ss z",Locale.GERMAN, getTzone("GMT"),"2001.07.04 n. Chr. at 12:08:56 GMT"},
316           {"yyyy.MM.dd G 'at' HH:mm:ss z",Locale.ENGLISH, getTzone("GMT"),"2001.07.04 AD at 12:08:56 GMT"},
317           // Set the locale to null and see if it is picked up from the view root
318           {"yyyy.MM.dd G 'at' HH:mm:ss z",null, getTzone("GMT"),"2001.07.04 n. Chr. at 12:08:56 GMT"},
319         };
320 
321     for (int i = 0; i < patternBasedValues.length; i++)
322     {
323 
324       Mock mock = mock(UIComponent.class);
325       UIComponent component = (UIComponent) mock.proxy();
326 
327       javax.faces.convert.DateTimeConverter fdtConv
328         = getDateTimeConverter();
329 
330       fdtConv.setPattern((String)patternBasedValues[i][0]);
331       fdtConv.setTimeZone((TimeZone)patternBasedValues[i][2]);
332 
333       Locale loc = (Locale)patternBasedValues[i][1];
334       fdtConv.setLocale((Locale)patternBasedValues[i][1]);
335 
336       setFacesContext(facesContext);
337       // This mainly to set  up the locale on the view root and see if the
338       // locale is indeed picked up from the view root
339       if (loc == null)
340       {
341         facesContext.getViewRoot().setLocale(Locale.GERMAN);
342       }
343 
344       try
345       {
346         String fobtPattern = fdtConv.getAsString(facesContext, component, date);
347         
348         assertEquals(patternBasedValues[i][3], fobtPattern);
349         
350         Date fdt = (Date)fdtConv.getAsObject(facesContext, component, fobtPattern);
351         
352         /**
353          * @todo to find - why we get this millisecond difference
354          */
355         assertEquals(true, isEqual(date, fdt));
356       }
357       finally
358       {
359         setFacesContext(null);
360       }
361       mock.verify();
362     }
363   }
364 
365   protected void checkDateStyleValidity()
366   {
367     String[] dateStyles = {"short", "medium", "default", "long", "full",};
368     doTestStyleValidity(_DATE_STYLE, dateStyles);
369   }
370 
371   protected void checkTimeStyleValidity()
372   {
373     String[] timeStyles = {"short", "medium", "default", "long", "full",};
374     doTestStyleValidity(_TIME_STYLE, timeStyles);
375   }
376 
377   protected void doTestStyleValidity(int styleType, String[] styles) //OK
378   {
379     /* =-=FIXME AdamWiner having troubles getting this test to run now that 
380        JSF 1.2 sometimes calls getAttributes(), getValueBinding(),
381        and getClientId()
382        
383     Date dt = new Date(0);
384     for (int i = 0; i < styles.length; i++)
385     {
386       // by default dateStyle is shortish and type is date
387 
388       javax.faces.convert.DateTimeConverter dtConv = getDateTimeConverter();
389       Mock mock = mock(UIComponent.class);
390       // Give getAttributes() a return value, getValueBinding(), and
391       // getClientId() return values
392       mock.expects(atLeastOnce()).method("getAttributes").withNoArguments().will(returnValue(new HashMap()));
393       mock.expects(atLeastOnce()).method("getValueBinding").withAnyArguments().will(returnValue(null));
394       mock.expects(atLeastOnce()).method("getClientId").withAnyArguments().will(returnValue("fooId"));
395 
396       UIComponent component = (UIComponent) mock.proxy();
397 
398       _setStyleOnConverter(dtConv, styleType, styles[i]);
399 
400       dtConv.setLocale(Locale.ENGLISH);
401       setFacesContext(facesContext);
402       try
403       {
404         String out =  dtConv.getAsString(facesContext, component, dt);
405         assertEquals(true, (out != null));
406       }
407       finally
408       {
409         setFacesContext(null);
410       }
411 
412       // =-=FIXME AdamWiner the invocations are not necessarily
413       // asLeastOnce() - should we be using MockUIComponent from Shale here?
414       //      mock.verify();
415 
416       Mock mok = mock(UIComponent.class);
417       // Give getAttributes() a return value, getValueBinding(), and
418       // getClientId() return values
419       mok.expects(atLeastOnce()).method("getAttributes").withNoArguments().will(returnValue(new HashMap()));
420       mok.expects(atLeastOnce()).method("getValueBinding").withAnyArguments().will(returnValue(null));
421       mok.expects(atLeastOnce()).method("getClientId").withAnyArguments().will(returnValue("fooId"));
422       UIComponent cmp = (UIComponent) mok.proxy();
423 
424       setFacesContext(facesContext);
425       try
426       {
427         try
428         {
429           javax.faces.convert.DateTimeConverter extDtConv = getDateTimeConverter();
430           extDtConv.setLocale(Locale.ENGLISH);
431           _setStyleOnConverter(extDtConv, styleType, styles[i].toUpperCase());
432           extDtConv.getAsString(facesContext, cmp, dt);
433           fail("Upper case not accepted for styles");
434         }
435         catch (RuntimeException ce)
436         {
437           // Expected
438         }
439       }
440       finally
441       {
442         setFacesContext(null);
443       }
444 
445       // =-=FIXME AdamWiner the invocations are not necessarily
446       // asLeastOnce() - should we be using MockUIComponent from Shale here?
447       //      mok.verify();
448     }
449     */
450   }
451 
452   protected abstract javax.faces.convert.DateTimeConverter getDateTimeConverter();
453 
454   protected abstract void setSecondaryPattern(
455     javax.faces.convert.DateTimeConverter converter,
456     String secondaryPattern );
457 
458   protected static TimeZone getTzone(String timeZoneId)
459   {
460     return TimeZone.getTimeZone(timeZoneId);
461   }
462 
463   /**
464    * @todo have to solve the milli second problem that which is there.!!
465    * @param convDate
466    * @param expectedDate
467    * @return
468    */
469   @SuppressWarnings("deprecation")
470   protected static boolean isEqual(Date convDate, Date expectedDate)
471   {
472     GregorianCalendar convGcal = new GregorianCalendar();
473     convGcal.setTime(convDate);
474 
475     GregorianCalendar expGcal = new GregorianCalendar();
476     expGcal.setTime(expectedDate);
477 
478     // -= Simon Lessard =-
479     // FIXME: Switch to Calendar methods
480     return
481       (convDate.getSeconds() == expectedDate.getSeconds()) &&
482       (convDate.getYear()    == expectedDate.getYear())    &&
483       (convDate.getMonth()   == expectedDate.getMonth())   &&
484       (convDate.getDate()    == expectedDate.getDate())    &&
485       (convDate.getHours()   == expectedDate.getHours())   &&
486       (convDate.getMinutes() == expectedDate.getMinutes()) ;
487   }
488 
489 
490   private static void _setStyleOnConverter(
491     javax.faces.convert.DateTimeConverter dtConv,
492     int styleType,
493     String style
494     )
495   {
496     if (_DATE_STYLE == styleType)
497       {
498         dtConv.setDateStyle(style);
499       }
500       else if (_TIME_STYLE == styleType)
501       {
502         dtConv.setTimeStyle(style);
503         dtConv.setType("time");
504       }
505       else
506       {
507         throw new IllegalArgumentException("Invalid style id");
508       }
509   }
510 
511   private static Date[] _getDates(
512     Locale[] locales,
513     TimeZone[] timeZones,
514     int[] day,
515     int[] month,
516     int[] year,
517     int[] hours,
518     int[] mins,
519     int[] secs
520     )
521   {
522     Date[] dates = new Date[timeZones.length];
523     for (int i = 0; i < timeZones.length; ++i)
524     {
525       GregorianCalendar gcal = new GregorianCalendar();
526       gcal.set(year[i],month[i],day[i],hours[i],mins[i],secs[i]);
527       gcal.setTimeZone(timeZones[i]);
528       dates[i] = gcal.getTime();
529     }
530     return dates;
531   }
532 
533   protected static final int _TIME_STYLE = 0;
534 
535   protected static final int _DATE_STYLE = 1;
536 
537 
538   // Values for positive test cases
539   private static String[] _DATE_STYLES = {
540                                            "short",
541                                            "shortish",
542                                            "default",
543                                            "medium",
544                                            "full",
545                                            "long",
546                                            "shortish",
547                                            "long",
548                                            null
549                                         };
550 
551   private static Locale[] _LOCALES   = {
552                                           Locale.US,
553                                           Locale.CANADA,
554                                           Locale.CANADA_FRENCH,
555                                           Locale.TRADITIONAL_CHINESE,
556                                           Locale.GERMAN,
557                                           Locale.ENGLISH,  // set view root and check
558                                           Locale.KOREAN,
559                                           new Locale("en","","ORACLE10G"),
560                                           new Locale("en","us","ORACLE10G")
561                                         };
562 
563   private static String[] _PATTERNS = {
564                                          null,
565                                          "yyyy.MM.dd G 'at' HH:mm:ss z",
566                                          "EEE, MMM d, ''yy",
567                                          "h:mm a",
568                                          "hh 'o''clock' a, zzzz",
569                                          "K:mm a, z",
570                                          "yyyyy.MMMMM.dd GGG hh:mm aaa",
571                                          "EEE, d MMM yyyy HH:mm:ss Z",
572                                          "yyMMddHHmmssZ",
573                                       };
574 
575   private String[] _TIME_STYLES =  {
576                                      "short",
577                                      "default",
578                                      "default",
579                                      "medium",
580                                      "fullx",     // wrong value set by purpose
581                                      "long",
582                                      null,
583                                      "long",
584                                      null
585                                    };
586 
587   private static TimeZone[] _TIME_ZONES = {
588                                             getTzone("GMT"), //null,  i want this to be null
589                                             getTzone("GMT-8:00"),
590                                             getTzone("GMT+8:00"),
591                                             getTzone("GMT-23:59"),
592                                             getTzone("GMT-23:00"),
593                                             getTzone("GMT-9:00"),
594                                             getTzone("GMT-5:30"),
595                                             getTzone("GMT+23:59"),
596                                             getTzone("GMT-01:05"),
597                                           };
598 
599   private static String[] _TYPES = {
600                                      "date",
601                                      "both",
602                                      "null",    // set by purpose
603                                      null,
604                                      "invalid", // set by purpose
605                                      "time",
606                                      "date",
607                                      "both",
608                                      "date"
609                                    };
610 
611   private String[] _SECONDARY_PATTERNS = {
612                                            null,
613                                            "yyyy/MM/dd G 'at' HH:mm:ss z",
614                                            "YYYY/EEE/dd HH:mm:ss Z",
615                                            "yyyy-mm-dd G",
616                                            "HH:mm:ss",
617                                            "MMM/dd/yy",
618                                            "EEE MMM dd YYYY",
619                                            "dd-MMM-yy",
620                                            null
621                                         };
622 
623     private boolean[] _TRANSIENT_VALUES =  {
624                                            true,
625                                            false,
626                                            false,
627                                            true,
628                                            true,
629                                            false,
630                                            true,
631                                            true,
632                                            true
633                                          };
634 
635 
636 //   Values for test case
637 //   PREFIX _S stands for Success. These test data should result in success
638   private static String[] _SDATE_STYLES = {
639                                            "medium",       // Run based on primary pattern //0
640                                            "long",         // Run based on long date style //2
641                                            "long",         // Test on Date And Time
642                /* M/d/yyyy */              "medium"       //  Run to check if medium works on date //6
643                                          };
644 
645   private static Locale[] _SLOCALES =    {
646                                            Locale.US,               //0
647                                            Locale.ENGLISH,          //2
648                                            Locale.ENGLISH,          //4
649                                            Locale.ENGLISH,          //6
650                                          };
651 
652   private static String[] _SPATTERNS =   {
653                                            "d/M/yyyy",             //0
654                                            null,                   //2
655                                            null,                   //4
656                                            null,                   //6
657                                          };
658 
659   private static String[] _STIME_STYLES = {
660                                            "long",                 //0
661                                            null,                   //2
662                                            "long",                 //4
663                                            "ADD TEST !",           //6
664                                          };
665 
666   private static TimeZone[] _STIME_ZONES = {
667                                             getTzone("GMT-8:00"),    //0
668                                             getTzone("GMT-4:00"),    //2
669                                             getTzone("GMT"),         //4
670                                             getTzone("GMT-4:00")     //6
671                                           };
672 
673   private static String[] _STYPES =       {
674                                             "date",                   //0
675                                             "date",                   //2
676                                             "both",                   //4
677                                             "date"                    //6
678                                           };
679 
680   private static String[] _SSECONDARY_PATTERNS = {
681                                                   "dd/M/yy",           //0
682                                                   null,                //2
683                                                   "dd-M-yyyy",         //4
684                                                   "ADD TEST !"         //6
685                                                 };
686 
687 
688   private static String[] _SINPUT_VALUES    =    {
689                                                   "9/1/2001",               //0
690                                                   "February 12, 1952",      //2
691                                                   "July 7, 2001 1:08:56 AM GMT",  //4
692                                                   "Sep 06, 1972"            //6
693                                                 };
694 
695   private static  int[] _DAYS              = {
696                                                9,         //0
697                                                12,        //2
698                                                7,         //4
699                                                6,         //6
700                                              };
701 
702 
703   private static  int[] _MONTHS = {
704                                     Calendar.JANUARY,    //0
705                                     Calendar.FEBRUARY,   //2
706                                     Calendar.JULY,       //4
707                                     Calendar.SEPTEMBER,  //6
708                                   };
709 
710 
711   private static int[] _YEARS   = {
712                                    2001,                //0
713                                    1952,                //2
714                                    2001,                //4
715                                    1972,                //6
716                                   };
717 
718   private static int[] _HOURS = {
719                                   0, //0
720                                   0, //2
721                                   1, //4
722                                   0, //6
723                                   };
724 
725   private static int[] _MINS  =   {
726                                     0,  //0
727                                     0,  //2
728                                     8,  //4
729                                     0,  //6
730                                   };
731 
732   private static int[] _SECS  =   {
733                                     0,  //0
734                                     0,  //2
735                                     56, //4
736                                     0,  //6
737                                   };
738 
739   private static Date[]  _SEXPECTED_DATES
740     = _getDates(_SLOCALES,_STIME_ZONES, _DAYS,_MONTHS, _YEARS, _HOURS, _MINS, _SECS);
741 
742 }