1// © 2016 and later: Unicode, Inc. and others. 2// License & terms of use: http://www.unicode.org/copyright.html 3/*********************************************************************** 4 * Copyright (c) 1997-2011, International Business Machines Corporation 5 * and others. All Rights Reserved. 6 ***********************************************************************/ 7 8#include "unicode/utypes.h" 9 10#if !UCONFIG_NO_FORMATTING 11 12#include "miscdtfm.h" 13 14#include "unicode/format.h" 15#include "unicode/decimfmt.h" 16#include "unicode/datefmt.h" 17#include "unicode/smpdtfmt.h" 18#include "unicode/dtfmtsym.h" 19#include "unicode/locid.h" 20#include "unicode/msgfmt.h" 21#include "unicode/numfmt.h" 22#include "unicode/choicfmt.h" 23#include "unicode/gregocal.h" 24 25// ***************************************************************************** 26// class DateFormatMiscTests 27// ***************************************************************************** 28 29#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break; 30 31void 32DateFormatMiscTests::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) 33{ 34 // if (exec) logln((UnicodeString)"TestSuite DateFormatMiscTests"); 35 switch (index) { 36 CASE(0, test4097450) 37 CASE(1, test4099975) 38 CASE(2, test4117335) 39 40 default: name = ""; break; 41 } 42} 43 44UBool 45DateFormatMiscTests::failure(UErrorCode status, const char* msg) 46{ 47 if(U_FAILURE(status)) { 48 errcheckln(status, UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status)); 49 return TRUE; 50 } 51 52 return FALSE; 53} 54 55/* 56 * @bug 4097450 57 */ 58void 59DateFormatMiscTests::test4097450() 60{ 61 // 62 // Date parse requiring 4 digit year. 63 // 64 UnicodeString dstring [] = { 65 UnicodeString("97"), 66 UnicodeString("1997"), 67 UnicodeString("97"), 68 UnicodeString("1997"), 69 UnicodeString("01"), 70 UnicodeString("2001"), 71 UnicodeString("01"), 72 UnicodeString("2001"), 73 UnicodeString("1"), 74 UnicodeString("1"), 75 UnicodeString("11"), 76 UnicodeString("11"), 77 UnicodeString("111"), 78 UnicodeString("111") 79 }; 80 81 UnicodeString dformat [] = { 82 UnicodeString("yy"), 83 UnicodeString("yy"), 84 UnicodeString("yyyy"), 85 UnicodeString("yyyy"), 86 UnicodeString("yy"), 87 UnicodeString("yy"), 88 UnicodeString("yyyy"), 89 UnicodeString("yyyy"), 90 UnicodeString("yy"), 91 UnicodeString("yyyy"), 92 UnicodeString("yy"), 93 UnicodeString("yyyy"), 94 UnicodeString("yy"), 95 UnicodeString("yyyy") 96 }; 97 98/* UBool dresult [] = { 99 TRUE, 100 FALSE, 101 FALSE, 102 TRUE, 103 TRUE, 104 FALSE, 105 FALSE, 106 TRUE, 107 FALSE, 108 FALSE, 109 TRUE, 110 FALSE, 111 FALSE, 112 FALSE 113 };*/ 114 115 UErrorCode status = U_ZERO_ERROR; 116 SimpleDateFormat *formatter; 117 SimpleDateFormat *resultFormatter = new SimpleDateFormat((UnicodeString)"yyyy", status); 118 if (U_FAILURE(status)) { 119 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status)); 120 return; 121 } 122 123 logln("Format\tSource\tResult"); 124 logln("-------\t-------\t-------"); 125 for (int i = 0; i < 14/*dstring.length*/; i++) 126 { 127 log(dformat[i] + "\t" + dstring[i] + "\t"); 128 formatter = new SimpleDateFormat(dformat[i], status); 129 if(failure(status, "new SimpleDateFormat")) return; 130 //try { 131 UnicodeString str; 132 FieldPosition pos(FieldPosition::DONT_CARE); 133 logln(resultFormatter->format(formatter->parse(dstring[i], status), str, pos)); 134 failure(status, "resultFormatter->format"); 135 //if ( !dresult[i] ) System.out.print(" <-- error!"); 136 /*} 137 catch (ParseException exception) { 138 //if ( dresult[i] ) System.out.print(" <-- error!"); 139 System.out.print("exception --> " + exception); 140 }*/ 141 delete formatter; 142 logln(); 143 } 144 145 delete resultFormatter; 146} 147 148/* 149 * @bug 4099975 150 */ 151void 152DateFormatMiscTests::test4099975() 153{ 154 /** 155 * Test Constructor SimpleDateFormat::SimpleDateFormat (const UnicodeString & pattern, 156 * const DateFormatSymbols & formatData, UErrorCode & status ) 157 * The DateFormatSymbols object is NOT adopted; Modifying the original DateFormatSymbols 158 * should not change the SimpleDateFormat's behavior. 159 */ 160 UDate d = Calendar::getNow(); 161 { 162 UErrorCode status = U_ZERO_ERROR; 163 DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status); 164 if (U_FAILURE(status)) { 165 dataerrln("Unable to create DateFormatSymbols - %s", u_errorName(status)); 166 return; 167 } 168 SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), *symbols, status); 169 if(failure(status, "new SimpleDateFormat")) return; 170 UnicodeString format0; 171 format0 = df->format(d, format0); 172 UnicodeString localizedPattern0; 173 localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status); 174 failure(status, "df->toLocalizedPattern"); 175 symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field 176 UnicodeString format1; 177 format1 = df->format(d, format1); 178 if (format0 != format1) { 179 errln(UnicodeString("Formats are different. format0: ") + format0 180 + UnicodeString("; format1: ") + format1); 181 } 182 UnicodeString localizedPattern1; 183 localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status); 184 failure(status, "df->toLocalizedPattern"); 185 if (localizedPattern0 != localizedPattern1) { 186 errln(UnicodeString("Pattern has been changed. localizedPattern0: ") + localizedPattern0 187 + UnicodeString("; localizedPattern1: ") + localizedPattern1); 188 } 189 delete symbols; 190 delete df; 191 } 192 /* 193 * Test void SimpleDateFormat::setDateFormatSymbols ( const DateFormatSymbols & newFormatSymbols ) 194 * Modifying the original DateFormatSymbols should not change the SimpleDateFormat's behavior. 195 */ 196 { 197 UErrorCode status = U_ZERO_ERROR; 198 DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status); 199 if(failure(status, "new DateFormatSymbols")) return; 200 SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), status); 201 if(failure(status, "new SimpleDateFormat")) return; 202 df->setDateFormatSymbols(*symbols); 203 UnicodeString format0; 204 format0 = df->format(d, format0); 205 UnicodeString localizedPattern0; 206 localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status); 207 failure(status, "df->toLocalizedPattern"); 208 symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field 209 UnicodeString format1; 210 format1 = df->format(d, format1); 211 if (format0 != format1) { 212 errln(UnicodeString("Formats are different. format0: ") + format0 213 + UnicodeString("; format1: ") + format1); 214 } 215 UnicodeString localizedPattern1; 216 localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status); 217 failure(status, "df->toLocalizedPattern"); 218 if (localizedPattern0 != localizedPattern1) { 219 errln(UnicodeString("Pattern has been changed. localizedPattern0: ") + localizedPattern0 220 + UnicodeString("; localizedPattern1: ") + localizedPattern1); 221 } 222 delete symbols; 223 delete df; 224 225 } 226 //Test the pointer version of the constructor (and the adoptDateFormatSymbols method) 227 { 228 UErrorCode status = U_ZERO_ERROR; 229 DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status); 230 if(failure(status, "new DateFormatSymbols")) return; 231 SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), symbols, status); 232 if(failure(status, "new SimpleDateFormat")) return; 233 UnicodeString format0; 234 format0 = df->format(d, format0); 235 UnicodeString localizedPattern0; 236 localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status); 237 failure(status, "df->toLocalizedPattern"); 238 symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field 239 UnicodeString format1; 240 format1 = df->format(d, format1); 241 if (format0 != format1) { 242 errln(UnicodeString("Formats are different. format0: ") + format0 243 + UnicodeString("; format1: ") + format1); 244 } 245 UnicodeString localizedPattern1; 246 localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status); 247 failure(status, "df->toLocalizedPattern"); 248 if (localizedPattern0 == localizedPattern1) { 249 errln(UnicodeString("Pattern should have been changed. localizedPattern0: ") + localizedPattern0 250 + UnicodeString("; localizedPattern1: ") + localizedPattern1); 251 } 252 //delete symbols; the caller is no longer responsible for deleting the symbols 253 delete df; 254 } 255 // 256 { 257 UErrorCode status = U_ZERO_ERROR; 258 DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status); 259 failure(status, "new DateFormatSymbols"); 260 SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), status); 261 if(failure(status, "new SimpleDateFormat")) return; 262 df-> adoptDateFormatSymbols(symbols); 263 UnicodeString format0; 264 format0 = df->format(d, format0); 265 UnicodeString localizedPattern0; 266 localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status); 267 failure(status, "df->toLocalizedPattern"); 268 symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field 269 UnicodeString format1; 270 format1 = df->format(d, format1); 271 if (format0 != format1) { 272 errln(UnicodeString("Formats are different. format0: ") + format0 273 + UnicodeString("; format1: ") + format1); 274 } 275 UnicodeString localizedPattern1; 276 localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status); 277 failure(status, "df->toLocalizedPattern"); 278 if (localizedPattern0 == localizedPattern1) { 279 errln(UnicodeString("Pattern should have been changed. localizedPattern0: ") + localizedPattern0 280 + UnicodeString("; localizedPattern1: ") + localizedPattern1); 281 } 282 //delete symbols; the caller is no longer responsible for deleting the symbols 283 delete df; 284 } 285} 286 287/* 288 * @test @(#)bug4117335.java 1.1 3/5/98 289 * 290 * @bug 4117335 291 */ 292void 293DateFormatMiscTests::test4117335() 294{ 295 //UnicodeString bc = "\u7d00\u5143\u524d"; 296 UChar bcC [] = { 297 0x7D00, 298 0x5143, 299 0x524D 300 }; 301 UnicodeString bc(bcC, 3, 3); 302 303 //UnicodeString ad = "\u897f\u66a6"; 304 UChar adC [] = { 305 0x897F, 306 0x66A6 307 }; 308 UnicodeString ad(adC, 2, 2); 309 310 //UnicodeString jstLong = "\u65e5\u672c\u6a19\u6e96\u6642"; 311 UChar jstLongC [] = { 312 0x65e5, 313 0x672c, 314 0x6a19, 315 0x6e96, 316 0x6642 317 }; 318 UChar jdtLongC [] = {0x65E5, 0x672C, 0x590F, 0x6642, 0x9593}; 319 320 UnicodeString jstLong(jstLongC, 5, 5); 321 322// UnicodeString jstShort = "JST"; 323 324 UnicodeString tzID = "Asia/Tokyo"; 325 326 UnicodeString jdtLong(jdtLongC, 5, 5); 327 328// UnicodeString jdtShort = "JDT"; 329 UErrorCode status = U_ZERO_ERROR; 330 DateFormatSymbols *symbols = new DateFormatSymbols(Locale::getJapan(), status); 331 if(U_FAILURE(status)) { 332 dataerrln("Failure creating DateFormatSymbols, %s", u_errorName(status)); 333 delete symbols; 334 return; 335 } 336 failure(status, "new DateFormatSymbols"); 337 int32_t eraCount = 0; 338 const UnicodeString *eras = symbols->getEraNames(eraCount); 339 340 logln(UnicodeString("BC = ") + eras[0]); 341 if (eras[0] != bc) { 342 errln("*** Should have been " + bc); 343 //throw new Exception("Error in BC"); 344 } 345 346 logln(UnicodeString("AD = ") + eras[1]); 347 if (eras[1] != ad) { 348 errln("*** Should have been " + ad); 349 //throw new Exception("Error in AD"); 350 } 351 352 int32_t rowCount, colCount; 353 const UnicodeString **zones = symbols->getZoneStrings(rowCount, colCount); 354 //don't hard code the index .. compute it. 355 int32_t index = -1; 356 for (int32_t i = 0; i < rowCount; ++i) { 357 if (tzID == (zones[i][0])) { 358 index = i; 359 break; 360 } 361 } 362 logln(UnicodeString("Long zone name = ") + zones[index][1]); 363 if (zones[index][1] != jstLong) { 364 errln("*** Should have been " + prettify(jstLong)+ " but it is: " + prettify(zones[index][1])); 365 //throw new Exception("Error in long TZ name"); 366 } 367// logln(UnicodeString("Short zone name = ") + zones[index][2]); 368// if (zones[index][2] != jstShort) { 369// errln("*** Should have been " + prettify(jstShort) + " but it is: " + prettify(zones[index][2])); 370// //throw new Exception("Error in short TZ name"); 371// } 372 logln(UnicodeString("Long zone name = ") + zones[index][3]); 373 if (zones[index][3] != jdtLong) { 374 errln("*** Should have been " + prettify(jstLong) + " but it is: " + prettify(zones[index][3])); 375 //throw new Exception("Error in long TZ name"); 376 } 377// logln(UnicodeString("SHORT zone name = ") + zones[index][4]); 378// if (zones[index][4] != jdtShort) { 379// errln("*** Should have been " + prettify(jstShort)+ " but it is: " + prettify(zones[index][4])); 380// //throw new Exception("Error in short TZ name"); 381// } 382 delete symbols; 383 384} 385 386#endif /* #if !UCONFIG_NO_FORMATTING */ 387