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 }