1
2/********************************************************************
3 * COPYRIGHT:
4 * Copyright (c) 1997-2013, International Business Machines Corporation and
5 * others. All Rights Reserved.
6 ********************************************************************/
7
8#include "unicode/utypes.h"
9
10#if !UCONFIG_NO_FORMATTING
11
12
13//TODO: define it in compiler flag
14//#define DTIFMTTS_DEBUG 1
15
16
17#ifdef DTIFMTTS_DEBUG
18#include <iostream>
19#endif
20
21
22#include "cstring.h"
23#include "dtifmtts.h"
24#include "unicode/gregocal.h"
25#include "unicode/dtintrv.h"
26#include "unicode/dtitvinf.h"
27#include "unicode/dtitvfmt.h"
28#include "unicode/localpointer.h"
29#include "unicode/timezone.h"
30
31
32
33#ifdef DTIFMTTS_DEBUG
34//#define PRINTMESG(msg) { std::cout << "(" << __FILE__ << ":" << __LINE__ << ") " << msg << "\n"; }
35#define PRINTMESG(msg) { std::cout << msg; }
36#endif
37
38#define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
39
40#include <stdio.h>
41
42
43void DateIntervalFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) {
44    if (exec) logln("TestSuite DateIntervalFormat");
45    switch (index) {
46        TESTCASE(0, testAPI);
47        TESTCASE(1, testFormat);
48        TESTCASE(2, testFormatUserDII);
49        TESTCASE(3, testSetIntervalPatternNoSideEffect);
50        TESTCASE(4, testYearFormats);
51        TESTCASE(5, testStress);
52        default: name = ""; break;
53    }
54}
55
56/**
57 * Test various generic API methods of DateIntervalFormat for API coverage.
58 */
59void DateIntervalFormatTest::testAPI() {
60
61    /* ====== Test create interval instance with default locale and skeleton
62     */
63    UErrorCode status = U_ZERO_ERROR;
64    logln("Testing DateIntervalFormat create instance with default locale and skeleton");
65
66    DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_MONTH_DAY, status);
67    if(U_FAILURE(status)) {
68        dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + default locale) - exitting");
69        return;
70    } else {
71        delete dtitvfmt;
72    }
73
74
75    /* ====== Test create interval instance with given locale and skeleton
76     */
77    status = U_ZERO_ERROR;
78    logln("Testing DateIntervalFormat create instance with given locale and skeleton");
79
80    dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_MONTH_DAY, Locale::getJapanese(), status);
81    if(U_FAILURE(status)) {
82        dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + locale) - exitting");
83        return;
84    } else {
85        delete dtitvfmt;
86    }
87
88
89    /* ====== Test create interval instance with dateIntervalInfo and skeleton
90     */
91    status = U_ZERO_ERROR;
92    logln("Testing DateIntervalFormat create instance with dateIntervalInfo  and skeleton");
93
94    DateIntervalInfo* dtitvinf = new DateIntervalInfo(Locale::getSimplifiedChinese(), status);
95
96    dtitvfmt = DateIntervalFormat::createInstance("EEEdMMMyhms", *dtitvinf, status);
97    delete dtitvinf;
98
99    if(U_FAILURE(status)) {
100        dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + DateIntervalInfo + default locale) - exitting");
101        return;
102    } else {
103        delete dtitvfmt;
104    }
105
106
107    /* ====== Test create interval instance with dateIntervalInfo and skeleton
108     */
109    status = U_ZERO_ERROR;
110    logln("Testing DateIntervalFormat create instance with dateIntervalInfo  and skeleton");
111
112    dtitvinf = new DateIntervalInfo(Locale::getSimplifiedChinese(), status);
113
114    dtitvfmt = DateIntervalFormat::createInstance("EEEdMMMyhms", Locale::getSimplifiedChinese(), *dtitvinf, status);
115    delete dtitvinf;
116    if(U_FAILURE(status)) {
117        dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + DateIntervalInfo + locale) - exitting");
118        return;
119    }
120    // not deleted, test clone
121
122
123    // ====== Test clone()
124    status = U_ZERO_ERROR;
125    logln("Testing DateIntervalFormat clone");
126
127    DateIntervalFormat* another = (DateIntervalFormat*)dtitvfmt->clone();
128    if ( (*another) != (*dtitvfmt) ) {
129        dataerrln("ERROR: clone failed");
130    }
131
132
133    // ====== Test getDateIntervalInfo, setDateIntervalInfo, adoptDateIntervalInfo
134    status = U_ZERO_ERROR;
135    logln("Testing DateIntervalFormat getDateIntervalInfo");
136    const DateIntervalInfo* inf = another->getDateIntervalInfo();
137    dtitvfmt->setDateIntervalInfo(*inf, status);
138    const DateIntervalInfo* anotherInf = dtitvfmt->getDateIntervalInfo();
139    if ( (*inf) != (*anotherInf) || U_FAILURE(status) ) {
140        dataerrln("ERROR: getDateIntervalInfo/setDateIntervalInfo failed");
141    }
142
143    {
144        // We make sure that setDateIntervalInfo does not corrupt the cache. See ticket 9919.
145        status = U_ZERO_ERROR;
146        logln("Testing DateIntervalFormat setDateIntervalInfo");
147        const Locale &enLocale = Locale::getEnglish();
148        LocalPointer<DateIntervalFormat> dif(DateIntervalFormat::createInstance("yMd", enLocale, status));
149        if (U_FAILURE(status)) {
150            errln("Failure encountered: %s", u_errorName(status));
151            return;
152        }
153        UnicodeString expected;
154        LocalPointer<Calendar> fromTime(Calendar::createInstance(enLocale, status));
155        LocalPointer<Calendar> toTime(Calendar::createInstance(enLocale, status));
156        if (U_FAILURE(status)) {
157            errln("Failure encountered: %s", u_errorName(status));
158            return;
159        }
160        FieldPosition pos = 0;
161        fromTime->set(2013, 3, 26);
162        toTime->set(2013, 3, 28);
163        dif->format(*fromTime, *toTime, expected, pos, status);
164        if (U_FAILURE(status)) {
165            errln("Failure encountered: %s", u_errorName(status));
166            return;
167        }
168        LocalPointer<DateIntervalInfo> dii(new DateIntervalInfo(Locale::getEnglish(), status));
169        if (U_FAILURE(status)) {
170            errln("Failure encountered: %s", u_errorName(status));
171            return;
172        }
173        dii->setIntervalPattern(ctou("yMd"), UCAL_DATE, ctou("M/d/y \\u2013 d"), status);
174        dif->setDateIntervalInfo(*dii, status);
175        if (U_FAILURE(status)) {
176            errln("Failure encountered: %s", u_errorName(status));
177            return;
178        }
179        dif.adoptInstead(DateIntervalFormat::createInstance("yMd", enLocale, status));
180        if (U_FAILURE(status)) {
181            errln("Failure encountered: %s", u_errorName(status));
182            return;
183        }
184        UnicodeString actual;
185        pos = 0;
186        dif->format(*fromTime, *toTime, actual, pos, status);
187        if (U_FAILURE(status)) {
188            errln("Failure encountered: %s", u_errorName(status));
189            return;
190        }
191        if (expected != actual) {
192            errln("DateIntervalFormat.setIntervalInfo should have no side effects.");
193        }
194    }
195
196    /*
197    status = U_ZERO_ERROR;
198    DateIntervalInfo* nonConstInf = inf->clone();
199    dtitvfmt->adoptDateIntervalInfo(nonConstInf, status);
200    anotherInf = dtitvfmt->getDateIntervalInfo();
201    if ( (*inf) != (*anotherInf) || U_FAILURE(status) ) {
202        dataerrln("ERROR: adoptDateIntervalInfo failed");
203    }
204    */
205
206    // ====== Test getDateFormat, setDateFormat, adoptDateFormat
207
208    status = U_ZERO_ERROR;
209    logln("Testing DateIntervalFormat getDateFormat");
210    /*
211    const DateFormat* fmt = another->getDateFormat();
212    dtitvfmt->setDateFormat(*fmt, status);
213    const DateFormat* anotherFmt = dtitvfmt->getDateFormat();
214    if ( (*fmt) != (*anotherFmt) || U_FAILURE(status) ) {
215        dataerrln("ERROR: getDateFormat/setDateFormat failed");
216    }
217
218    status = U_ZERO_ERROR;
219    DateFormat* nonConstFmt = (DateFormat*)fmt->clone();
220    dtitvfmt->adoptDateFormat(nonConstFmt, status);
221    anotherFmt = dtitvfmt->getDateFormat();
222    if ( (*fmt) != (*anotherFmt) || U_FAILURE(status) ) {
223        dataerrln("ERROR: adoptDateFormat failed");
224    }
225    delete fmt;
226    */
227
228
229    // ======= Test getStaticClassID()
230
231    logln("Testing getStaticClassID()");
232
233
234    if(dtitvfmt->getDynamicClassID() != DateIntervalFormat::getStaticClassID()) {
235        errln("ERROR: getDynamicClassID() didn't return the expected value");
236    }
237
238    delete another;
239
240    // ====== test constructor/copy constructor and assignment
241    /* they are protected, no test
242    logln("Testing DateIntervalFormat constructor and assigment operator");
243    status = U_ZERO_ERROR;
244
245    DateFormat* constFmt = (constFmt*)dtitvfmt->getDateFormat()->clone();
246    inf = dtitvfmt->getDateIntervalInfo()->clone();
247
248
249    DateIntervalFormat* dtifmt = new DateIntervalFormat(fmt, inf, status);
250    if(U_FAILURE(status)) {
251        dataerrln("ERROR: Could not create DateIntervalFormat (default) - exitting");
252        return;
253    }
254
255    DateIntervalFormat* dtifmt2 = new(dtifmt);
256    if ( (*dtifmt) != (*dtifmt2) ) {
257        dataerrln("ERROR: Could not create DateIntervalFormat (default) - exitting");
258        return;
259    }
260
261    DateIntervalFormat dtifmt3 = (*dtifmt);
262    if ( (*dtifmt) != dtifmt3 ) {
263        dataerrln("ERROR: Could not create DateIntervalFormat (default) - exitting");
264        return;
265    }
266
267    delete dtifmt2;
268    delete dtifmt3;
269    delete dtifmt;
270    */
271
272
273    //===== test format and parse ==================
274    Formattable formattable;
275    formattable.setInt64(10);
276    UnicodeString res;
277    FieldPosition pos = 0;
278    status = U_ZERO_ERROR;
279    dtitvfmt->format(formattable, res, pos, status);
280    if ( status != U_ILLEGAL_ARGUMENT_ERROR ) {
281        dataerrln("ERROR: format non-date-interval object should set U_ILLEGAL_ARGUMENT_ERROR - exitting");
282        return;
283    }
284
285    DateInterval* dtitv = new DateInterval(3600*24*365, 3600*24*366);
286    formattable.adoptObject(dtitv);
287    res.remove();
288    pos = 0;
289    status = U_ZERO_ERROR;
290    dtitvfmt->format(formattable, res, pos, status);
291    if ( U_FAILURE(status) ) {
292        dataerrln("ERROR: format date interval failed - exitting");
293        return;
294    }
295
296    const DateFormat* dfmt = dtitvfmt->getDateFormat();
297    Calendar* fromCal = dfmt->getCalendar()->clone();
298    Calendar* toCal = dfmt->getCalendar()->clone();
299    res.remove();
300    pos = 0;
301    status = U_ZERO_ERROR;
302    dtitvfmt->format(*fromCal, *toCal, res, pos, status);
303    if ( U_FAILURE(status) ) {
304        dataerrln("ERROR: format date interval failed - exitting");
305        return;
306    }
307    delete fromCal;
308    delete toCal;
309
310
311    Formattable fmttable;
312    status = U_ZERO_ERROR;
313    // TODO: why do I need cast?
314    ((Format*)dtitvfmt)->parseObject(res, fmttable, status);
315    if ( status != U_INVALID_FORMAT_ERROR ) {
316        dataerrln("ERROR: parse should set U_INVALID_FORMAT_ERROR - exitting");
317        return;
318    }
319
320    delete dtitvfmt;
321
322    //====== test setting time zone
323    logln("Testing DateIntervalFormat set & format with different time zones, get time zone");
324    status = U_ZERO_ERROR;
325    dtitvfmt = DateIntervalFormat::createInstance("MMMdHHmm", Locale::getEnglish(), status);
326    if ( U_SUCCESS(status) ) {
327        UDate date1 = 1299090600000.0; // 2011-Mar-02 1030 in US/Pacific, 2011-Mar-03 0330 in Asia/Tokyo
328        UDate date2 = 1299115800000.0; // 2011-Mar-02 1730 in US/Pacific, 2011-Mar-03 1030 in Asia/Tokyo
329
330        DateInterval * dtitv12 = new DateInterval(date1, date2);
331        TimeZone * tzCalif = TimeZone::createTimeZone("US/Pacific");
332        TimeZone * tzTokyo = TimeZone::createTimeZone("Asia/Tokyo");
333        UnicodeString fmtCalif = UnicodeString(ctou("Mar 2, 10:30 \\u2013 17:30"));
334        UnicodeString fmtTokyo = UnicodeString(ctou("Mar 3, 03:30 \\u2013 10:30"));
335
336        dtitvfmt->adoptTimeZone(tzCalif);
337        res.remove();
338        pos = 0;
339        status = U_ZERO_ERROR;
340        dtitvfmt->format(dtitv12, res, pos, status);
341        if ( U_SUCCESS(status) ) {
342            if ( res.compare(fmtCalif) != 0 ) {
343                errln("ERROR: DateIntervalFormat::format for tzCalif, expect " + fmtCalif + ", get " + res);
344            }
345        } else {
346            errln("ERROR: DateIntervalFormat::format for tzCalif, status %s", u_errorName(status));
347        }
348
349        dtitvfmt->setTimeZone(*tzTokyo);
350        res.remove();
351        pos = 0;
352        status = U_ZERO_ERROR;
353        dtitvfmt->format(dtitv12, res, pos, status);
354        if ( U_SUCCESS(status) ) {
355            if ( res.compare(fmtTokyo) != 0 ) {
356                errln("ERROR: DateIntervalFormat::format for fmtTokyo, expect " + fmtTokyo + ", get " + res);
357            }
358        } else {
359            errln("ERROR: DateIntervalFormat::format for tzTokyo, status %s", u_errorName(status));
360        }
361
362        if ( dtitvfmt->getTimeZone() != *tzTokyo ) {
363            errln("ERROR: DateIntervalFormat::getTimeZone returns mismatch.");
364        }
365
366        delete tzTokyo; // tzCalif was owned by dtitvfmt which should have deleted it
367        delete dtitv12;
368        delete dtitvfmt;
369    } else {
370        errln("ERROR: DateIntervalFormat::createInstance(\"MdHH\", Locale::getEnglish(), ...), status %s", u_errorName(status));
371    }
372    //====== test format  in testFormat()
373
374    //====== test DateInterval class (better coverage)
375    DateInterval dtitv1(3600*24*365, 3600*24*366);
376    DateInterval dtitv2(dtitv1);
377
378    if (!(dtitv1 == dtitv2)) {
379        errln("ERROR: Copy constructor failed for DateInterval.");
380    }
381
382    DateInterval dtitv3(3600*365, 3600*366);
383    dtitv3 = dtitv1;
384    if (!(dtitv3 == dtitv1)) {
385        errln("ERROR: Equal operator failed for DateInterval.");
386    }
387
388    DateInterval *dtitv4 = dtitv1.clone();
389    if (*dtitv4 != dtitv1) {
390        errln("ERROR: Equal operator failed for DateInterval.");
391    }
392    delete dtitv4;
393}
394
395
396/**
397 * Test format
398 */
399void DateIntervalFormatTest::testFormat() {
400    // first item is date pattern
401    // followed by a group of locale/from_data/to_data/skeleton/interval_data
402    const char* DATA[] = {
403        "yyyy MM dd HH:mm:ss",
404        // test root
405        "root", "2007 11 10 10:10:10", "2007 12 10 10:10:10", "yM", "2007-11 \\u2013 2007-12",
406
407        // test 'H' and 'h', using availableFormat in fallback
408        "en", "2007 11 10 10:10:10", "2007 11 10 15:10:10", "Hms", "10:10:10 \\u2013 15:10:10",
409        "en", "2007 11 10 10:10:10", "2007 11 10 15:10:10", "hms", "10:10:10 AM \\u2013 3:10:10 PM",
410
411        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMM", "October 2007 \\u2013 October 2008",
412        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMM", "Oct 2007 \\u2013 Oct 2008",
413        // test skeleton with both date and time
414        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMyhm", "Nov 10, 2007, 10:10 AM \\u2013 Nov 20, 2007, 10:10 AM",
415
416        "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "dMMMyhm", "Nov 10, 2007, 10:10 \\u2013 11:10 AM",
417
418        "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "hms", "10:10:10 AM \\u2013 11:10:10 AM",
419        "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "Hms", "10:10:10 \\u2013 11:10:10",
420        "en", "2007 11 10 20:10:10", "2007 11 10 21:10:10", "Hms", "20:10:10 \\u2013 21:10:10",
421
422        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
423
424        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMMy", "October 10, 2007 \\u2013 October 10, 2008",
425
426        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMM", "October 10, 2007 \\u2013 October 10, 2008",
427
428        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMMy", "October 2007 \\u2013 October 2008",
429
430        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
431
432        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMMMy", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
433
434        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMy", "Oct 10, 2007 \\u2013 Oct 10, 2008",
435
436        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "Oct 10, 2007 \\u2013 Oct 10, 2008",
437
438        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Oct 2007 \\u2013 Oct 2008",
439
440        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMMM", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
441
442        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
443
444        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10/10/2007 \\u2013 10/10/2008",
445
446        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dM", "10/10/2007 \\u2013 10/10/2008",
447
448        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10/2007 \\u2013 10/2008",
449
450        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
451
452        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "d", "10/10/2007 \\u2013 10/10/2008",
453
454        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Ed", "10 Wed \\u2013 10 Fri",
455
456        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007 \\u2013 2008",
457
458        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10/2007 \\u2013 10/2008",
459
460
461
462        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hm", "10/10/2007, 10:10 AM \\u2013 10/10/2008, 10:10 AM",
463        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Hm", "10/10/2007, 10:10 \\u2013 10/10/2008, 10:10",
464        "en", "2007 10 10 20:10:10", "2008 10 10 20:10:10", "Hm", "10/10/2007, 20:10 \\u2013 10/10/2008, 20:10",
465
466        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hmv", "10/10/2007, 10:10 AM PT \\u2013 10/10/2008, 10:10 AM PT",
467
468        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hmz", "10/10/2007, 10:10 AM PDT \\u2013 10/10/2008, 10:10 AM PDT",
469
470        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "h", "10/10/2007, 10 AM \\u2013 10/10/2008, 10 AM",
471
472        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hv", "10/10/2007, 10 AM PT \\u2013 10/10/2008, 10 AM PT",
473
474        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hz", "10/10/2007, 10 AM PDT \\u2013 10/10/2008, 10 AM PDT",
475
476        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
477
478        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EddMMy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
479
480        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hhmm", "10/10/2007, 10:10 AM \\u2013 10/10/2008, 10:10 AM",
481
482        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hhmmzz", "10/10/2007, 10:10 AM PDT \\u2013 10/10/2008, 10:10 AM PDT",
483
484        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hms", "10/10/2007, 10:10:10 AM \\u2013 10/10/2008, 10:10:10 AM",
485
486        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMMMy", "O 10, 2007 \\u2013 O 10, 2008",
487
488        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEEdM", "W, 10/10/2007 \\u2013 F, 10/10/2008",
489
490        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10 \\u2013 Saturday, November 10, 2007",
491
492        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMy", "October 10 \\u2013 November 10, 2007",
493
494        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMM", "October 10 \\u2013 November 10",
495
496        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMMy", "October \\u2013 November 2007",
497
498        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10 \\u2013 Saturday, November 10",
499
500        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMMMy", "Wed, Oct 10 \\u2013 Sat, Nov 10, 2007",
501
502        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMy", "Oct 10 \\u2013 Nov 10, 2007",
503
504        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "Oct 10 \\u2013 Nov 10",
505
506        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Oct \\u2013 Nov 2007",
507
508        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMMM", "Wed, Oct 10 \\u2013 Sat, Nov 10",
509
510        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
511
512        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMy", "10/10/2007 \\u2013 11/10/2007",
513
514
515        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10/2007 \\u2013 11/2007",
516
517        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdM", "Wed, 10/10 \\u2013 Sat, 11/10",
518
519        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10/10 \\u2013 11/10",
520
521        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "Ed", "10 Wed \\u2013 10 Sat",
522
523        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "y", "2007",
524
525        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "M", "10 \\u2013 11",
526
527        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Oct \\u2013 Nov",
528
529        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMM", "October \\u2013 November",
530
531        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hm", "10/10/2007, 10:10 AM \\u2013 11/10/2007, 10:10 AM",
532        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "Hm", "10/10/2007, 10:10 \\u2013 11/10/2007, 10:10",
533        "en", "2007 10 10 20:10:10", "2007 11 10 20:10:10", "Hm", "10/10/2007, 20:10 \\u2013 11/10/2007, 20:10",
534
535        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmv", "10/10/2007, 10:10 AM PT \\u2013 11/10/2007, 10:10 AM PT",
536
537        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmz", "10/10/2007, 10:10 AM PDT \\u2013 11/10/2007, 10:10 AM PST",
538
539        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "h", "10/10/2007, 10 AM \\u2013 11/10/2007, 10 AM",
540
541        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hv", "10/10/2007, 10 AM PT \\u2013 11/10/2007, 10 AM PT",
542
543        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hz", "10/10/2007, 10 AM PDT \\u2013 11/10/2007, 10 AM PST",
544
545        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
546
547        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EddMMy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
548
549
550        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hhmmzz", "10/10/2007, 10:10 AM PDT \\u2013 11/10/2007, 10:10 AM PST",
551
552        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hms", "10/10/2007, 10:10:10 AM \\u2013 11/10/2007, 10:10:10 AM",
553
554        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMMy", "O 10 \\u2013 N 10, 2007",
555
556        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEEdM", "W, 10/10 \\u2013 S, 11/10",
557
558        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMMy", "Saturday, November 10 \\u2013 Tuesday, November 20, 2007",
559
560        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMy", "November 10 \\u2013 20, 2007",
561
562        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "November 10 \\u2013 20",
563
564
565        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMM", "Saturday, November 10 \\u2013 Tuesday, November 20",
566
567        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMMy", "Sat, Nov 10 \\u2013 Tue, Nov 20, 2007",
568
569        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMy", "Nov 10 \\u2013 20, 2007",
570
571        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMM", "Nov 10 \\u2013 20",
572
573        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov 2007",
574
575        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMM", "Sat, Nov 10 \\u2013 Tue, Nov 20",
576
577        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
578
579        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMy", "11/10/2007 \\u2013 11/20/2007",
580
581        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
582
583        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "11/2007",
584
585        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "Sat, 11/10 \\u2013 Tue, 11/20",
586
587        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10 \\u2013 20",
588
589        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Ed", "10 Sat \\u2013 20 Tue",
590
591        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007",
592
593        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11",
594
595        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMM", "Nov",
596
597        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMM", "November",
598
599        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hm", "11/10/2007, 10:10 AM \\u2013 11/20/2007, 10:10 AM",
600        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Hm", "11/10/2007, 10:10 \\u2013 11/20/2007, 10:10",
601        "en", "2007 11 10 20:10:10", "2007 11 20 20:10:10", "Hm", "11/10/2007, 20:10 \\u2013 11/20/2007, 20:10",
602
603        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmv", "11/10/2007, 10:10 AM PT \\u2013 11/20/2007, 10:10 AM PT",
604
605        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmz", "11/10/2007, 10:10 AM PST \\u2013 11/20/2007, 10:10 AM PST",
606
607        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "h", "11/10/2007, 10 AM \\u2013 11/20/2007, 10 AM",
608
609        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hv", "11/10/2007, 10 AM PT \\u2013 11/20/2007, 10 AM PT",
610
611        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hz", "11/10/2007, 10 AM PST \\u2013 11/20/2007, 10 AM PST",
612
613        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEddMMyyyy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
614
615        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EddMMy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
616
617        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hhmm", "11/10/2007, 10:10 AM \\u2013 11/20/2007, 10:10 AM",
618
619        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hhmmzz", "11/10/2007, 10:10 AM PST \\u2013 11/20/2007, 10:10 AM PST",
620
621        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hms", "11/10/2007, 10:10:10 AM \\u2013 11/20/2007, 10:10:10 AM",
622        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Hms", "11/10/2007, 10:10:10 \\u2013 11/20/2007, 10:10:10",
623        "en", "2007 11 10 20:10:10", "2007 11 20 20:10:10", "Hms", "11/10/2007, 20:10:10 \\u2013 11/20/2007, 20:10:10",
624
625        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMMy", "N 10 \\u2013 20, 2007",
626
627        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEEdM", "S, 11/10 \\u2013 T, 11/20",
628
629        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMMy", "Wednesday, January 10, 2007",
630
631        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMMy", "January 10, 2007",
632
633        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMM", "January 10",
634
635        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMMy", "January 2007",
636
637        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMM", "Wednesday, January 10",
638
639        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdMMMy", "Wed, Jan 10, 2007",
640
641        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMy", "Jan 10, 2007",
642
643        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "Jan 10",
644
645        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan 2007",
646
647        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdMMM", "Wed, Jan 10",
648
649
650        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMy", "1/10/2007",
651
652        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dM", "1/10",
653
654        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "My", "1/2007",
655
656        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdM", "Wed, 1/10",
657
658        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "d", "10",
659
660        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Ed", "10 Wed",
661
662        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "y", "2007",
663
664        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "M", "1",
665
666        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMM", "Jan",
667
668        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMM", "January",
669
670        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "10:00 AM \\u2013 2:10 PM",
671        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Hm", "10:00 \\u2013 14:10",
672
673        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmv", "10:00 AM \\u2013 2:10 PM PT",
674
675        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "10:00 AM \\u2013 2:10 PM PST",
676
677        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10 AM \\u2013 2 PM",
678        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "H", "10 \\u2013 14",
679
680
681        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hz", "10 AM \\u2013 2 PM PST",
682
683        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEddMMyyyy", "Wed, 01/10/2007",
684
685        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EddMMy", "Wed, 01/10/2007",
686
687        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hhmm", "10:00 AM \\u2013 2:10 PM",
688        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "HHmm", "10:00 \\u2013 14:10",
689
690        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hhmmzz", "10:00 AM \\u2013 2:10 PM PST",
691
692        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hms", "10:00:10 AM \\u2013 2:10:10 PM",
693        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Hms", "10:00:10 \\u2013 14:10:10",
694
695        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMMMy", "J 10, 2007",
696
697        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEEdM", "W, 1/10",
698        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMMy", "January 10, 2007",
699
700        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMM", "January 10",
701
702        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "MMMMy", "January 2007",
703
704        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMMM", "Wednesday, January 10",
705
706        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMMMy", "Wed, Jan 10, 2007",
707
708        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMy", "Jan 10, 2007",
709
710        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMM", "Jan 10",
711
712
713        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMMM", "Wed, Jan 10",
714
715        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMy", "Wed, 1/10/2007",
716
717        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMy", "1/10/2007",
718
719
720        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "My", "1/2007",
721
722        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdM", "Wed, 1/10",
723
724        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "d", "10",
725
726
727        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "y", "2007",
728
729        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "M", "1",
730
731
732
733        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "10:00 \\u2013 10:20 AM",
734        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "Hm", "10:00 \\u2013 10:20",
735
736
737        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmz", "10:00 \\u2013 10:20 AM PST",
738
739
740        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hv", "10 AM PT",
741
742
743
744        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EddMMy", "Wed, 01/10/2007",
745
746        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hhmm", "10:00 \\u2013 10:20 AM",
747        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "HHmm", "10:00 \\u2013 10:20",
748
749        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hhmmzz", "10:00 \\u2013 10:20 AM PST",
750
751
752        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMMMy", "J 10, 2007",
753
754
755        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMMy", "Wednesday, January 10, 2007",
756
757        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMMy", "January 10, 2007",
758
759
760        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "MMMMy", "January 2007",
761
762        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMM", "Wednesday, January 10",
763
764
765        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMy", "Jan 10, 2007",
766
767        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMM", "Jan 10",
768
769
770        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdMMM", "Wed, Jan 10",
771
772        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdMy", "Wed, 1/10/2007",
773
774        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMy", "1/10/2007",
775
776
777        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "My", "1/2007",
778
779        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdM", "Wed, 1/10",
780
781        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "d", "10",
782
783
784        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "y", "2007",
785
786        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "M", "1",
787
788
789        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "MMMM", "January",
790
791        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "10:10 AM",
792        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Hm", "10:10",
793
794
795        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 AM PST",
796
797        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "10 AM",
798
799        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hv", "10 AM PT",
800
801
802        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEddMMyyyy", "Wed, 01/10/2007",
803
804
805        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hhmm", "10:10 AM",
806        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "HHmm", "10:10",
807
808        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hhmmzz", "10:10 AM PST",
809
810
811        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMMMy", "J 10, 2007",
812
813        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEEdM", "W, 1/10",
814
815        "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u661f\\u671f\\u4e09\\u81f32008\\u5e7410\\u670810\\u65e5\\u661f\\u671f\\u4e94",
816
817
818        "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u81f311\\u670810\\u65e5",
819
820
821        "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMMy", "2007\\u5e7410\\u6708\\u81f311\\u6708",
822
823
824        "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmv", "2007/10/10 \\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810:10 \\u2013 2007/11/10 \\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810:10",
825
826        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMMy", "2007\\u5e7411\\u670810\\u65e5\\u661f\\u671f\\u516d\\u81f320\\u65e5\\u661f\\u671f\\u4e8c",
827
828
829        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "11\\u670810\\u65e5\\u81f320\\u65e5",
830
831        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMMy", "2007\\u5E7411\\u6708", // (fixed expected result per ticket:6626:)
832
833        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMM", "11\\u670810\\u65e5\\u661f\\u671f\\u516d\\u81f320\\u65e5\\u661f\\u671f\\u4e8c",
834
835
836        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "2007/11/10\\u5468\\u516d\\u81f32007/11/20\\u5468\\u4e8c",
837
838
839        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
840
841        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "2007/11",
842
843        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "11/10\\u5468\\u516d\\u81f311/20\\u5468\\u4e8c",
844
845
846        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007\\u5E74", // (fixed expected result per ticket:6626:)
847
848        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11\\u6708",
849
850        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMM", "11\\u6708", // (fixed expected result per ticket:6626: and others)
851
852
853        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmz", "2007/11/10 GMT-8\\u4e0a\\u534810:10 \\u2013 2007/11/20 GMT-8\\u4e0a\\u534810:10",
854
855        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "h", "2007/11/10 \\u4e0a\\u534810\\u65f6 \\u2013 2007/11/20 \\u4e0a\\u534810\\u65f6",
856
857        "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMMy", "2007\\u5e741\\u670810\\u65e5\\u661f\\u671f\\u4e09", // (fixed expected result per ticket:6626:)
858
859        "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
860
861
862        "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "GMT-8\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
863
864        "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "\\u4e0a\\u534810\\u65F6\\u81f3\\u4e0b\\u53482\\u65f6",
865
866        "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hv", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810\\u65F6\\u81F3\\u4E0B\\u53482\\u65F6",
867
868        "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "\\u4e0a\\u534810:00\\u81f310:20",
869
870        "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810:00\\u81F310:20",
871
872        "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "GMT-8\\u4e0a\\u534810\\u65f6",
873
874        "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "\\u4e0a\\u534810:10",
875
876        "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "\\u4e0a\\u534810\\u65f6",
877
878        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. 2007 - Freitag, 10. Okt. 2008",
879
880
881        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "10. Okt. 2007 - 10. Okt. 2008",
882
883        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Okt. 2007 - Okt. 2008",
884
885
886        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Mi., 10.10.2007 - Fr., 10.10.2008",
887
888        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10.10.2007 - 10.10.2008",
889
890
891        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10.2007 - 10.2008",
892
893        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Mi., 10.10.2007 - Fr., 10.10.2008",
894
895
896        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007-2008",
897
898        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10.2007 - 10.2008",
899
900
901        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hm", "10.10.2007 10:10 vorm. - 10.10.2008 10:10 vorm.",
902        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Hm", "10.10.2007 10:10 - 10.10.2008 10:10",
903
904        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. - Samstag, 10. Nov. 2007",
905
906
907        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "10. Okt. - 10. Nov.",
908
909        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Okt.-Nov. 2007",
910
911        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMM", "Mittwoch, 10. Okt. - Samstag, 10. Nov.",
912
913
914        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dM", "10.10. - 10.11.",
915
916        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10.2007 - 11.2007",
917
918
919        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10.10. - 10.11.",
920
921        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "y", "2007",
922
923
924        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Okt.-Nov.",
925
926
927        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hms", "10.10.2007 10:10:10 vorm. - 10.11.2007 10:10:10 vorm.",
928        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "Hms", "10.10.2007 10:10:10 - 10.11.2007 10:10:10",
929
930        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMy", "Samstag, 10. - Dienstag, 20. Nov. 2007",
931
932        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMy", "10.-20. Nov. 2007",
933
934
935        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov. 2007",
936
937        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMM", "Samstag, 10. - Dienstag, 20. Nov.",
938
939        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sa., 10.11.2007 - Di., 20.11.2007",
940
941
942        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "10.11. - 20.11.",
943
944        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "11.2007",
945
946
947        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10.-20.",
948
949        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007",
950
951
952        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmv", "10.11.2007 10:10 vorm. Los Angeles Zeit - 20.11.2007 10:10 vorm. Los Angeles Zeit",
953
954        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
955
956
957        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "10. Jan.",
958
959        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan. 2007",
960
961        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
962
963
964        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10 vorm. - 2 nachm.",
965        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "H", "10-14 Uhr",
966
967        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
968
969
970        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "10:00-10:20 vorm. Los Angeles Zeit",
971
972        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmz", "10:00-10:20 vorm. GMT-8",
973
974        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "h", "10 vorm.",
975        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "H", "10 Uhr",
976
977
978        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "10 vorm. GMT-8",
979
980        "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
981
982
983        "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmv", "10:10 vorm. Los Angeles Zeit",
984
985        "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 vorm. GMT-8",
986
987
988        "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hv", "10 vorm. Los Angeles Zeit",
989
990        "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hz", "10 vorm. GMT-8",
991
992        // Thai (default calendar buddhist)
993
994        // BEGIN ANDROID-changed.  Default calendar in Android is Gregorian for th locale.
995        // "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EEEEdMMMy", "\\u0E27\\u0E31\\u0E19\\u0E1E\\u0E38\\u0E18 10 \\u0E15.\\u0E04. 2550 - \\u0E27\\u0E31\\u0E19\\u0E28\\u0E38\\u0E01\\u0E23\\u0E4C 10 \\u0E15.\\u0E04. 2551",
996
997        // "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. 2550 - 10 \\u0E15.\\u0E04. 2551",
998
999        // "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "MMMy", "\\u0E15.\\u0E04. 2550 - \\u0E15.\\u0E04. 2551",
1000
1001
1002        // "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EdMy", "\\u0E1E. 10/10/2550 - \\u0E28. 10/10/2551",
1003
1004        // "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "dMy", "10/10/2550 - 10/10/2551",
1005
1006
1007        "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "My", "10/2550 - 10/2551",
1008
1009        // "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EdM", "\\u0E1E. 10/10/2550 - \\u0E28. 10/10/2551",
1010
1011
1012        "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "y", "2550-2551",
1013
1014        "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "M", "10/2550 - 10/2551",
1015
1016
1017        // "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "EEEEdMMMy", "\\u0E27\\u0E31\\u0E19\\u0E1E\\u0E38\\u0E18 10 \\u0E15.\\u0E04. - \\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C 10 \\u0E1E.\\u0E22. 2550",
1018
1019
1020        "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. - 10 \\u0E1E.\\u0E22.",
1021
1022        // "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "MMMy", "\\u0E15.\\u0E04.-\\u0E1E.\\u0E22. 2550",
1023
1024       "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dM", "10/10 - 10/11",
1025
1026        "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "My", "10/2550 - 11/2550",
1027
1028
1029        "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "d", "10/10 - 10/11",
1030
1031        // "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "y", "\\u0E1E.\\u0E28. 2550",
1032
1033
1034        "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "MMM", "\\u0E15.\\u0E04.-\\u0E1E.\\u0E22.",
1035        // END ANDROID-changed
1036    };
1037    expect(DATA, ARRAY_SIZE(DATA));
1038}
1039
1040
1041void DateIntervalFormatTest::expect(const char** data, int32_t data_length) {
1042    int32_t i = 0;
1043    UErrorCode ec = U_ZERO_ERROR;
1044    UnicodeString str, str2;
1045    const char* pattern = data[0];
1046    i++;
1047
1048#ifdef DTIFMTTS_DEBUG
1049    char result[1000];
1050    char mesg[1000];
1051    sprintf(mesg, "locale: %s\n", locName);
1052    PRINTMESG(mesg);
1053#endif
1054
1055    while (i<data_length) {
1056        const char* locName = data[i++];
1057        Locale loc(locName);
1058        SimpleDateFormat ref(pattern, loc, ec);
1059        if (U_FAILURE(ec)) {
1060            dataerrln("contruct SimpleDateFormat in expect failed: %s", u_errorName(ec));
1061            return;
1062        }
1063        // 'f'
1064        const char* datestr = data[i++];
1065        const char* datestr_2 = data[i++];
1066#ifdef DTIFMTTS_DEBUG
1067        sprintf(mesg, "original date: %s - %s\n", datestr, datestr_2);
1068        PRINTMESG(mesg)
1069#endif
1070        UDate date = ref.parse(ctou(datestr), ec);
1071        if (!assertSuccess("parse 1st data in expect", ec)) return;
1072        UDate date_2 = ref.parse(ctou(datestr_2), ec);
1073        if (!assertSuccess("parse 2nd data in expect", ec)) return;
1074        DateInterval dtitv(date, date_2);
1075
1076        const UnicodeString& oneSkeleton = data[i++];
1077
1078        DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(oneSkeleton, loc, ec);
1079        if (!assertSuccess("createInstance(skeleton) in expect", ec)) return;
1080        FieldPosition pos=0;
1081        dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1082        if (!assertSuccess("format in expect", ec)) return;
1083        assertEquals((UnicodeString)"\"" + locName + "\\" + oneSkeleton + "\\" + datestr + "\\" + datestr_2 + "\"", ctou(data[i++]), str);
1084
1085
1086
1087#ifdef DTIFMTTS_DEBUG
1088        str.extract(0,  str.length(), result, "UTF-8");
1089        sprintf(mesg, "interval date: %s\n", result);
1090        std::cout << "//";
1091        PRINTMESG(mesg)
1092        std::cout << "\"" << locName << "\", "
1093                 << "\"" << datestr << "\", "
1094                 << "\"" << datestr_2 << "\", ";
1095        printUnicodeString(oneSkeleton);
1096        printUnicodeString(str);
1097        std::cout << "\n\n";
1098#endif
1099        delete dtitvfmt;
1100    }
1101}
1102
1103
1104/*
1105 * Test format using user defined DateIntervalInfo
1106 */
1107void DateIntervalFormatTest::testFormatUserDII() {
1108    // first item is date pattern
1109    const char* DATA[] = {
1110        "yyyy MM dd HH:mm:ss",
1111        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Oct 10, 2007 --- Oct 10, 2008",
1112
1113        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 Oct 10 - Nov 2007",
1114
1115        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Nov 10, 2007 --- Nov 20, 2007",
1116
1117        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Jan 10, 2007",
1118
1119        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "Jan 10, 2007",
1120
1121        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Jan 10, 2007",
1122
1123        "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "2007\\u5e7410\\u670810\\u65e5 --- 2008\\u5e7410\\u670810\\u65e5",
1124
1125        "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 10\\u6708 10 - 11\\u6708 2007",
1126
1127        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "2007\\u5e7411\\u670810\\u65e5 --- 2007\\u5e7411\\u670820\\u65e5",
1128
1129        "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
1130
1131        "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
1132
1133        "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
1134
1135        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10. Okt. 2007 --- 10. Okt. 2008",
1136
1137
1138        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10. Nov. 2007 --- 20. Nov. 2007",
1139
1140        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10. Jan. 2007",
1141
1142        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10. Jan. 2007",
1143
1144
1145        "es", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10 de oct. de 2007 --- 10 de oct. de 2008",
1146
1147        "es", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 oct. 10 - nov. 2007",
1148
1149        "es", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10 de nov. de 2007 --- 20 de nov. de 2007",
1150
1151        "es", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10 de ene. de 2007",
1152
1153        "es", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10 de ene. de 2007",
1154
1155        "es", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "10 de ene. de 2007",
1156    };
1157    expectUserDII(DATA, ARRAY_SIZE(DATA));
1158}
1159
1160
1161void DateIntervalFormatTest::testSetIntervalPatternNoSideEffect() {
1162    UErrorCode ec = U_ZERO_ERROR;
1163    LocalPointer<DateIntervalInfo> dtitvinf(new DateIntervalInfo(ec));
1164    if (U_FAILURE(ec)) {
1165        errln("Failure encountered: %s", u_errorName(ec));
1166        return;
1167    }
1168    UnicodeString expected;
1169    dtitvinf->getIntervalPattern(ctou("yMd"), UCAL_DATE, expected, ec);
1170    dtitvinf->setIntervalPattern(ctou("yMd"), UCAL_DATE, ctou("M/d/y \\u2013 d"), ec);
1171    if (U_FAILURE(ec)) {
1172        errln("Failure encountered: %s", u_errorName(ec));
1173        return;
1174    }
1175    dtitvinf.adoptInstead(new DateIntervalInfo(ec));
1176    if (U_FAILURE(ec)) {
1177        errln("Failure encountered: %s", u_errorName(ec));
1178        return;
1179    }
1180    UnicodeString actual;
1181    dtitvinf->getIntervalPattern(ctou("yMd"), UCAL_DATE, actual, ec);
1182    if (U_FAILURE(ec)) {
1183        errln("Failure encountered: %s", u_errorName(ec));
1184        return;
1185    }
1186    if (expected != actual) {
1187        errln("DateIntervalInfo.setIntervalPattern should have no side effects.");
1188    }
1189}
1190
1191void DateIntervalFormatTest::testYearFormats() {
1192    const Locale &enLocale = Locale::getEnglish();
1193    UErrorCode status = U_ZERO_ERROR;
1194    LocalPointer<Calendar> fromTime(Calendar::createInstance(enLocale, status));
1195    LocalPointer<Calendar> toTime(Calendar::createInstance(enLocale, status));
1196    if (U_FAILURE(status)) {
1197        errln("Failure encountered: %s", u_errorName(status));
1198        return;
1199    }
1200    // April 26, 113. Three digit year so that we can test 2 digit years;
1201    // 4 digit years with padded 0's and full years.
1202    fromTime->set(113, 3, 26);
1203    // April 28, 113.
1204    toTime->set(113, 3, 28);
1205    {
1206        LocalPointer<DateIntervalFormat> dif(DateIntervalFormat::createInstance("yyyyMd", enLocale, status));
1207        if (U_FAILURE(status)) {
1208            dataerrln("Failure encountered: %s", u_errorName(status));
1209            return;
1210        }
1211        UnicodeString actual;
1212        UnicodeString expected(ctou("4/26/0113 \\u2013 4/28/0113"));
1213        FieldPosition pos = 0;
1214        dif->format(*fromTime, *toTime, actual, pos, status);
1215        if (U_FAILURE(status)) {
1216            errln("Failure encountered: %s", u_errorName(status));
1217            return;
1218        }
1219        if (actual != expected) {
1220            errln("Expected " + expected + ", got: " + actual);
1221        }
1222    }
1223    {
1224        LocalPointer<DateIntervalFormat> dif(DateIntervalFormat::createInstance("yyMd", enLocale, status));
1225        if (U_FAILURE(status)) {
1226            errln("Failure encountered: %s", u_errorName(status));
1227            return;
1228        }
1229        UnicodeString actual;
1230        UnicodeString expected(ctou("4/26/13 \\u2013 4/28/13"));
1231        FieldPosition pos = 0;
1232        dif->format(*fromTime, *toTime, actual, pos, status);
1233        if (U_FAILURE(status)) {
1234            errln("Failure encountered: %s", u_errorName(status));
1235            return;
1236        }
1237        if (actual != expected) {
1238            errln("Expected " + expected + ", got: " + actual);
1239        }
1240    }
1241    {
1242        LocalPointer<DateIntervalFormat> dif(DateIntervalFormat::createInstance("yMd", enLocale, status));
1243        if (U_FAILURE(status)) {
1244            errln("Failure encountered: %s", u_errorName(status));
1245            return;
1246        }
1247        UnicodeString actual;
1248        UnicodeString expected(ctou("4/26/113 \\u2013 4/28/113"));
1249        FieldPosition pos = 0;
1250        dif->format(*fromTime, *toTime, actual, pos, status);
1251        if (U_FAILURE(status)) {
1252            errln("Failure encountered: %s", u_errorName(status));
1253            return;
1254        }
1255        if (actual != expected) {
1256            errln("Expected " + expected + ", got: " + actual);
1257        }
1258    }
1259}
1260
1261void DateIntervalFormatTest::expectUserDII(const char** data,
1262                                           int32_t data_length) {
1263    int32_t i = 0;
1264    UnicodeString str;
1265    UErrorCode ec = U_ZERO_ERROR;
1266    const char* pattern = data[0];
1267    i++;
1268
1269    while ( i < data_length ) {
1270        const char* locName = data[i++];
1271        Locale loc(locName);
1272        SimpleDateFormat ref(pattern, loc, ec);
1273        if (U_FAILURE(ec)) {
1274            dataerrln("contruct SimpleDateFormat in expectUserDII failed: %s", u_errorName(ec));
1275            return;
1276        }
1277        const char* datestr = data[i++];
1278        const char* datestr_2 = data[i++];
1279        UDate date = ref.parse(ctou(datestr), ec);
1280        if (!assertSuccess("parse in expectUserDII", ec)) return;
1281        UDate date_2 = ref.parse(ctou(datestr_2), ec);
1282        if (!assertSuccess("parse in expectUserDII", ec)) return;
1283        DateInterval dtitv(date, date_2);
1284
1285        ec = U_ZERO_ERROR;
1286        // test user created DateIntervalInfo
1287        DateIntervalInfo* dtitvinf = new DateIntervalInfo(ec);
1288        dtitvinf->setFallbackIntervalPattern("{0} --- {1}", ec);
1289        dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_MONTH, "yyyy MMM d - MMM y",ec);
1290        if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1291        dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_HOUR_OF_DAY, "yyyy MMM d HH:mm - HH:mm", ec);
1292        if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1293        DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_ABBR_MONTH_DAY, loc, *dtitvinf, ec);
1294        delete dtitvinf;
1295        if (!assertSuccess("createInstance(skeleton,dtitvinf) in expectUserDII", ec)) return;
1296        FieldPosition pos=0;
1297        dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1298        if (!assertSuccess("format in expectUserDII", ec)) return;
1299        assertEquals((UnicodeString)"\"" + locName + "\\" + datestr + "\\" + datestr_2 + "\"", ctou(data[i++]), str);
1300#ifdef DTIFMTTS_DEBUG
1301        char result[1000];
1302        char mesg[1000];
1303        PRINTMESG("interval format using user defined DateIntervalInfo\n");
1304        str.extract(0,  str.length(), result, "UTF-8");
1305        sprintf(mesg, "interval date: %s\n", result);
1306        PRINTMESG(mesg);
1307#endif
1308        delete dtitvfmt;
1309    }
1310}
1311
1312
1313void DateIntervalFormatTest::testStress() {
1314    if(quick){
1315    	logln("Quick mode: Skipping test");
1316    	return;
1317    }
1318	const char* DATA[] = {
1319        "yyyy MM dd HH:mm:ss",
1320        "2007 10 10 10:10:10", "2008 10 10 10:10:10",
1321        "2007 10 10 10:10:10", "2007 11 10 10:10:10",
1322        "2007 11 10 10:10:10", "2007 11 20 10:10:10",
1323        "2007 01 10 10:00:10", "2007 01 10 14:10:10",
1324        "2007 01 10 10:00:10", "2007 01 10 10:20:10",
1325        "2007 01 10 10:10:10", "2007 01 10 10:10:20",
1326    };
1327
1328    const char* testLocale[][3] = {
1329        //{"th", "", ""},
1330        {"en", "", ""},
1331        {"zh", "", ""},
1332        {"de", "", ""},
1333        {"ar", "", ""},
1334        {"en", "GB",  ""},
1335        {"fr", "", ""},
1336        {"it", "", ""},
1337        {"nl", "", ""},
1338        {"zh", "TW",  ""},
1339        {"ja", "", ""},
1340        {"pt", "BR", ""},
1341        {"ru", "", ""},
1342        {"pl", "", ""},
1343        {"tr", "", ""},
1344        {"es", "", ""},
1345        {"ko", "", ""},
1346        {"sv", "", ""},
1347        {"fi", "", ""},
1348        {"da", "", ""},
1349        {"pt", "PT", ""},
1350        {"ro", "", ""},
1351        {"hu", "", ""},
1352        {"he", "", ""},
1353        {"in", "", ""},
1354        {"cs", "", ""},
1355        {"el", "", ""},
1356        {"no", "", ""},
1357        {"vi", "", ""},
1358        {"bg", "", ""},
1359        {"hr", "", ""},
1360        {"lt", "", ""},
1361        {"sk", "", ""},
1362        {"sl", "", ""},
1363        {"sr", "", ""},
1364        {"ca", "", ""},
1365        {"lv", "", ""},
1366        {"uk", "", ""},
1367        {"hi", "", ""},
1368    };
1369
1370    uint32_t localeIndex;
1371    for ( localeIndex = 0; localeIndex < ARRAY_SIZE(testLocale); ++localeIndex ) {
1372        char locName[32];
1373        uprv_strcpy(locName, testLocale[localeIndex][0]);
1374        uprv_strcat(locName, testLocale[localeIndex][1]);
1375        stress(DATA, ARRAY_SIZE(DATA), Locale(testLocale[localeIndex][0], testLocale[localeIndex][1], testLocale[localeIndex][2]), locName);
1376    }
1377}
1378
1379
1380void DateIntervalFormatTest::stress(const char** data, int32_t data_length,
1381                                    const Locale& loc, const char* locName) {
1382    UnicodeString skeleton[] = {
1383        "EEEEdMMMMy",
1384        "dMMMMy",
1385        "dMMMM",
1386        "MMMMy",
1387        "EEEEdMMMM",
1388        "EdMMMy",
1389        "dMMMy",
1390        "dMMM",
1391        "MMMy",
1392        "EdMMM",
1393        "EdMy",
1394        "dMy",
1395        "dM",
1396        "My",
1397        "EdM",
1398        "d",
1399        "Ed",
1400        "y",
1401        "M",
1402        "MMM",
1403        "MMMM",
1404        "hm",
1405        "hmv",
1406        "hmz",
1407        "h",
1408        "hv",
1409        "hz",
1410        "EEddMMyyyy", // following could be normalized
1411        "EddMMy",
1412        "hhmm",
1413        "hhmmzz",
1414        "hms",  // following could not be normalized
1415        "dMMMMMy",
1416        "EEEEEdM",
1417    };
1418
1419    int32_t i = 0;
1420    UErrorCode ec = U_ZERO_ERROR;
1421    UnicodeString str, str2;
1422    SimpleDateFormat ref(data[i++], loc, ec);
1423    if (!assertSuccess("construct SimpleDateFormat", ec)) return;
1424
1425#ifdef DTIFMTTS_DEBUG
1426    char result[1000];
1427    char mesg[1000];
1428    sprintf(mesg, "locale: %s\n", locName);
1429    PRINTMESG(mesg);
1430#endif
1431
1432    while (i<data_length) {
1433
1434        // 'f'
1435        const char* datestr = data[i++];
1436        const char* datestr_2 = data[i++];
1437#ifdef DTIFMTTS_DEBUG
1438        sprintf(mesg, "original date: %s - %s\n", datestr, datestr_2);
1439        PRINTMESG(mesg)
1440#endif
1441        UDate date = ref.parse(ctou(datestr), ec);
1442        if (!assertSuccess("parse", ec)) return;
1443        UDate date_2 = ref.parse(ctou(datestr_2), ec);
1444        if (!assertSuccess("parse", ec)) return;
1445        DateInterval dtitv(date, date_2);
1446
1447        for ( uint32_t skeletonIndex = 0;
1448              skeletonIndex < ARRAY_SIZE(skeleton);
1449              ++skeletonIndex ) {
1450            const UnicodeString& oneSkeleton = skeleton[skeletonIndex];
1451            DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(oneSkeleton, loc, ec);
1452            if (!assertSuccess("createInstance(skeleton)", ec)) return;
1453            /*
1454            // reset the calendar to be Gregorian calendar for "th"
1455            if ( uprv_strcmp(locName, "th") == 0 ) {
1456                GregorianCalendar* gregCal = new GregorianCalendar(loc, ec);
1457                if (!assertSuccess("GregorianCalendar()", ec)) return;
1458                const DateFormat* dformat = dtitvfmt->getDateFormat();
1459                DateFormat* newOne = (DateFormat*)dformat->clone();
1460                newOne->adoptCalendar(gregCal);
1461                //dtitvfmt->adoptDateFormat(newOne, ec);
1462                dtitvfmt->setDateFormat(*newOne, ec);
1463                delete newOne;
1464                if (!assertSuccess("adoptDateFormat()", ec)) return;
1465            }
1466            */
1467            FieldPosition pos=0;
1468            dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1469            if (!assertSuccess("format", ec)) return;
1470#ifdef DTIFMTTS_DEBUG
1471            oneSkeleton.extract(0,  oneSkeleton.length(), result, "UTF-8");
1472            sprintf(mesg, "interval by skeleton: %s\n", result);
1473            PRINTMESG(mesg)
1474            str.extract(0,  str.length(), result, "UTF-8");
1475            sprintf(mesg, "interval date: %s\n", result);
1476            PRINTMESG(mesg)
1477#endif
1478            delete dtitvfmt;
1479        }
1480
1481        // test user created DateIntervalInfo
1482        ec = U_ZERO_ERROR;
1483        DateIntervalInfo* dtitvinf = new DateIntervalInfo(ec);
1484        dtitvinf->setFallbackIntervalPattern("{0} --- {1}", ec);
1485        dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_MONTH, "yyyy MMM d - MMM y",ec);
1486        if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1487        dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_HOUR_OF_DAY, "yyyy MMM d HH:mm - HH:mm", ec);
1488        if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1489        DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_ABBR_MONTH_DAY, loc, *dtitvinf, ec);
1490        delete dtitvinf;
1491        if (!assertSuccess("createInstance(skeleton,dtitvinf)", ec)) return;
1492        FieldPosition pos=0;
1493        dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1494        if ( uprv_strcmp(locName, "th") ) {
1495            if (!assertSuccess("format", ec)) return;
1496#ifdef DTIFMTTS_DEBUG
1497            PRINTMESG("interval format using user defined DateIntervalInfo\n");
1498            str.extract(0,  str.length(), result, "UTF-8");
1499            sprintf(mesg, "interval date: %s\n", result);
1500            PRINTMESG(mesg)
1501#endif
1502        } else {
1503            // for "th", the default calendar is Budhist,
1504            // not Gregorian.
1505            assertTrue("Default calendar for \"th\" is Budhist", ec == U_ILLEGAL_ARGUMENT_ERROR);
1506            ec = U_ZERO_ERROR;
1507        }
1508        delete dtitvfmt;
1509    }
1510}
1511
1512#endif /* #if !UCONFIG_NO_FORMATTING */
1513