OLD | NEW |
(Empty) | |
| 1 /******************************************************************** |
| 2 * COPYRIGHT: |
| 3 * Copyright (c) 1997-2010, International Business Machines Corporation and |
| 4 * others. All Rights Reserved. |
| 5 ********************************************************************/ |
| 6 /*******************************************************************************
* |
| 7 * |
| 8 * File CDTDPTST.C |
| 9 * |
| 10 * Modification History: |
| 11 * Name Description |
| 12 * Madhu Katragadda Creation |
| 13 ********************************************************************************
* |
| 14 */ |
| 15 /* INDEPTH TEST FOR DATE FORMAT */ |
| 16 |
| 17 #include "unicode/utypes.h" |
| 18 |
| 19 #if !UCONFIG_NO_FORMATTING |
| 20 |
| 21 #include "unicode/uloc.h" |
| 22 #include "unicode/udat.h" |
| 23 #include "unicode/ucal.h" |
| 24 #include "unicode/unum.h" |
| 25 #include "unicode/ustring.h" |
| 26 #include "cintltst.h" |
| 27 #include "cdtdptst.h" |
| 28 #include "cformtst.h" |
| 29 |
| 30 #include "cmemory.h" |
| 31 |
| 32 void addDtFrDepTest(TestNode** root); |
| 33 |
| 34 void addDtFrDepTest(TestNode** root) |
| 35 { |
| 36 addTest(root, &TestTwoDigitYearDSTParse, "tsformat/cdtdptst/TestTwoDigitYear
DSTParse"); |
| 37 addTest(root, &TestPartialParse994, "tsformat/cdtdptst/TestPartialParse994")
; |
| 38 addTest(root, &TestRunTogetherPattern985, "tsformat/cdtdptst/TestRunTogether
Pattern985"); |
| 39 addTest(root, &TestCzechMonths459, "tsformat/cdtdptst/TestCzechMonths459"); |
| 40 addTest(root, &TestQuotePattern161, "tsformat/cdtdptst/TestQuotePattern161")
; |
| 41 |
| 42 } |
| 43 |
| 44 /** |
| 45 * Test the parsing of 2-digit years. |
| 46 */ |
| 47 void TestTwoDigitYearDSTParse() |
| 48 { |
| 49 UDateFormat *fullFmt, *fmt; |
| 50 UErrorCode status = U_ZERO_ERROR; |
| 51 UChar *pattern; |
| 52 UDate d; |
| 53 UChar *s; |
| 54 int32_t pos; |
| 55 |
| 56 ctest_setTimeZone(NULL, &status); |
| 57 |
| 58 pattern=(UChar*)malloc(sizeof(UChar) * (strlen("EEE MMM dd HH:mm:ss.SSS zzz
yyyy G")+1 )); |
| 59 u_uastrcpy(pattern, "EEE MMM dd HH:mm:ss.SSS zzz yyyy G"); |
| 60 fullFmt= udat_open(UDAT_IGNORE, UDAT_IGNORE,"en_US",NULL,0,pattern, u_strlen
(pattern),&status); |
| 61 if(U_FAILURE(status)) { |
| 62 log_data_err("FAIL: Error in creating a date format using udat_openPatte
rn %s - (Are you missing data?)\n", |
| 63 myErrorName(status) ); |
| 64 } |
| 65 else { |
| 66 log_verbose("PASS: creating dateformat using udat_openPattern() succesfu
l\n"); |
| 67 |
| 68 u_uastrcpy(pattern, "dd-MMM-yy h:mm:ss 'o''clock' a z"); |
| 69 fmt= udat_open(UDAT_IGNORE,UDAT_IGNORE,"en_US", NULL, 0,pattern, u_strle
n(pattern), &status); |
| 70 |
| 71 |
| 72 s=(UChar*)malloc(sizeof(UChar) * (strlen("03-Apr-04 2:20:47 o'clock AM P
ST")+1) ); |
| 73 u_uastrcpy(s, "03-Apr-04 2:20:47 o'clock AM PST"); |
| 74 pos=0; |
| 75 d = udat_parse(fmt, s, u_strlen(s), &pos, &status); |
| 76 if (U_FAILURE(status)) { |
| 77 log_err("FAIL: Could not parse \"%s\"\n", austrdup(s)); |
| 78 } else { |
| 79 UCalendar *cal = ucal_open(NULL, 0, uloc_getDefault(), UCAL_TRADITIO
NAL, &status); |
| 80 if (U_FAILURE(status)) { |
| 81 log_err_status(status, "FAIL: Could not open calendar: %s\n", u_
errorName(status)); |
| 82 } else { |
| 83 int32_t h; |
| 84 ucal_setMillis(cal, d, &status); |
| 85 h = ucal_get(cal, UCAL_HOUR_OF_DAY, &status); |
| 86 if (U_FAILURE(status)) { |
| 87 log_err("FAIL: Some calendar operations failed"); |
| 88 } else if (h != 2) { |
| 89 log_err("FAIL: Parse of \"%s\" returned HOUR_OF_DAY %d\n", |
| 90 austrdup(s), h); |
| 91 } |
| 92 ucal_close(cal); |
| 93 } |
| 94 } |
| 95 |
| 96 udat_close(fullFmt); |
| 97 udat_close(fmt); |
| 98 free(s); |
| 99 } |
| 100 free(pattern); |
| 101 |
| 102 ctest_resetTimeZone(); |
| 103 } |
| 104 |
| 105 |
| 106 /** |
| 107 * Verify that strings which contain incomplete specifications are parsed |
| 108 * correctly. In some instances, this means not being parsed at all, and |
| 109 * returning an appropriate error. |
| 110 */ |
| 111 void TestPartialParse994() |
| 112 { |
| 113 int32_t pos; |
| 114 UDateFormat *f; |
| 115 UErrorCode status = U_ZERO_ERROR; |
| 116 UChar *s; |
| 117 UChar *fmtChars; |
| 118 UDate d, null; |
| 119 null=0; |
| 120 |
| 121 /* this is supposed to open default date format, but later on it treats it l
ike it is "en_US" |
| 122 - very bad if you try to run the tests on machine where default locale is
NOT "en_US" */ |
| 123 /* f = udat_open(UDAT_DEFAULT, UDAT_SHORT, NULL, NULL, 0, &status); */ |
| 124 f = udat_open(UDAT_DEFAULT, UDAT_SHORT, "en_US", NULL, 0, NULL, 0,&status); |
| 125 if(U_FAILURE(status)){ |
| 126 log_data_err("FAIL: ErrorCode received during test: %s (Are you missing
data?)\n", myErrorName(status)); |
| 127 return; |
| 128 } |
| 129 s=(UChar*)malloc(sizeof(UChar) * (strlen("01/01/1997 10:11:42 AM")+1) ); |
| 130 u_uastrcpy(s, "01/01/1997 10:11:42 AM"); |
| 131 pos=0; |
| 132 d = udat_parse(f, s, u_strlen(s), &pos, &status); |
| 133 if(U_FAILURE(status)) { |
| 134 log_data_err("FAIL: could not parse - exitting"); |
| 135 return; |
| 136 } |
| 137 fmtChars = myDateFormat(f, d); |
| 138 if(fmtChars) { |
| 139 log_verbose("%s\n", fmtChars); |
| 140 } else { |
| 141 log_data_err("FAIL: could not format \n"); |
| 142 return; |
| 143 } |
| 144 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/01 10:11:42", d); |
| 145 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/01 10:", null); |
| 146 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/01 10", null); |
| 147 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/01 ", null); |
| 148 tryPat994(f, "yy/MM/dd HH:mm:ss", "97/01/01", null); |
| 149 udat_close(f); |
| 150 free(s); |
| 151 } |
| 152 |
| 153 |
| 154 |
| 155 void tryPat994(UDateFormat* format, const char* pattern, const char* s, UDate ex
pected) |
| 156 { |
| 157 UChar *f; |
| 158 UChar *str, *pat; |
| 159 UDate date; |
| 160 UDate null=0; |
| 161 int32_t pos; |
| 162 UErrorCode status = U_ZERO_ERROR; |
| 163 str=(UChar*)malloc(sizeof(UChar) * (strlen(s) + 1) ); |
| 164 u_uastrcpy(str, s); |
| 165 pat=(UChar*)malloc(sizeof(UChar) * (strlen(pattern) + 1) ); |
| 166 u_uastrcpy(pat, pattern); |
| 167 log_verbose("Pattern : %s ; String : %s\n", austrdup(pat), austrdup(str)); |
| 168 udat_applyPattern(format, FALSE, pat, u_strlen(pat)); |
| 169 pos=0; |
| 170 date = udat_parse(format, str, u_strlen(str), &pos, &status); |
| 171 if(U_FAILURE(status) || date == null) { |
| 172 log_verbose("ParseException: : %s\n", myErrorName(status) ); |
| 173 if (expected != null) |
| 174 log_err("FAIL: Expected: %s\n", austrdup(myDateFormat(format, expec
ted)) ); |
| 175 } |
| 176 else { |
| 177 f=myDateFormat(format, date); |
| 178 log_verbose(" parse( %s ) -> %s\n", austrdup(str), austrdup(f)); |
| 179 if (expected == null || date != expected) |
| 180 log_err("FAIL: Expected null for \"%s\"\n", s); |
| 181 if (u_strcmp(f, str) !=0) |
| 182 log_err("FAIL: Expected : %s\n", austrdup(str) ); |
| 183 } |
| 184 |
| 185 free(str); |
| 186 free(pat); |
| 187 } |
| 188 |
| 189 |
| 190 /** |
| 191 * Verify the behavior of patterns in which digits for different fields run toge
ther |
| 192 * without intervening separators. |
| 193 */ |
| 194 void TestRunTogetherPattern985() |
| 195 { |
| 196 int32_t pos; |
| 197 UChar *pattern=NULL, *now=NULL, *then=NULL; |
| 198 UDateFormat *format; |
| 199 UDate date1, date2; |
| 200 UErrorCode status = U_ZERO_ERROR; |
| 201 pattern=(UChar*)malloc(sizeof(UChar) * (strlen("yyyyMMddHHmmssSSS")+1) ); |
| 202 u_uastrcpy(pattern, "yyyyMMddHHmmssSSS"); |
| 203 format = udat_open(UDAT_IGNORE, UDAT_IGNORE, NULL, NULL, 0,pattern, u_strlen
(pattern), &status); |
| 204 if(U_FAILURE(status)){ |
| 205 log_data_err("FAIL: Error in date format construction with pattern: %s -
(Are you missing data?)\n", myErrorName(status)); |
| 206 return; |
| 207 } |
| 208 date1 = ucal_getNow(); |
| 209 now=myDateFormat(format, date1); |
| 210 log_verbose("%s\n", austrdup(now) ); |
| 211 pos = 0; |
| 212 date2 = udat_parse(format, now, u_strlen(now), &pos, &status); |
| 213 if (date2 == 0) log_verbose("Parse stopped at : %d\n", pos); |
| 214 else then=myDateFormat(format, date2); |
| 215 log_verbose("%s\n", austrdup(then) ); |
| 216 if (!(date2 == date1)) log_err("FAIL\n"); |
| 217 |
| 218 udat_close(format); |
| 219 free(pattern); |
| 220 |
| 221 } |
| 222 |
| 223 /** |
| 224 * Verify the handling of Czech June and July, which have the unique attribute t
hat |
| 225 * one is a proper prefix substring of the other. |
| 226 */ |
| 227 void TestCzechMonths459() |
| 228 { |
| 229 int32_t lneed, pos; |
| 230 UChar *pattern=NULL, *tzID=NULL; |
| 231 UChar *juneStr, *julyStr; |
| 232 UDateFormat *fmt; |
| 233 UCalendar *cal; |
| 234 UDate june, july, d; |
| 235 UErrorCode status = U_ZERO_ERROR; |
| 236 UChar *date; |
| 237 |
| 238 ctest_setTimeZone(NULL, &status); |
| 239 fmt = udat_open(UDAT_FULL, UDAT_FULL, "cs", NULL, 0, NULL, 0, &status); |
| 240 if(U_FAILURE(status)){ |
| 241 log_data_err("Error in constructing the date format -> %s (Are you missi
ng data?)\n", u_errorName(status)); |
| 242 ctest_resetTimeZone(); |
| 243 return; |
| 244 } |
| 245 lneed=0; |
| 246 lneed=udat_toPattern(fmt, TRUE, NULL, lneed, &status); |
| 247 if(status==U_BUFFER_OVERFLOW_ERROR){ |
| 248 status=U_ZERO_ERROR; |
| 249 pattern=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); |
| 250 udat_toPattern(fmt, TRUE, pattern, lneed+1, &status); |
| 251 } |
| 252 if(U_FAILURE(status)){ log_err("Error in extracting the pattern\n"); } |
| 253 tzID=(UChar*)malloc(sizeof(UChar) * 4); |
| 254 u_uastrcpy(tzID, "GMT"); |
| 255 cal=ucal_open(tzID, u_strlen(tzID), "cs", UCAL_GREGORIAN, &status); |
| 256 if(U_FAILURE(status)){ log_err("error in ucal_open caldef : %s\n", myErrorNa
me(status)); } |
| 257 |
| 258 ucal_setDate(cal, 1997, UCAL_JUNE, 15, &status); |
| 259 june=ucal_getMillis(cal, &status); |
| 260 ucal_setDate(cal, 1997, UCAL_JULY, 15, &status); |
| 261 july=ucal_getMillis(cal, &status); |
| 262 |
| 263 juneStr = myDateFormat(fmt, june); |
| 264 julyStr = myDateFormat(fmt, july); |
| 265 pos=0; |
| 266 if(juneStr == NULL) { |
| 267 log_data_err("Can't load juneStr. Quitting.\n"); |
| 268 return; |
| 269 } |
| 270 d = udat_parse(fmt, juneStr, u_strlen(juneStr), &pos, &status); |
| 271 date = myDateFormat(fmt, d); |
| 272 |
| 273 if(U_SUCCESS(status)){ |
| 274 UChar* out1 = myDateFormat(fmt, june); |
| 275 UChar* out2 = myDateFormat(fmt, d); |
| 276 if(u_strcmp(out1, out2) !=0) |
| 277 log_err("Error in handling the czech month june\n"); |
| 278 else |
| 279 log_verbose("Pass: Date = %s (czech month June)\n", aescstrdup(date,
-1)); |
| 280 }else{ |
| 281 log_err("udat_parse failed. Error. %s\n",u_errorName(status)); |
| 282 } |
| 283 pos=0; |
| 284 d = udat_parse(fmt, julyStr, u_strlen(julyStr), &pos, &status); |
| 285 date = myDateFormat(fmt, d); |
| 286 if(u_strcmp(myDateFormat(fmt, july), myDateFormat(fmt, d) ) !=0) |
| 287 log_err("Error in handling the czech month july\n"); |
| 288 else |
| 289 log_verbose("Pass: Date = %s (czech month July)\n", aescstrdup(date, -1)
); |
| 290 |
| 291 ctest_resetTimeZone(); |
| 292 udat_close(fmt); |
| 293 ucal_close(cal); |
| 294 free(pattern); |
| 295 free(tzID); |
| 296 } |
| 297 |
| 298 /** |
| 299 * Test the handling of single quotes in patterns. |
| 300 */ |
| 301 void TestQuotePattern161() |
| 302 { |
| 303 UDateFormat *format; |
| 304 UCalendar *cal; |
| 305 UDate currentTime_1; |
| 306 UChar *pattern, *tzID, *exp; |
| 307 UChar *dateString; |
| 308 UErrorCode status = U_ZERO_ERROR; |
| 309 const char* expStr = "04/13/1999 at 10:42:28 AM "; |
| 310 |
| 311 ctest_setTimeZone(NULL, &status); |
| 312 |
| 313 pattern=(UChar*)malloc(sizeof(UChar) * (strlen("MM/dd/yyyy 'at' hh:mm:ss a z
zz")+1) ); |
| 314 u_uastrcpy(pattern, "MM/dd/yyyy 'at' hh:mm:ss a zzz"); |
| 315 |
| 316 /* this is supposed to open default date format, but later on it treats it l
ike it is "en_US" |
| 317 - very bad if you try to run the tests on machine where default locale is
NOT "en_US" */ |
| 318 /* format= udat_openPattern(pattern, u_strlen(pattern), NULL, &status); */ |
| 319 format= udat_open(UDAT_IGNORE, UDAT_IGNORE,"en_US", NULL, 0,pattern, u_strle
n(pattern), &status); |
| 320 if(U_FAILURE(status)){ |
| 321 log_data_err("error in udat_open: %s - (Are you missing data?)\n", myErr
orName(status)); |
| 322 return; |
| 323 } |
| 324 tzID=(UChar*)malloc(sizeof(UChar) * 4); |
| 325 u_uastrcpy(tzID, "PST"); |
| 326 /* this is supposed to open default date format, but later on it treats it l
ike it is "en_US" |
| 327 - very bad if you try to run the tests on machine where default locale is
NOT "en_US" */ |
| 328 /* cal=ucal_open(tzID, u_strlen(tzID), NULL, UCAL_TRADITIONAL, &status); */ |
| 329 cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status); |
| 330 if(U_FAILURE(status)){ log_err("error in ucal_open cal : %s\n", myErrorName(
status)); } |
| 331 |
| 332 ucal_setDateTime(cal, 1999, UCAL_APRIL, 13, 10, 42, 28, &status); |
| 333 currentTime_1 = ucal_getMillis(cal, &status); |
| 334 |
| 335 dateString = myDateFormat(format, currentTime_1); |
| 336 exp=(UChar*)malloc(sizeof(UChar) * (strlen(expStr) + 1) ); |
| 337 u_uastrcpy(exp, expStr); |
| 338 |
| 339 log_verbose("%s\n", austrdup(dateString) ); |
| 340 if(u_strncmp(dateString, exp, (int32_t)strlen(expStr)) !=0) |
| 341 log_err("Error in formatting a pattern with single quotes\n"); |
| 342 |
| 343 udat_close(format); |
| 344 ucal_close(cal); |
| 345 free(exp); |
| 346 free(tzID); |
| 347 free(pattern); |
| 348 |
| 349 ctest_resetTimeZone(); |
| 350 } |
| 351 |
| 352 #endif /* #if !UCONFIG_NO_FORMATTING */ |
OLD | NEW |