| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 ********************************************************************** | |
| 3 * Copyright (c) 2010-2011,International Business Machines | |
| 4 * Corporation and others. All Rights Reserved. | |
| 5 ********************************************************************** | |
| 6 ********************************************************************** | |
| 7 */ | |
| 8 | |
| 9 #ifndef _DTFMTRTPERF_H | |
| 10 #define _DTFMTRTPERF_H | |
| 11 | |
| 12 #include "unicode/utypes.h" | |
| 13 #include "unicode/uperf.h" | |
| 14 #include "unicode/timezone.h" | |
| 15 #include "unicode/simpletz.h" | |
| 16 #include "unicode/calendar.h" | |
| 17 #include "unicode/strenum.h" | |
| 18 #include "unicode/smpdtfmt.h" | |
| 19 #include "unicode/uchar.h" | |
| 20 #include "unicode/basictz.h" | |
| 21 #include "cstring.h" | |
| 22 | |
| 23 #include "unicode/uperf.h" | |
| 24 #include "unicode/unistr.h" | |
| 25 #include "unicode/datefmt.h" | |
| 26 #include "unicode/calendar.h" | |
| 27 #include "unicode/uclean.h" | |
| 28 #include "unicode/brkiter.h" | |
| 29 #include "util.h" | |
| 30 | |
| 31 static const char* PATTERNS[] = {"z", "zzzz", "Z", "ZZZZ", "v", "vvvv", "V", "VV
VV"}; | |
| 32 static const int NUM_PATTERNS = sizeof(PATTERNS)/sizeof(const char*); | |
| 33 | |
| 34 #include <iostream> | |
| 35 #include <stdlib.h> | |
| 36 #include <fstream> | |
| 37 #include <string> | |
| 38 using namespace std; | |
| 39 | |
| 40 // Stubs for Windows API functions when building on UNIXes. | |
| 41 // | |
| 42 #if U_PLATFORM_USES_ONLY_WIN32_API | |
| 43 // do nothing | |
| 44 #else | |
| 45 #define _UNICODE | |
| 46 typedef int DWORD; | |
| 47 inline int FoldStringW(DWORD dwMapFlags, const UChar* lpSrcStr,int cchSrc, UChar
* lpDestStr,int cchDest); | |
| 48 #endif | |
| 49 | |
| 50 class DateTimeRoundTripFunction : public UPerfFunction | |
| 51 { | |
| 52 private: | |
| 53 int nLocales; | |
| 54 public: | |
| 55 | |
| 56 DateTimeRoundTripFunction() | |
| 57 { | |
| 58 nLocales = 0; | |
| 59 } | |
| 60 | |
| 61 DateTimeRoundTripFunction(int locs) | |
| 62 { | |
| 63 nLocales = locs; | |
| 64 } | |
| 65 | |
| 66 virtual void call(UErrorCode* status) | |
| 67 { | |
| 68 *status = U_ZERO_ERROR; | |
| 69 | |
| 70 SimpleTimeZone unknownZone(-31415, (UnicodeString)"Etc/Unknown"); | |
| 71 int32_t badDstOffset = -1234; | |
| 72 int32_t badZoneOffset = -2345; | |
| 73 | |
| 74 int32_t testDateData[][3] = { | |
| 75 {2007, 1, 15}, | |
| 76 {2007, 6, 15}, | |
| 77 {1990, 1, 15}, | |
| 78 {1990, 6, 15}, | |
| 79 {1960, 1, 15}, | |
| 80 {1960, 6, 15}, | |
| 81 }; | |
| 82 | |
| 83 Calendar *cal = Calendar::createInstance(*status); | |
| 84 if (U_FAILURE(*status)) { | |
| 85 //dataerrln("Calendar::createInstance failed: %s", u_errorName(*stat
us)); | |
| 86 return; | |
| 87 } | |
| 88 | |
| 89 // Set up rule equivalency test range | |
| 90 UDate low, high; | |
| 91 cal->set(1900, UCAL_JANUARY, 1); | |
| 92 low = cal->getTime(*status); | |
| 93 cal->set(2040, UCAL_JANUARY, 1); | |
| 94 high = cal->getTime(*status); | |
| 95 if (U_FAILURE(*status)) { | |
| 96 //errln("getTime failed"); | |
| 97 return; | |
| 98 } | |
| 99 | |
| 100 // Set up test dates | |
| 101 UDate DATES[(sizeof(testDateData)/sizeof(int32_t))/3]; | |
| 102 const int32_t nDates = (sizeof(testDateData)/sizeof(int32_t))/3; | |
| 103 cal->clear(); | |
| 104 for (int32_t i = 0; i < nDates; i++) { | |
| 105 cal->set(testDateData[i][0], testDateData[i][1], testDateData[i][2])
; | |
| 106 DATES[i] = cal->getTime(*status); | |
| 107 if (U_FAILURE(*status)) { | |
| 108 //errln("getTime failed"); | |
| 109 return; | |
| 110 } | |
| 111 } | |
| 112 | |
| 113 // Set up test locales | |
| 114 const Locale testLocales[] = { | |
| 115 Locale("en"), | |
| 116 Locale("en_US"), | |
| 117 Locale("en_AU"), | |
| 118 Locale("de_DE"), | |
| 119 Locale("fr"), | |
| 120 Locale("ja_JP"), | |
| 121 Locale("ko"), | |
| 122 Locale("pt"), | |
| 123 Locale("th_TH"), | |
| 124 Locale("zh_Hans"), | |
| 125 | |
| 126 Locale("it"), | |
| 127 | |
| 128 Locale("en"), | |
| 129 Locale("en_US"), | |
| 130 Locale("en_AU"), | |
| 131 Locale("de_DE"), | |
| 132 Locale("fr"), | |
| 133 Locale("ja_JP"), | |
| 134 Locale("ko"), | |
| 135 Locale("pt"), | |
| 136 Locale("th_TH"), | |
| 137 Locale("zh_Hans"), | |
| 138 }; | |
| 139 | |
| 140 const Locale *LOCALES; | |
| 141 LOCALES = testLocales; | |
| 142 | |
| 143 StringEnumeration *tzids = TimeZone::createEnumeration(); | |
| 144 if (U_FAILURE(*status)) { | |
| 145 //errln("tzids->count failed"); | |
| 146 return; | |
| 147 } | |
| 148 | |
| 149 // Run the roundtrip test | |
| 150 for (int32_t locidx = 0; locidx < nLocales; locidx++) { | |
| 151 for (int32_t patidx = 0; patidx < NUM_PATTERNS; patidx++) { | |
| 152 SimpleDateFormat *sdf = new SimpleDateFormat((UnicodeString)PATT
ERNS[patidx], LOCALES[locidx], *status); | |
| 153 if (U_FAILURE(*status)) { | |
| 154 //errcheckln(*status, (UnicodeString)"new SimpleDateFormat f
ailed for pattern " + | |
| 155 // PATTERNS[patidx] + " for locale " + LOCALES[locidx].ge
tName() + " - " + u_errorName(*status)); | |
| 156 *status = U_ZERO_ERROR; | |
| 157 continue; | |
| 158 } | |
| 159 | |
| 160 tzids->reset(*status); | |
| 161 const UnicodeString *tzid; | |
| 162 while ((tzid = tzids->snext(*status))) { | |
| 163 TimeZone *tz = TimeZone::createTimeZone(*tzid); | |
| 164 | |
| 165 for (int32_t datidx = 0; datidx < nDates; datidx++) { | |
| 166 UnicodeString tzstr; | |
| 167 FieldPosition fpos(0); | |
| 168 | |
| 169 // Format | |
| 170 sdf->setTimeZone(*tz); | |
| 171 sdf->format(DATES[datidx], tzstr, fpos); | |
| 172 | |
| 173 // Before parse, set unknown zone to SimpleDateFormat in
stance | |
| 174 // just for making sure that it does not depends on the
time zone | |
| 175 // originally set. | |
| 176 sdf->setTimeZone(unknownZone); | |
| 177 | |
| 178 // Parse | |
| 179 ParsePosition pos(0); | |
| 180 Calendar *outcal = Calendar::createInstance(unknownZone,
*status); | |
| 181 if (U_FAILURE(*status)) { | |
| 182 //errln("Failed to create an instance of calendar fo
r receiving parse result."); | |
| 183 *status = U_ZERO_ERROR; | |
| 184 continue; | |
| 185 } | |
| 186 outcal->set(UCAL_DST_OFFSET, badDstOffset); | |
| 187 outcal->set(UCAL_ZONE_OFFSET, badZoneOffset); | |
| 188 sdf->parse(tzstr, *outcal, pos); | |
| 189 | |
| 190 // clean loop | |
| 191 delete outcal; | |
| 192 | |
| 193 } | |
| 194 delete tz; | |
| 195 // break time zone loop | |
| 196 break; | |
| 197 | |
| 198 } | |
| 199 delete sdf; | |
| 200 } | |
| 201 } | |
| 202 delete cal; | |
| 203 delete tzids; | |
| 204 | |
| 205 } | |
| 206 | |
| 207 virtual long getOperationsPerIteration() | |
| 208 { | |
| 209 return NUM_PATTERNS * nLocales * 6; | |
| 210 } | |
| 211 }; | |
| 212 | |
| 213 | |
| 214 class DateTimeRoundTripPerfTest : public UPerfTest | |
| 215 { | |
| 216 private: | |
| 217 | |
| 218 public: | |
| 219 | |
| 220 DateTimeRoundTripPerfTest(int32_t argc, const char* argv[], UErrorCode&
status); | |
| 221 ~DateTimeRoundTripPerfTest(); | |
| 222 virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec,const ch
ar* &name, char* par); | |
| 223 | |
| 224 UPerfFunction* RoundTripLocale1(); | |
| 225 UPerfFunction* RoundTripLocale10(); | |
| 226 UPerfFunction* RoundTripLocale11(); | |
| 227 UPerfFunction* RoundTripLocale21(); | |
| 228 }; | |
| 229 | |
| 230 | |
| 231 #endif // DateTimeRoundTripPerfTest | |
| OLD | NEW |