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