2 **********************************************************************
3 * Copyright (c) 2010-2011,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 U_PLATFORM_USES_ONLY_WIN32_API
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