1 // © 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