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