2 **********************************************************************
3 * Copyright (c) 2010-2016,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"
24 #include "unicode/uperf.h"
25 #include "unicode/unistr.h"
26 #include "unicode/datefmt.h"
27 #include "unicode/calendar.h"
28 #include "unicode/uclean.h"
29 #include "unicode/brkiter.h"
32 static const char* PATTERNS
[] = {"z", "zzzz", "Z", "ZZZZ", "v", "vvvv", "V", "VVVV"};
33 static const int NUM_PATTERNS
= UPRV_LENGTHOF(PATTERNS
);
41 // Stubs for Windows API functions when building on UNIXes.
43 #if U_PLATFORM_USES_ONLY_WIN32_API
48 inline int FoldStringW(DWORD dwMapFlags
, const UChar
* lpSrcStr
,int cchSrc
, UChar
* lpDestStr
,int cchDest
);
51 class DateTimeRoundTripFunction
: public UPerfFunction
57 DateTimeRoundTripFunction()
62 DateTimeRoundTripFunction(int locs
)
67 virtual void call(UErrorCode
* status
)
69 *status
= U_ZERO_ERROR
;
71 SimpleTimeZone
unknownZone(-31415, (UnicodeString
)"Etc/Unknown");
72 int32_t badDstOffset
= -1234;
73 int32_t badZoneOffset
= -2345;
75 int32_t testDateData
[][3] = {
84 Calendar
*cal
= Calendar::createInstance(*status
);
85 if (U_FAILURE(*status
)) {
86 //dataerrln("Calendar::createInstance failed: %s", u_errorName(*status));
90 // Set up rule equivalency test range
92 cal
->set(1900, UCAL_JANUARY
, 1);
93 low
= cal
->getTime(*status
);
94 cal
->set(2040, UCAL_JANUARY
, 1);
95 high
= cal
->getTime(*status
);
96 if (U_FAILURE(*status
)) {
97 //errln("getTime failed");
102 UDate DATES
[UPRV_LENGTHOF(testDateData
)/3];
103 const int32_t nDates
= UPRV_LENGTHOF(testDateData
)/3;
105 for (int32_t i
= 0; i
< nDates
; i
++) {
106 cal
->set(testDateData
[i
][0], testDateData
[i
][1], testDateData
[i
][2]);
107 DATES
[i
] = cal
->getTime(*status
);
108 if (U_FAILURE(*status
)) {
109 //errln("getTime failed");
114 // Set up test locales
115 const Locale testLocales
[] = {
141 const Locale
*LOCALES
;
142 LOCALES
= testLocales
;
144 StringEnumeration
*tzids
= TimeZone::createEnumeration();
145 if (U_FAILURE(*status
)) {
146 //errln("tzids->count failed");
150 // Run the roundtrip test
151 for (int32_t locidx
= 0; locidx
< nLocales
; locidx
++) {
152 for (int32_t patidx
= 0; patidx
< NUM_PATTERNS
; patidx
++) {
153 SimpleDateFormat
*sdf
= new SimpleDateFormat((UnicodeString
)PATTERNS
[patidx
], LOCALES
[locidx
], *status
);
154 if (U_FAILURE(*status
)) {
155 //errcheckln(*status, (UnicodeString)"new SimpleDateFormat failed for pattern " +
156 // PATTERNS[patidx] + " for locale " + LOCALES[locidx].getName() + " - " + u_errorName(*status));
157 *status
= U_ZERO_ERROR
;
161 tzids
->reset(*status
);
162 const UnicodeString
*tzid
;
163 while ((tzid
= tzids
->snext(*status
))) {
164 TimeZone
*tz
= TimeZone::createTimeZone(*tzid
);
166 for (int32_t datidx
= 0; datidx
< nDates
; datidx
++) {
168 FieldPosition
fpos(0);
171 sdf
->setTimeZone(*tz
);
172 sdf
->format(DATES
[datidx
], tzstr
, fpos
);
174 // Before parse, set unknown zone to SimpleDateFormat instance
175 // just for making sure that it does not depends on the time zone
177 sdf
->setTimeZone(unknownZone
);
180 ParsePosition
pos(0);
181 Calendar
*outcal
= Calendar::createInstance(unknownZone
, *status
);
182 if (U_FAILURE(*status
)) {
183 //errln("Failed to create an instance of calendar for receiving parse result.");
184 *status
= U_ZERO_ERROR
;
187 outcal
->set(UCAL_DST_OFFSET
, badDstOffset
);
188 outcal
->set(UCAL_ZONE_OFFSET
, badZoneOffset
);
189 sdf
->parse(tzstr
, *outcal
, pos
);
196 // break time zone loop
208 virtual long getOperationsPerIteration()
210 return NUM_PATTERNS
* nLocales
* 6;
215 class DateTimeRoundTripPerfTest
: public UPerfTest
221 DateTimeRoundTripPerfTest(int32_t argc
, const char* argv
[], UErrorCode
& status
);
222 ~DateTimeRoundTripPerfTest();
223 virtual UPerfFunction
* runIndexedTest(int32_t index
, UBool exec
,const char* &name
, char* par
);
225 UPerfFunction
* RoundTripLocale1();
226 UPerfFunction
* RoundTripLocale10();
227 UPerfFunction
* RoundTripLocale11();
228 UPerfFunction
* RoundTripLocale21();
232 #endif // DateTimeRoundTripPerfTest