2 **********************************************************************
3 * Copyright (c) 2010,International Business Machines
4 * Corporation and others. All Rights Reserved.
5 **********************************************************************
6 **********************************************************************
10 #define _DTFMTRTPERF_H
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"
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"
31 static const char* PATTERNS[] = {"z", "zzzz", "Z", "ZZZZ", "v", "vvvv", "V", "VVVV"};
32 static const int NUM_PATTERNS = sizeof(PATTERNS)/sizeof(const char*);
40 // Stubs for Windows API functions when building on UNIXes.
42 #if defined(U_WINDOWS)
47 inline int FoldStringW(DWORD dwMapFlags, const UChar* lpSrcStr,int cchSrc, UChar* lpDestStr,int cchDest);
50 class DateTimeRoundTripFunction : public UPerfFunction
56 DateTimeRoundTripFunction()
61 DateTimeRoundTripFunction(int locs)
66 virtual void call(UErrorCode* status)
68 *status = U_ZERO_ERROR;
70 SimpleTimeZone unknownZone(-31415, (UnicodeString)"Etc/Unknown");
71 int32_t badDstOffset = -1234;
72 int32_t badZoneOffset = -2345;
74 int32_t testDateData[][3] = {
83 Calendar *cal = Calendar::createInstance(*status);
84 if (U_FAILURE(*status)) {
85 //dataerrln("Calendar::createInstance failed: %s", u_errorName(*status));
89 // Set up rule equivalency test range
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");
101 UDate DATES[(sizeof(testDateData)/sizeof(int32_t))/3];
102 const int32_t nDates = (sizeof(testDateData)/sizeof(int32_t))/3;
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");
113 // Set up test locales
114 const Locale testLocales[] = {
140 const Locale *LOCALES;
141 LOCALES = testLocales;
143 StringEnumeration *tzids = TimeZone::createEnumeration();
144 if (U_FAILURE(*status)) {
145 //errln("tzids->count failed");
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)PATTERNS[patidx], LOCALES[locidx], *status);
153 if (U_FAILURE(*status)) {
154 //errcheckln(*status, (UnicodeString)"new SimpleDateFormat failed for pattern " +
155 // PATTERNS[patidx] + " for locale " + LOCALES[locidx].getName() + " - " + u_errorName(*status));
156 *status = U_ZERO_ERROR;
160 tzids->reset(*status);
161 const UnicodeString *tzid;
162 while ((tzid = tzids->snext(*status))) {
163 TimeZone *tz = TimeZone::createTimeZone(*tzid);
165 for (int32_t datidx = 0; datidx < nDates; datidx++) {
167 FieldPosition fpos(0);
170 sdf->setTimeZone(*tz);
171 sdf->format(DATES[datidx], tzstr, fpos);
173 // Before parse, set unknown zone to SimpleDateFormat instance
174 // just for making sure that it does not depends on the time zone
176 sdf->setTimeZone(unknownZone);
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 for receiving parse result.");
183 *status = U_ZERO_ERROR;
186 outcal->set(UCAL_DST_OFFSET, badDstOffset);
187 outcal->set(UCAL_ZONE_OFFSET, badZoneOffset);
188 sdf->parse(tzstr, *outcal, pos);
195 // break time zone loop
207 virtual long getOperationsPerIteration()
209 return NUM_PATTERNS * nLocales * 6;
214 class DateTimeRoundTripPerfTest : public UPerfTest
220 DateTimeRoundTripPerfTest(int32_t argc, const char* argv[], UErrorCode& status);
221 ~DateTimeRoundTripPerfTest();
222 virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec,const char* &name, char* par);
224 UPerfFunction* RoundTripLocale1();
225 UPerfFunction* RoundTripLocale10();
226 UPerfFunction* RoundTripLocale11();
227 UPerfFunction* RoundTripLocale21();
231 #endif // DateTimeRoundTripPerfTest