1 // Copyright (C) 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 **********************************************************************
5 * Copyright (c) 2010-2016,International Business Machines
6 * Corporation and others. All Rights Reserved.
7 **********************************************************************
8 **********************************************************************
11 #ifndef _DTFMTRTPERF_H
12 #define _DTFMTRTPERF_H
14 #include "unicode/utypes.h"
15 #include "unicode/uperf.h"
16 #include "unicode/timezone.h"
17 #include "unicode/simpletz.h"
18 #include "unicode/calendar.h"
19 #include "unicode/strenum.h"
20 #include "unicode/smpdtfmt.h"
21 #include "unicode/uchar.h"
22 #include "unicode/basictz.h"
26 #include "unicode/uperf.h"
27 #include "unicode/unistr.h"
28 #include "unicode/datefmt.h"
29 #include "unicode/calendar.h"
30 #include "unicode/uclean.h"
31 #include "unicode/brkiter.h"
34 static const char* PATTERNS[] = {"z", "zzzz", "Z", "ZZZZ", "v", "vvvv", "V", "VVVV"};
35 static const int NUM_PATTERNS = UPRV_LENGTHOF(PATTERNS);
43 // Stubs for Windows API functions when building on UNIXes.
45 #if U_PLATFORM_USES_ONLY_WIN32_API
50 inline int FoldStringW(DWORD dwMapFlags, const UChar* lpSrcStr,int cchSrc, UChar* lpDestStr,int cchDest);
53 class DateTimeRoundTripFunction : public UPerfFunction
59 DateTimeRoundTripFunction()
64 DateTimeRoundTripFunction(int locs)
69 virtual void call(UErrorCode* status)
71 *status = U_ZERO_ERROR;
73 SimpleTimeZone unknownZone(-31415, (UnicodeString)"Etc/Unknown");
74 int32_t badDstOffset = -1234;
75 int32_t badZoneOffset = -2345;
77 int32_t testDateData[][3] = {
86 Calendar *cal = Calendar::createInstance(*status);
87 if (U_FAILURE(*status)) {
88 //dataerrln("Calendar::createInstance failed: %s", u_errorName(*status));
92 // Set up rule equivalency test range
94 cal->set(1900, UCAL_JANUARY, 1);
95 low = cal->getTime(*status);
96 cal->set(2040, UCAL_JANUARY, 1);
97 high = cal->getTime(*status);
98 if (U_FAILURE(*status)) {
99 //errln("getTime failed");
104 UDate DATES[UPRV_LENGTHOF(testDateData)/3];
105 const int32_t nDates = UPRV_LENGTHOF(testDateData)/3;
107 for (int32_t i = 0; i < nDates; i++) {
108 cal->set(testDateData[i][0], testDateData[i][1], testDateData[i][2]);
109 DATES[i] = cal->getTime(*status);
110 if (U_FAILURE(*status)) {
111 //errln("getTime failed");
116 // Set up test locales
117 const Locale testLocales[] = {
143 const Locale *LOCALES;
144 LOCALES = testLocales;
146 StringEnumeration *tzids = TimeZone::createEnumeration();
147 if (U_FAILURE(*status)) {
148 //errln("tzids->count failed");
152 // Run the roundtrip test
153 for (int32_t locidx = 0; locidx < nLocales; locidx++) {
154 for (int32_t patidx = 0; patidx < NUM_PATTERNS; patidx++) {
155 SimpleDateFormat *sdf = new SimpleDateFormat((UnicodeString)PATTERNS[patidx], LOCALES[locidx], *status);
156 if (U_FAILURE(*status)) {
157 //errcheckln(*status, (UnicodeString)"new SimpleDateFormat failed for pattern " +
158 // PATTERNS[patidx] + " for locale " + LOCALES[locidx].getName() + " - " + u_errorName(*status));
159 *status = U_ZERO_ERROR;
163 tzids->reset(*status);
164 const UnicodeString *tzid;
165 while ((tzid = tzids->snext(*status))) {
166 TimeZone *tz = TimeZone::createTimeZone(*tzid);
168 for (int32_t datidx = 0; datidx < nDates; datidx++) {
170 FieldPosition fpos(FieldPosition::DONT_CARE);
173 sdf->setTimeZone(*tz);
174 sdf->format(DATES[datidx], tzstr, fpos);
176 // Before parse, set unknown zone to SimpleDateFormat instance
177 // just for making sure that it does not depends on the time zone
179 sdf->setTimeZone(unknownZone);
182 ParsePosition pos(0);
183 Calendar *outcal = Calendar::createInstance(unknownZone, *status);
184 if (U_FAILURE(*status)) {
185 //errln("Failed to create an instance of calendar for receiving parse result.");
186 *status = U_ZERO_ERROR;
189 outcal->set(UCAL_DST_OFFSET, badDstOffset);
190 outcal->set(UCAL_ZONE_OFFSET, badZoneOffset);
191 sdf->parse(tzstr, *outcal, pos);
198 // break time zone loop
210 virtual long getOperationsPerIteration()
212 return NUM_PATTERNS * nLocales * 6;
217 class DateTimeRoundTripPerfTest : public UPerfTest
223 DateTimeRoundTripPerfTest(int32_t argc, const char* argv[], UErrorCode& status);
224 ~DateTimeRoundTripPerfTest();
225 virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec,const char* &name, char* par);
227 UPerfFunction* RoundTripLocale1();
228 UPerfFunction* RoundTripLocale10();
229 UPerfFunction* RoundTripLocale11();
230 UPerfFunction* RoundTripLocale21();
234 #endif // DateTimeRoundTripPerfTest