1
2/********************************************************************
3 * COPYRIGHT:
4 * Copyright (c) 1997-2009, 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
29
30
31#ifdef DTIFMTTS_DEBUG
32//#define PRINTMESG(msg) { std::cout << "(" << __FILE__ << ":" << __LINE__ << ") " << msg << "\n"; }
33#define PRINTMESG(msg) { std::cout << msg; }
34#endif
35
36#define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
37
38#include <stdio.h>
39
40
41void DateIntervalFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) {
42    if (exec) logln("TestSuite DateIntervalFormat");
43    switch (index) {
44        TESTCASE(0, testAPI);
45        TESTCASE(1, testFormat);
46        TESTCASE(2, testFormatUserDII);
47        TESTCASE(3, testStress);
48        default: name = ""; break;
49    }
50}
51
52/**
53 * Test various generic API methods of DateIntervalFormat for API coverage.
54 */
55void DateIntervalFormatTest::testAPI() {
56
57    /* ====== Test create interval instance with default locale and skeleton
58     */
59    UErrorCode status = U_ZERO_ERROR;
60    logln("Testing DateIntervalFormat create instance with default locale and skeleton");
61
62    DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_MONTH_DAY, status);
63    if(U_FAILURE(status)) {
64        dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + default locale) - exitting");
65        return;
66    } else {
67        delete dtitvfmt;
68    }
69
70
71    /* ====== Test create interval instance with given locale and skeleton
72     */
73    status = U_ZERO_ERROR;
74    logln("Testing DateIntervalFormat create instance with given locale and skeleton");
75
76    dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_MONTH_DAY, Locale::getJapanese(), status);
77    if(U_FAILURE(status)) {
78        dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + locale) - exitting");
79        return;
80    } else {
81        delete dtitvfmt;
82    }
83
84
85    /* ====== Test create interval instance with dateIntervalInfo and skeleton
86     */
87    status = U_ZERO_ERROR;
88    logln("Testing DateIntervalFormat create instance with dateIntervalInfo  and skeleton");
89
90    DateIntervalInfo* dtitvinf = new DateIntervalInfo(Locale::getSimplifiedChinese(), status);
91
92    dtitvfmt = DateIntervalFormat::createInstance("EEEdMMMyhms", *dtitvinf, status);
93    delete dtitvinf;
94
95    if(U_FAILURE(status)) {
96        dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + DateIntervalInfo + default locale) - exitting");
97        return;
98    } else {
99        delete dtitvfmt;
100    }
101
102
103    /* ====== Test create interval instance with dateIntervalInfo and skeleton
104     */
105    status = U_ZERO_ERROR;
106    logln("Testing DateIntervalFormat create instance with dateIntervalInfo  and skeleton");
107
108    dtitvinf = new DateIntervalInfo(Locale::getSimplifiedChinese(), status);
109
110    dtitvfmt = DateIntervalFormat::createInstance("EEEdMMMyhms", Locale::getSimplifiedChinese(), *dtitvinf, status);
111    delete dtitvinf;
112    if(U_FAILURE(status)) {
113        dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + DateIntervalInfo + locale) - exitting");
114        return;
115    }
116    // not deleted, test clone
117
118
119    // ====== Test clone()
120    status = U_ZERO_ERROR;
121    logln("Testing DateIntervalFormat clone");
122
123    DateIntervalFormat* another = (DateIntervalFormat*)dtitvfmt->clone();
124    if ( (*another) != (*dtitvfmt) ) {
125        dataerrln("ERROR: clone failed");
126    }
127
128
129    // ====== Test getDateIntervalInfo, setDateIntervalInfo, adoptDateIntervalInfo
130    status = U_ZERO_ERROR;
131    logln("Testing DateIntervalFormat getDateIntervalInfo");
132    const DateIntervalInfo* inf = another->getDateIntervalInfo();
133    dtitvfmt->setDateIntervalInfo(*inf, status);
134    const DateIntervalInfo* anotherInf = dtitvfmt->getDateIntervalInfo();
135    if ( (*inf) != (*anotherInf) || U_FAILURE(status) ) {
136        dataerrln("ERROR: getDateIntervalInfo/setDateIntervalInfo failed");
137    }
138
139    /*
140    status = U_ZERO_ERROR;
141    DateIntervalInfo* nonConstInf = inf->clone();
142    dtitvfmt->adoptDateIntervalInfo(nonConstInf, status);
143    anotherInf = dtitvfmt->getDateIntervalInfo();
144    if ( (*inf) != (*anotherInf) || U_FAILURE(status) ) {
145        dataerrln("ERROR: adoptDateIntervalInfo failed");
146    }
147    */
148
149    // ====== Test getDateFormat, setDateFormat, adoptDateFormat
150
151    status = U_ZERO_ERROR;
152    logln("Testing DateIntervalFormat getDateFormat");
153    /*
154    const DateFormat* fmt = another->getDateFormat();
155    dtitvfmt->setDateFormat(*fmt, status);
156    const DateFormat* anotherFmt = dtitvfmt->getDateFormat();
157    if ( (*fmt) != (*anotherFmt) || U_FAILURE(status) ) {
158        dataerrln("ERROR: getDateFormat/setDateFormat failed");
159    }
160
161    status = U_ZERO_ERROR;
162    DateFormat* nonConstFmt = (DateFormat*)fmt->clone();
163    dtitvfmt->adoptDateFormat(nonConstFmt, status);
164    anotherFmt = dtitvfmt->getDateFormat();
165    if ( (*fmt) != (*anotherFmt) || U_FAILURE(status) ) {
166        dataerrln("ERROR: adoptDateFormat failed");
167    }
168    delete fmt;
169    */
170
171
172    // ======= Test getStaticClassID()
173
174    logln("Testing getStaticClassID()");
175
176
177    if(dtitvfmt->getDynamicClassID() != DateIntervalFormat::getStaticClassID()) {
178        errln("ERROR: getDynamicClassID() didn't return the expected value");
179    }
180
181    delete another;
182
183    // ====== test constructor/copy constructor and assignment
184    /* they are protected, no test
185    logln("Testing DateIntervalFormat constructor and assigment operator");
186    status = U_ZERO_ERROR;
187
188    DateFormat* constFmt = (constFmt*)dtitvfmt->getDateFormat()->clone();
189    inf = dtitvfmt->getDateIntervalInfo()->clone();
190
191
192    DateIntervalFormat* dtifmt = new DateIntervalFormat(fmt, inf, status);
193    if(U_FAILURE(status)) {
194        dataerrln("ERROR: Could not create DateIntervalFormat (default) - exitting");
195        return;
196    }
197
198    DateIntervalFormat* dtifmt2 = new(dtifmt);
199    if ( (*dtifmt) != (*dtifmt2) ) {
200        dataerrln("ERROR: Could not create DateIntervalFormat (default) - exitting");
201        return;
202    }
203
204    DateIntervalFormat dtifmt3 = (*dtifmt);
205    if ( (*dtifmt) != dtifmt3 ) {
206        dataerrln("ERROR: Could not create DateIntervalFormat (default) - exitting");
207        return;
208    }
209
210    delete dtifmt2;
211    delete dtifmt3;
212    delete dtifmt;
213    */
214
215
216    //===== test format and parse ==================
217    Formattable formattable;
218    formattable.setInt64(10);
219    UnicodeString res;
220    FieldPosition pos = 0;
221    status = U_ZERO_ERROR;
222    dtitvfmt->format(formattable, res, pos, status);
223    if ( status != U_ILLEGAL_ARGUMENT_ERROR ) {
224        dataerrln("ERROR: format non-date-interval object should set U_ILLEGAL_ARGUMENT_ERROR - exitting");
225        return;
226    }
227
228    DateInterval* dtitv = new DateInterval(3600*24*365, 3600*24*366);
229    formattable.adoptObject(dtitv);
230    res.remove();
231    pos = 0;
232    status = U_ZERO_ERROR;
233    dtitvfmt->format(formattable, res, pos, status);
234    if ( U_FAILURE(status) ) {
235        dataerrln("ERROR: format date interval failed - exitting");
236        return;
237    }
238
239    const DateFormat* dfmt = dtitvfmt->getDateFormat();
240    Calendar* fromCal = dfmt->getCalendar()->clone();
241    Calendar* toCal = dfmt->getCalendar()->clone();
242    res.remove();
243    pos = 0;
244    status = U_ZERO_ERROR;
245    dtitvfmt->format(*fromCal, *toCal, res, pos, status);
246    if ( U_FAILURE(status) ) {
247        dataerrln("ERROR: format date interval failed - exitting");
248        return;
249    }
250    delete fromCal;
251    delete toCal;
252
253
254    Formattable fmttable;
255    status = U_ZERO_ERROR;
256    // TODO: why do I need cast?
257    ((Format*)dtitvfmt)->parseObject(res, fmttable, status);
258    if ( status != U_INVALID_FORMAT_ERROR ) {
259        dataerrln("ERROR: parse should set U_INVALID_FORMAT_ERROR - exitting");
260        return;
261    }
262
263    delete dtitvfmt;
264
265
266    //====== test format  in testFormat()
267
268}
269
270
271/**
272 * Test format
273 */
274void DateIntervalFormatTest::testFormat() {
275    // first item is date pattern
276    // followed by a group of locale/from_data/to_data/skeleton/interval_data
277    const char* DATA[] = {
278        "yyyy MM dd HH:mm:ss",
279        // test root
280        "root", "2007 11 10 10:10:10", "2007 12 10 10:10:10", "yM", "2007-11 \\u2013 12",
281
282        // test 'H' and 'h', using availableFormat in fallback
283        "en", "2007 11 10 10:10:10", "2007 11 10 15:10:10", "Hms", "10:10:10 \\u2013 15:10:10",
284        "en", "2007 11 10 10:10:10", "2007 11 10 15:10:10", "hms", "10:10:10 AM \\u2013 3:10:10 PM",
285
286        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMM", "October 2007 \\u2013 October 2008",
287        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMM", "Oct 2007 \\u2013 Oct 2008",
288        // test skeleton with both date and time
289        "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",
290
291        "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "dMMMyhm", "Nov 10, 2007 10:10\\u201311:10 AM",
292
293        "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "hms", "10:10:10 AM \\u2013 11:10:10 AM",
294
295        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
296
297        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMMy", "October 10, 2007 \\u2013 October 10, 2008",
298
299        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMM", "October 10, 2007 \\u2013 October 10, 2008",
300
301        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMMy", "October 2007 \\u2013 October 2008",
302
303        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
304
305        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMMMy", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
306
307        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMy", "Oct 10, 2007 \\u2013 Oct 10, 2008",
308
309        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "Oct 10, 2007 \\u2013 Oct 10, 2008",
310
311        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Oct 2007 \\u2013 Oct 2008",
312
313        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMMM", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
314
315        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Wed, 10/10/07 \\u2013 Fri, 10/10/08",
316
317        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10/10/07 \\u2013 10/10/08",
318
319        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dM", "10/10/07 \\u2013 10/10/08",
320
321        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10/07 \\u2013 10/08",
322
323        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Wed, 10/10/07 \\u2013 Fri, 10/10/08",
324
325        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "d", "10/10/07 \\u2013 10/10/08",
326
327        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Ed", "10 Wed \\u2013 10 Fri",
328
329        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007\\u20132008",
330
331        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10/07 \\u2013 10/08",
332
333
334
335        "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",
336
337        "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",
338
339        "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",
340
341        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "h", "10/10/2007 10 \\u2013 10/10/2008 10",
342
343        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hv", "10/10/2007 PT (Hour: 10) \\u2013 10/10/2008 PT (Hour: 10)",
344
345        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hz", "10/10/2007 PDT (Hour: 10) \\u2013 10/10/2008 PDT (Hour: 10)",
346
347        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/07 \\u2013 Fri, 10/10/08",
348
349        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EddMMy", "Wed, 10/10/07 \\u2013 Fri, 10/10/08",
350
351        "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",
352
353        "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",
354
355        "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",
356
357        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMMMy", "O 10, 2007 \\u2013 O 10, 2008",
358
359        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEEdM", "W, 10/10/07 \\u2013 F, 10/10/08",
360
361        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10 \\u2013 Saturday, November 10, 2007",
362
363        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMy", "October 10 \\u2013 November 10, 2007",
364
365        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMM", "October 10 \\u2013 November 10",
366
367        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMMy", "October\\u2013November 2007",
368
369        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10 \\u2013 Saturday, November 10",
370
371        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMMMy", "Wed, Oct 10 \\u2013 Sat, Nov 10, 2007",
372
373        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMy", "Oct 10 \\u2013 Nov 10, 2007",
374
375        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "Oct 10 \\u2013 Nov 10",
376
377        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Oct\\u2013Nov 2007",
378
379        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMMM", "Wed, Oct 10 \\u2013 Sat, Nov 10",
380
381        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMy", "Wed, 10/10/07 \\u2013 Sat, 11/10/07",
382
383        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMy", "10/10/07 \\u2013 11/10/07",
384
385
386        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10/07 \\u2013 11/07",
387
388        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdM", "Wed, 10/10 \\u2013 Sat, 11/10",
389
390        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10/10 \\u2013 11/10",
391
392        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "Ed", "10 Wed \\u2013 10 Sat",
393
394        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "y", "2007",
395
396        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "M", "10\\u201311",
397
398        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Oct\\u2013Nov",
399
400        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMM", "October-November",
401
402        "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",
403
404        "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",
405
406        "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",
407
408        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "h", "10/10/2007 10 \\u2013 11/10/2007 10",
409
410        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hv", "10/10/2007 PT (Hour: 10) \\u2013 11/10/2007 PT (Hour: 10)",
411
412        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hz", "10/10/2007 PDT (Hour: 10) \\u2013 11/10/2007 PST (Hour: 10)",
413
414        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/07 \\u2013 Sat, 11/10/07",
415
416        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EddMMy", "Wed, 10/10/07 \\u2013 Sat, 11/10/07",
417
418
419        "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",
420
421        "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",
422
423        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMMy", "O 10 \\u2013 N 10, 2007",
424
425        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEEdM", "W, 10/10 \\u2013 S, 11/10",
426
427        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMMy", "Saturday, November 10 \\u2013 Tuesday, November 20, 2007",
428
429        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMy", "November 10\\u201320, 2007",
430
431        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "November 10\\u201320",
432
433
434        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMM", "Saturday, November 10 \\u2013 Tuesday, November 20",
435
436        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMMy", "Sat, Nov 10 \\u2013 Tue, Nov 20, 2007",
437
438        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMy", "Nov 10\\u201320, 2007",
439
440        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMM", "Nov 10\\u201320",
441
442        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov 2007",
443
444        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMM", "Sat, Nov 10 \\u2013 Tue, Nov 20",
445
446        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sat, 11/10/07 \\u2013 Tue, 11/20/07",
447
448        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMy", "11/10/07 \\u2013 11/20/07",
449
450        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
451
452        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "11/2007",
453
454        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "Sat, 11/10 \\u2013 Tue, 11/20",
455
456        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10\\u201320",
457
458        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Ed", "10 Sat \\u2013 20 Tue",
459
460        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007",
461
462        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11",
463
464        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMM", "Nov",
465
466        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMM", "November",
467
468        "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",
469
470        "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",
471
472        "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",
473
474        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "h", "11/10/2007 10 \\u2013 11/20/2007 10",
475
476        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hv", "11/10/2007 PT (Hour: 10) \\u2013 11/20/2007 PT (Hour: 10)",
477
478        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hz", "11/10/2007 PST (Hour: 10) \\u2013 11/20/2007 PST (Hour: 10)",
479
480        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEddMMyyyy", "Sat, 11/10/07 \\u2013 Tue, 11/20/07",
481
482        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EddMMy", "Sat, 11/10/07 \\u2013 Tue, 11/20/07",
483
484        "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",
485
486        "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",
487
488        "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",
489
490        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMMy", "N 10\\u201320, 2007",
491
492        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEEdM", "S, 11/10 \\u2013 T, 11/20",
493
494        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMMy", "Wednesday, January 10, 2007",
495
496        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMMy", "January 10, 2007",
497
498        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMM", "January 10",
499
500        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMMy", "January 2007",
501
502        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMM", "Wednesday, January 10",
503
504        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdMMMy", "Wed, Jan 10, 2007",
505
506        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMy", "Jan 10, 2007",
507
508        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "Jan 10",
509
510        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan 2007",
511
512        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdMMM", "Wed, Jan 10",
513
514
515        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMy", "1/10/2007",
516
517        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dM", "1/10",
518
519        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "My", "1/2007",
520
521        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdM", "Wed, 1/10",
522
523        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "d", "10",
524
525        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Ed", "10 Wed",
526
527        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "y", "2007",
528
529        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "M", "1",
530
531        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMM", "Jan",
532
533        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMM", "January",
534
535        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "10:00 AM \\u2013 2:10 PM",
536
537        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmv", "10:00 AM \\u2013 2:10 PM PT",
538
539        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "10:00 AM \\u2013 2:10 PM PST",
540
541        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10 AM \\u2013 2 PM",
542
543
544        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hz", "10 AM \\u2013 2 PM PST",
545
546        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEddMMyyyy", "Wed, 01/10/2007",
547
548        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EddMMy", "Wed, 01/10/2007",
549
550        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hhmm", "10:00 AM \\u2013 2:10 PM",
551
552        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hhmmzz", "10:00 AM \\u2013 2:10 PM PST",
553
554        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hms", "10:00:10 AM \\u2013 2:10:10 PM",
555
556        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMMMy", "J 10, 2007",
557
558        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEEdM", "W, 1/10",
559        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMMy", "January 10, 2007",
560
561        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMM", "January 10",
562
563        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "MMMMy", "January 2007",
564
565        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMMM", "Wednesday, January 10",
566
567        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMMMy", "Wed, Jan 10, 2007",
568
569        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMy", "Jan 10, 2007",
570
571        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMM", "Jan 10",
572
573
574        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMMM", "Wed, Jan 10",
575
576        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMy", "Wed, 1/10/2007",
577
578        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMy", "1/10/2007",
579
580
581        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "My", "1/2007",
582
583        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdM", "Wed, 1/10",
584
585        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "d", "10",
586
587
588        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "y", "2007",
589
590        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "M", "1",
591
592
593
594        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "10:00\\u201310:20 AM",
595
596
597        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmz", "10:00\\u201310:20 AM PST",
598
599
600        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hv", "PT (Hour: 10)",
601
602
603
604        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EddMMy", "Wed, 01/10/2007",
605
606        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hhmm", "10:00\\u201310:20 AM",
607
608        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hhmmzz", "10:00\\u201310:20 AM PST",
609
610
611        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMMMy", "J 10, 2007",
612
613
614        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMMy", "Wednesday, January 10, 2007",
615
616        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMMy", "January 10, 2007",
617
618
619        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "MMMMy", "January 2007",
620
621        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMM", "Wednesday, January 10",
622
623
624        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMy", "Jan 10, 2007",
625
626        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMM", "Jan 10",
627
628
629        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdMMM", "Wed, Jan 10",
630
631        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdMy", "Wed, 1/10/2007",
632
633        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMy", "1/10/2007",
634
635
636        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "My", "1/2007",
637
638        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdM", "Wed, 1/10",
639
640        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "d", "10",
641
642
643        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "y", "2007",
644
645        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "M", "1",
646
647
648        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "MMMM", "January",
649
650        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "10:10 AM",
651
652
653        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 AM PST",
654
655        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "10",
656
657        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hv", "PT (Hour: 10)",
658
659
660        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEddMMyyyy", "Wed, 01/10/2007",
661
662
663        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hhmm", "10:10 AM",
664
665        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hhmmzz", "10:10 AM PST",
666
667
668        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMMMy", "J 10, 2007",
669
670        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEEdM", "W, 1/10",
671
672        "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",
673
674
675        "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u81f311\\u670810\\u65e5",
676
677
678        "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMMy", "2007\\u5e7410\\u6708\\u81f311\\u6708",
679
680
681        "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmv", "2007\\u5e7410\\u670810\\u65e5 \\u4e0a\\u534810:10 \\u7f8e\\u56fd (\\u6d1b\\u6749\\u77f6)\\u20132007\\u5e7411\\u670810\\u65e5 \\u4e0a\\u534810:10 \\u7f8e\\u56fd (\\u6d1b\\u6749\\u77f6)",
682
683        "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",
684
685
686        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "11\\u670810\\u65e5\\u81f320\\u65e5",
687
688        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMMy", "2007\\u5E7411\\u6708", // (fixed expected result per ticket:6626:)
689
690        "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",
691
692
693        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "07-11-10\\u5468\\u516d\\u81f307-11-20\\u5468\\u4e8c",
694
695
696        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11-10\\u81f311-20",
697
698        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "2007-11",
699
700        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "11-10\\u5468\\u516d\\u81f311-20\\u5468\\u4e8c",
701
702
703        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007\\u5E74", // (fixed expected result per ticket:6626:)
704
705        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11",
706
707        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMM", "11\\u6708", // (fixed expected result per ticket:6626:)
708
709
710        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmz", "2007\\u5e7411\\u670810\\u65e5 \\u4e0a\\u534810:10 \\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0800\\u20132007\\u5e7411\\u670820\\u65e5 \\u4e0a\\u534810:10 \\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0800",
711
712        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "h", "2007\\u5e7411\\u670810\\u65e5 10\\u65F6\\u20132007\\u5e7411\\u670820\\u65e5 10\\u65F6", // (fixed expected result per ticket:6626:)
713
714        "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:)
715
716        "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
717
718
719        "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0800\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
720
721        "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "\\u4e0a\\u534810\\u81f3\\u4e0b\\u53482\\u65f6",
722
723        "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hv", "\\u7f8e\\u56fd (\\u6d1b\\u6749\\u77f6)\\u4e0a\\u534810\\u81f3\\u4e0b\\u53482\\u65f6",
724
725        "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "\\u4e0a\\u534810:00\\u81f310:20",
726
727        "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "\\u7f8e\\u56fd (\\u6d1b\\u6749\\u77f6)\\u4e0a\\u534810:00\\u81f310:20",
728
729        "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0800 (\\u5c0f\\u65f6: 10\\u65F6)", // (fixed expected result per ticket:6626:)
730
731        "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "\\u4e0a\\u534810:10",
732
733        "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "10\\u65F6", // (fixed expected result per ticket:6626:)
734
735        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt 2007 - Freitag, 10. Okt 2008",
736
737
738        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "10. Okt 2007 - 10. Okt 2008",
739
740        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Okt 2007 - Okt 2008",
741
742
743        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Mi., 10.10.07 - Fr., 10.10.08",
744
745        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10.10.07 - 10.10.08",
746
747
748        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10.07 - 10.08",
749
750        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Mi., 10.10.07 - Fr., 10.10.08",
751
752
753        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007-2008",
754
755        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10.07 - 10.08",
756
757
758        "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.",
759
760        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt - Samstag, 10. Nov 2007",
761
762
763        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "10. Okt - 10. Nov",
764
765        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Okt-Nov 2007",
766
767        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMM", "Mittwoch, 10. Okt - Samstag, 10. Nov",
768
769
770        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dM", "10.10. - 10.11.",
771
772        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10.07 - 11.07",
773
774
775        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10.10. - 10.11.",
776
777        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "y", "2007",
778
779
780        "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Okt-Nov",
781
782
783        "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.",
784
785        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMy", "Samstag, 10. - Dienstag, 20. Nov 2007",
786
787        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMy", "10.-20. Nov 2007",
788
789
790        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov 2007",
791
792        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMM", "Samstag, 10. - Dienstag, 20. Nov",
793
794        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sa., 10.11.07 - Di., 20.11.07",
795
796
797        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "10.11. - 20.11.",
798
799        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "2007-11",
800
801
802        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10.-20.",
803
804        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007",
805
806
807        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmv", "10.11.2007 10:10 vorm. Vereinigte Staaten (Los Angeles) - 20.11.2007 10:10 vorm. Vereinigte Staaten (Los Angeles)",
808
809        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMy", "Mittwoch, 10. Jan 2007",
810
811
812        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "10. Jan",
813
814        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan 2007",
815
816        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMM", "Mittwoch 10. Jan",
817
818
819        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10-14",
820
821        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMM", "Mittwoch 10. Jan",
822
823
824        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "10:00-10:20 Vereinigte Staaten (Los Angeles)",
825
826        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmz", "10:00-10:20 GMT-08:00",
827
828        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "h", "10",
829
830
831        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "GMT-08:00 (Stunde: 10)",
832
833        "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMy", "Mittwoch, 10. Jan 2007",
834
835
836        "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmv", "10:10 vorm. Vereinigte Staaten (Los Angeles)",
837
838        "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 vorm. GMT-08:00",
839
840
841        "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hv", "Vereinigte Staaten (Los Angeles) (Stunde: 10)",
842
843        "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hz", "GMT-08:00 (Stunde: 10)",
844    };
845    expect(DATA, ARRAY_SIZE(DATA));
846}
847
848
849void DateIntervalFormatTest::expect(const char** data, int32_t data_length) {
850    int32_t i = 0;
851    UErrorCode ec = U_ZERO_ERROR;
852    UnicodeString str, str2;
853    const char* pattern = data[0];
854    i++;
855
856#ifdef DTIFMTTS_DEBUG
857    char result[1000];
858    char mesg[1000];
859    sprintf(mesg, "locale: %s\n", locName);
860    PRINTMESG(mesg);
861#endif
862
863    while (i<data_length) {
864        const char* locName = data[i++];
865        Locale loc(locName);
866        SimpleDateFormat ref(pattern, loc, ec);
867        if (!assertSuccess("construct SimpleDateFormat in expect", ec)) return;
868        // 'f'
869        const char* datestr = data[i++];
870        const char* datestr_2 = data[i++];
871#ifdef DTIFMTTS_DEBUG
872        sprintf(mesg, "original date: %s - %s\n", datestr, datestr_2);
873        PRINTMESG(mesg)
874#endif
875        UDate date = ref.parse(ctou(datestr), ec);
876        if (!assertSuccess("parse 1st data in expect", ec)) return;
877        UDate date_2 = ref.parse(ctou(datestr_2), ec);
878        if (!assertSuccess("parse 2nd data in expect", ec)) return;
879        DateInterval dtitv(date, date_2);
880
881        const UnicodeString& oneSkeleton = data[i++];
882
883        DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(oneSkeleton, loc, ec);
884        if (!assertSuccess("createInstance(skeleton) in expect", ec)) return;
885        FieldPosition pos=0;
886        dtitvfmt->format(&dtitv, str.remove(), pos, ec);
887        if (!assertSuccess("format in expect", ec)) return;
888        assertEquals((UnicodeString)"\"" + locName + "\\" + oneSkeleton + "\\" + datestr + "\\" + datestr_2 + "\"", ctou(data[i++]), str);
889
890
891
892#ifdef DTIFMTTS_DEBUG
893        str.extract(0,  str.length(), result, "UTF-8");
894        sprintf(mesg, "interval date: %s\n", result);
895        std::cout << "//";
896        PRINTMESG(mesg)
897        std::cout << "\"" << locName << "\", "
898                 << "\"" << datestr << "\", "
899                 << "\"" << datestr_2 << "\", ";
900        printUnicodeString(oneSkeleton);
901        printUnicodeString(str);
902        std::cout << "\n\n";
903#endif
904        delete dtitvfmt;
905    }
906}
907
908
909/*
910 * Test format using user defined DateIntervalInfo
911 */
912void DateIntervalFormatTest::testFormatUserDII() {
913    // first item is date pattern
914    const char* DATA[] = {
915        "yyyy MM dd HH:mm:ss",
916        "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Oct 10, 2007 --- Oct 10, 2008",
917
918        "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 Oct 10 - Nov 2007",
919
920        "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Nov 10, 2007 --- Nov 20, 2007",
921
922        "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Jan 10, 2007",
923
924        "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "Jan 10, 2007",
925
926        "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Jan 10, 2007",
927
928        "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "2007\\u5e7410\\u670810\\u65e5 --- 2008\\u5e7410\\u670810\\u65e5",
929
930        "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 10\\u6708 10 - 11\\u6708 2007",
931
932        "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "2007\\u5e7411\\u670810\\u65e5 --- 2007\\u5e7411\\u670820\\u65e5",
933
934        "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
935
936        "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
937
938        "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
939
940        "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10. Okt 2007 --- 10. Okt 2008",
941
942
943        "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10. Nov 2007 --- 20. Nov 2007",
944
945        "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10. Jan 2007",
946
947        "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10. Jan 2007",
948
949
950        "es", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10 de oct de 2007 --- 10 de oct de 2008",
951
952        "es", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 oct 10 - nov 2007",
953
954        "es", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10 de nov de 2007 --- 20 de nov de 2007",
955
956        "es", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10 de ene de 2007",
957
958        "es", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10 de ene de 2007",
959
960        "es", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "10 de ene de 2007",
961    };
962    expectUserDII(DATA, ARRAY_SIZE(DATA));
963}
964
965
966void DateIntervalFormatTest::expectUserDII(const char** data,
967                                           int32_t data_length) {
968    int32_t i = 0;
969    UnicodeString str;
970    UErrorCode ec = U_ZERO_ERROR;
971    const char* pattern = data[0];
972    i++;
973
974    while ( i < data_length ) {
975        const char* locName = data[i++];
976        Locale loc(locName);
977        SimpleDateFormat ref(pattern, loc, ec);
978        if (!assertSuccess("construct SimpleDateFormat in expectUserDII", ec)) return;
979        const char* datestr = data[i++];
980        const char* datestr_2 = data[i++];
981        UDate date = ref.parse(ctou(datestr), ec);
982        if (!assertSuccess("parse in expectUserDII", ec)) return;
983        UDate date_2 = ref.parse(ctou(datestr_2), ec);
984        if (!assertSuccess("parse in expectUserDII", ec)) return;
985        DateInterval dtitv(date, date_2);
986
987        ec = U_ZERO_ERROR;
988        // test user created DateIntervalInfo
989        DateIntervalInfo* dtitvinf = new DateIntervalInfo(ec);
990        dtitvinf->setFallbackIntervalPattern("{0} --- {1}", ec);
991        dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_MONTH, "yyyy MMM d - MMM y",ec);
992        if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
993        dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_HOUR_OF_DAY, "yyyy MMM d HH:mm - HH:mm", ec);
994        if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
995        DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_ABBR_MONTH_DAY, loc, *dtitvinf, ec);
996        delete dtitvinf;
997        if (!assertSuccess("createInstance(skeleton,dtitvinf) in expectUserDII", ec)) return;
998        FieldPosition pos=0;
999        dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1000        if (!assertSuccess("format in expectUserDII", ec)) return;
1001        assertEquals((UnicodeString)"\"" + locName + "\\" + datestr + "\\" + datestr_2 + "\"", ctou(data[i++]), str);
1002#ifdef DTIFMTTS_DEBUG
1003        char result[1000];
1004        char mesg[1000];
1005        PRINTMESG("interval format using user defined DateIntervalInfo\n");
1006        str.extract(0,  str.length(), result, "UTF-8");
1007        sprintf(mesg, "interval date: %s\n", result);
1008        PRINTMESG(mesg);
1009#endif
1010        delete dtitvfmt;
1011    }
1012}
1013
1014
1015void DateIntervalFormatTest::testStress() {
1016    if(quick){
1017    	logln("Quick mode: Skipping test");
1018    	return;
1019    }
1020	const char* DATA[] = {
1021        "yyyy MM dd HH:mm:ss",
1022        "2007 10 10 10:10:10", "2008 10 10 10:10:10",
1023        "2007 10 10 10:10:10", "2007 11 10 10:10:10",
1024        "2007 11 10 10:10:10", "2007 11 20 10:10:10",
1025        "2007 01 10 10:00:10", "2007 01 10 14:10:10",
1026        "2007 01 10 10:00:10", "2007 01 10 10:20:10",
1027        "2007 01 10 10:10:10", "2007 01 10 10:10:20",
1028    };
1029
1030    const char* testLocale[][3] = {
1031        //{"th", "", ""},
1032        {"en", "", ""},
1033        {"zh", "", ""},
1034        {"de", "", ""},
1035        {"ar", "", ""},
1036        {"en", "GB",  ""},
1037        {"fr", "", ""},
1038        {"it", "", ""},
1039        {"nl", "", ""},
1040        {"zh", "TW",  ""},
1041        {"ja", "", ""},
1042        {"pt", "BR", ""},
1043        {"ru", "", ""},
1044        {"pl", "", ""},
1045        {"tr", "", ""},
1046        {"es", "", ""},
1047        {"ko", "", ""},
1048        {"sv", "", ""},
1049        {"fi", "", ""},
1050        {"da", "", ""},
1051        {"pt", "PT", ""},
1052        {"ro", "", ""},
1053        {"hu", "", ""},
1054        {"he", "", ""},
1055        {"in", "", ""},
1056        {"cs", "", ""},
1057        {"el", "", ""},
1058        {"no", "", ""},
1059        {"vi", "", ""},
1060        {"bg", "", ""},
1061        {"hr", "", ""},
1062        {"lt", "", ""},
1063        {"sk", "", ""},
1064        {"sl", "", ""},
1065        {"sr", "", ""},
1066        {"ca", "", ""},
1067        {"lv", "", ""},
1068        {"uk", "", ""},
1069        {"hi", "", ""},
1070    };
1071
1072    uint32_t localeIndex;
1073    for ( localeIndex = 0; localeIndex < ARRAY_SIZE(testLocale); ++localeIndex ) {
1074        char locName[32];
1075        uprv_strcpy(locName, testLocale[localeIndex][0]);
1076        uprv_strcat(locName, testLocale[localeIndex][1]);
1077        stress(DATA, ARRAY_SIZE(DATA), Locale(testLocale[localeIndex][0], testLocale[localeIndex][1], testLocale[localeIndex][2]), locName);
1078    }
1079}
1080
1081
1082void DateIntervalFormatTest::stress(const char** data, int32_t data_length,
1083                                    const Locale& loc, const char* locName) {
1084    UnicodeString skeleton[] = {
1085        "EEEEdMMMMy",
1086        "dMMMMy",
1087        "dMMMM",
1088        "MMMMy",
1089        "EEEEdMMMM",
1090        "EdMMMy",
1091        "dMMMy",
1092        "dMMM",
1093        "MMMy",
1094        "EdMMM",
1095        "EdMy",
1096        "dMy",
1097        "dM",
1098        "My",
1099        "EdM",
1100        "d",
1101        "Ed",
1102        "y",
1103        "M",
1104        "MMM",
1105        "MMMM",
1106        "hm",
1107        "hmv",
1108        "hmz",
1109        "h",
1110        "hv",
1111        "hz",
1112        "EEddMMyyyy", // following could be normalized
1113        "EddMMy",
1114        "hhmm",
1115        "hhmmzz",
1116        "hms",  // following could not be normalized
1117        "dMMMMMy",
1118        "EEEEEdM",
1119    };
1120
1121    int32_t i = 0;
1122    UErrorCode ec = U_ZERO_ERROR;
1123    UnicodeString str, str2;
1124    SimpleDateFormat ref(data[i++], loc, ec);
1125    if (!assertSuccess("construct SimpleDateFormat", ec)) return;
1126
1127#ifdef DTIFMTTS_DEBUG
1128    char result[1000];
1129    char mesg[1000];
1130    sprintf(mesg, "locale: %s\n", locName);
1131    PRINTMESG(mesg);
1132#endif
1133
1134    while (i<data_length) {
1135
1136        // 'f'
1137        const char* datestr = data[i++];
1138        const char* datestr_2 = data[i++];
1139#ifdef DTIFMTTS_DEBUG
1140        sprintf(mesg, "original date: %s - %s\n", datestr, datestr_2);
1141        PRINTMESG(mesg)
1142#endif
1143        UDate date = ref.parse(ctou(datestr), ec);
1144        if (!assertSuccess("parse", ec)) return;
1145        UDate date_2 = ref.parse(ctou(datestr_2), ec);
1146        if (!assertSuccess("parse", ec)) return;
1147        DateInterval dtitv(date, date_2);
1148
1149        for ( uint32_t skeletonIndex = 0;
1150              skeletonIndex < ARRAY_SIZE(skeleton);
1151              ++skeletonIndex ) {
1152            const UnicodeString& oneSkeleton = skeleton[skeletonIndex];
1153            DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(oneSkeleton, loc, ec);
1154            if (!assertSuccess("createInstance(skeleton)", ec)) return;
1155            /*
1156            // reset the calendar to be Gregorian calendar for "th"
1157            if ( uprv_strcmp(locName, "th") == 0 ) {
1158                GregorianCalendar* gregCal = new GregorianCalendar(loc, ec);
1159                if (!assertSuccess("GregorianCalendar()", ec)) return;
1160                const DateFormat* dformat = dtitvfmt->getDateFormat();
1161                DateFormat* newOne = (DateFormat*)dformat->clone();
1162                newOne->adoptCalendar(gregCal);
1163                //dtitvfmt->adoptDateFormat(newOne, ec);
1164                dtitvfmt->setDateFormat(*newOne, ec);
1165                delete newOne;
1166                if (!assertSuccess("adoptDateFormat()", ec)) return;
1167            }
1168            */
1169            FieldPosition pos=0;
1170            dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1171            if (!assertSuccess("format", ec)) return;
1172#ifdef DTIFMTTS_DEBUG
1173            oneSkeleton.extract(0,  oneSkeleton.length(), result, "UTF-8");
1174            sprintf(mesg, "interval by skeleton: %s\n", result);
1175            PRINTMESG(mesg)
1176            str.extract(0,  str.length(), result, "UTF-8");
1177            sprintf(mesg, "interval date: %s\n", result);
1178            PRINTMESG(mesg)
1179#endif
1180            delete dtitvfmt;
1181        }
1182
1183        // test user created DateIntervalInfo
1184        ec = U_ZERO_ERROR;
1185        DateIntervalInfo* dtitvinf = new DateIntervalInfo(ec);
1186        dtitvinf->setFallbackIntervalPattern("{0} --- {1}", ec);
1187        dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_MONTH, "yyyy MMM d - MMM y",ec);
1188        if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1189        dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_HOUR_OF_DAY, "yyyy MMM d HH:mm - HH:mm", ec);
1190        if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1191        DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_ABBR_MONTH_DAY, loc, *dtitvinf, ec);
1192        delete dtitvinf;
1193        if (!assertSuccess("createInstance(skeleton,dtitvinf)", ec)) return;
1194        FieldPosition pos=0;
1195        dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1196        if ( uprv_strcmp(locName, "th") ) {
1197            if (!assertSuccess("format", ec)) return;
1198#ifdef DTIFMTTS_DEBUG
1199            PRINTMESG("interval format using user defined DateIntervalInfo\n");
1200            str.extract(0,  str.length(), result, "UTF-8");
1201            sprintf(mesg, "interval date: %s\n", result);
1202            PRINTMESG(mesg)
1203#endif
1204        } else {
1205            // for "th", the default calendar is Budhist,
1206            // not Gregorian.
1207            assertTrue("Default calendar for \"th\" is Budhist", ec == U_ILLEGAL_ARGUMENT_ERROR);
1208            ec = U_ZERO_ERROR;
1209        }
1210        delete dtitvfmt;
1211    }
1212}
1213
1214#endif /* #if !UCONFIG_NO_FORMATTING */
1215