127f654740f2a26ad62a5c155af9199af9e69b889claireho/* 227f654740f2a26ad62a5c155af9199af9e69b889claireho********************************************************************** 383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius* Copyright (c) 2010-2011,International Business Machines 427f654740f2a26ad62a5c155af9199af9e69b889claireho* Corporation and others. All Rights Reserved. 527f654740f2a26ad62a5c155af9199af9e69b889claireho********************************************************************** 627f654740f2a26ad62a5c155af9199af9e69b889claireho********************************************************************** 727f654740f2a26ad62a5c155af9199af9e69b889claireho*/ 827f654740f2a26ad62a5c155af9199af9e69b889claireho 927f654740f2a26ad62a5c155af9199af9e69b889claireho#ifndef _DTFMTRTPERF_H 1027f654740f2a26ad62a5c155af9199af9e69b889claireho#define _DTFMTRTPERF_H 1127f654740f2a26ad62a5c155af9199af9e69b889claireho 1227f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/utypes.h" 1327f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/uperf.h" 1427f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/timezone.h" 1527f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/simpletz.h" 1627f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/calendar.h" 1727f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/strenum.h" 1827f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/smpdtfmt.h" 1927f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/uchar.h" 2027f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/basictz.h" 2127f654740f2a26ad62a5c155af9199af9e69b889claireho#include "cstring.h" 2227f654740f2a26ad62a5c155af9199af9e69b889claireho 2327f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/uperf.h" 2427f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/unistr.h" 2527f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/datefmt.h" 2627f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/calendar.h" 2727f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/uclean.h" 2827f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/brkiter.h" 2927f654740f2a26ad62a5c155af9199af9e69b889claireho#include "util.h" 3027f654740f2a26ad62a5c155af9199af9e69b889claireho 3127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* PATTERNS[] = {"z", "zzzz", "Z", "ZZZZ", "v", "vvvv", "V", "VVVV"}; 3227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const int NUM_PATTERNS = sizeof(PATTERNS)/sizeof(const char*); 3327f654740f2a26ad62a5c155af9199af9e69b889claireho 3427f654740f2a26ad62a5c155af9199af9e69b889claireho#include <iostream> 3527f654740f2a26ad62a5c155af9199af9e69b889claireho#include <stdlib.h> 3627f654740f2a26ad62a5c155af9199af9e69b889claireho#include <fstream> 3727f654740f2a26ad62a5c155af9199af9e69b889claireho#include <string> 3827f654740f2a26ad62a5c155af9199af9e69b889clairehousing namespace std; 3927f654740f2a26ad62a5c155af9199af9e69b889claireho 4027f654740f2a26ad62a5c155af9199af9e69b889claireho// Stubs for Windows API functions when building on UNIXes. 4127f654740f2a26ad62a5c155af9199af9e69b889claireho// 4283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API 4327f654740f2a26ad62a5c155af9199af9e69b889claireho// do nothing 4427f654740f2a26ad62a5c155af9199af9e69b889claireho#else 4527f654740f2a26ad62a5c155af9199af9e69b889claireho#define _UNICODE 4627f654740f2a26ad62a5c155af9199af9e69b889clairehotypedef int DWORD; 4727f654740f2a26ad62a5c155af9199af9e69b889clairehoinline int FoldStringW(DWORD dwMapFlags, const UChar* lpSrcStr,int cchSrc, UChar* lpDestStr,int cchDest); 4827f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 4927f654740f2a26ad62a5c155af9199af9e69b889claireho 5027f654740f2a26ad62a5c155af9199af9e69b889clairehoclass DateTimeRoundTripFunction : public UPerfFunction 5127f654740f2a26ad62a5c155af9199af9e69b889claireho{ 5227f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate: 5327f654740f2a26ad62a5c155af9199af9e69b889claireho int nLocales; 5427f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 5527f654740f2a26ad62a5c155af9199af9e69b889claireho 5627f654740f2a26ad62a5c155af9199af9e69b889claireho DateTimeRoundTripFunction() 5727f654740f2a26ad62a5c155af9199af9e69b889claireho { 5827f654740f2a26ad62a5c155af9199af9e69b889claireho nLocales = 0; 5927f654740f2a26ad62a5c155af9199af9e69b889claireho } 6027f654740f2a26ad62a5c155af9199af9e69b889claireho 6127f654740f2a26ad62a5c155af9199af9e69b889claireho DateTimeRoundTripFunction(int locs) 6227f654740f2a26ad62a5c155af9199af9e69b889claireho { 6327f654740f2a26ad62a5c155af9199af9e69b889claireho nLocales = locs; 6427f654740f2a26ad62a5c155af9199af9e69b889claireho } 6527f654740f2a26ad62a5c155af9199af9e69b889claireho 6627f654740f2a26ad62a5c155af9199af9e69b889claireho virtual void call(UErrorCode* status) 6727f654740f2a26ad62a5c155af9199af9e69b889claireho { 6827f654740f2a26ad62a5c155af9199af9e69b889claireho *status = U_ZERO_ERROR; 6927f654740f2a26ad62a5c155af9199af9e69b889claireho 7027f654740f2a26ad62a5c155af9199af9e69b889claireho SimpleTimeZone unknownZone(-31415, (UnicodeString)"Etc/Unknown"); 7127f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t badDstOffset = -1234; 7227f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t badZoneOffset = -2345; 7327f654740f2a26ad62a5c155af9199af9e69b889claireho 7427f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t testDateData[][3] = { 7527f654740f2a26ad62a5c155af9199af9e69b889claireho {2007, 1, 15}, 7627f654740f2a26ad62a5c155af9199af9e69b889claireho {2007, 6, 15}, 7727f654740f2a26ad62a5c155af9199af9e69b889claireho {1990, 1, 15}, 7827f654740f2a26ad62a5c155af9199af9e69b889claireho {1990, 6, 15}, 7927f654740f2a26ad62a5c155af9199af9e69b889claireho {1960, 1, 15}, 8027f654740f2a26ad62a5c155af9199af9e69b889claireho {1960, 6, 15}, 8127f654740f2a26ad62a5c155af9199af9e69b889claireho }; 8227f654740f2a26ad62a5c155af9199af9e69b889claireho 8327f654740f2a26ad62a5c155af9199af9e69b889claireho Calendar *cal = Calendar::createInstance(*status); 8427f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(*status)) { 8527f654740f2a26ad62a5c155af9199af9e69b889claireho //dataerrln("Calendar::createInstance failed: %s", u_errorName(*status)); 8627f654740f2a26ad62a5c155af9199af9e69b889claireho return; 8727f654740f2a26ad62a5c155af9199af9e69b889claireho } 8827f654740f2a26ad62a5c155af9199af9e69b889claireho 8927f654740f2a26ad62a5c155af9199af9e69b889claireho // Set up rule equivalency test range 9027f654740f2a26ad62a5c155af9199af9e69b889claireho UDate low, high; 9127f654740f2a26ad62a5c155af9199af9e69b889claireho cal->set(1900, UCAL_JANUARY, 1); 9227f654740f2a26ad62a5c155af9199af9e69b889claireho low = cal->getTime(*status); 9327f654740f2a26ad62a5c155af9199af9e69b889claireho cal->set(2040, UCAL_JANUARY, 1); 9427f654740f2a26ad62a5c155af9199af9e69b889claireho high = cal->getTime(*status); 9527f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(*status)) { 9627f654740f2a26ad62a5c155af9199af9e69b889claireho //errln("getTime failed"); 9727f654740f2a26ad62a5c155af9199af9e69b889claireho return; 9827f654740f2a26ad62a5c155af9199af9e69b889claireho } 9927f654740f2a26ad62a5c155af9199af9e69b889claireho 10027f654740f2a26ad62a5c155af9199af9e69b889claireho // Set up test dates 10127f654740f2a26ad62a5c155af9199af9e69b889claireho UDate DATES[(sizeof(testDateData)/sizeof(int32_t))/3]; 10227f654740f2a26ad62a5c155af9199af9e69b889claireho const int32_t nDates = (sizeof(testDateData)/sizeof(int32_t))/3; 10327f654740f2a26ad62a5c155af9199af9e69b889claireho cal->clear(); 10427f654740f2a26ad62a5c155af9199af9e69b889claireho for (int32_t i = 0; i < nDates; i++) { 10527f654740f2a26ad62a5c155af9199af9e69b889claireho cal->set(testDateData[i][0], testDateData[i][1], testDateData[i][2]); 10627f654740f2a26ad62a5c155af9199af9e69b889claireho DATES[i] = cal->getTime(*status); 10727f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(*status)) { 10827f654740f2a26ad62a5c155af9199af9e69b889claireho //errln("getTime failed"); 10927f654740f2a26ad62a5c155af9199af9e69b889claireho return; 11027f654740f2a26ad62a5c155af9199af9e69b889claireho } 11127f654740f2a26ad62a5c155af9199af9e69b889claireho } 11227f654740f2a26ad62a5c155af9199af9e69b889claireho 11327f654740f2a26ad62a5c155af9199af9e69b889claireho // Set up test locales 11427f654740f2a26ad62a5c155af9199af9e69b889claireho const Locale testLocales[] = { 11527f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("en"), 11627f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("en_US"), 11727f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("en_AU"), 11827f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("de_DE"), 11927f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("fr"), 12027f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("ja_JP"), 12127f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("ko"), 12227f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("pt"), 12327f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("th_TH"), 12427f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("zh_Hans"), 12527f654740f2a26ad62a5c155af9199af9e69b889claireho 12627f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("it"), 12727f654740f2a26ad62a5c155af9199af9e69b889claireho 12827f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("en"), 12927f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("en_US"), 13027f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("en_AU"), 13127f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("de_DE"), 13227f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("fr"), 13327f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("ja_JP"), 13427f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("ko"), 13527f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("pt"), 13627f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("th_TH"), 13727f654740f2a26ad62a5c155af9199af9e69b889claireho Locale("zh_Hans"), 13827f654740f2a26ad62a5c155af9199af9e69b889claireho }; 13927f654740f2a26ad62a5c155af9199af9e69b889claireho 14027f654740f2a26ad62a5c155af9199af9e69b889claireho const Locale *LOCALES; 14127f654740f2a26ad62a5c155af9199af9e69b889claireho LOCALES = testLocales; 14227f654740f2a26ad62a5c155af9199af9e69b889claireho 14327f654740f2a26ad62a5c155af9199af9e69b889claireho StringEnumeration *tzids = TimeZone::createEnumeration(); 14427f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(*status)) { 14527f654740f2a26ad62a5c155af9199af9e69b889claireho //errln("tzids->count failed"); 14627f654740f2a26ad62a5c155af9199af9e69b889claireho return; 14727f654740f2a26ad62a5c155af9199af9e69b889claireho } 14827f654740f2a26ad62a5c155af9199af9e69b889claireho 14927f654740f2a26ad62a5c155af9199af9e69b889claireho // Run the roundtrip test 15027f654740f2a26ad62a5c155af9199af9e69b889claireho for (int32_t locidx = 0; locidx < nLocales; locidx++) { 15127f654740f2a26ad62a5c155af9199af9e69b889claireho for (int32_t patidx = 0; patidx < NUM_PATTERNS; patidx++) { 15227f654740f2a26ad62a5c155af9199af9e69b889claireho SimpleDateFormat *sdf = new SimpleDateFormat((UnicodeString)PATTERNS[patidx], LOCALES[locidx], *status); 15327f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(*status)) { 15427f654740f2a26ad62a5c155af9199af9e69b889claireho //errcheckln(*status, (UnicodeString)"new SimpleDateFormat failed for pattern " + 15527f654740f2a26ad62a5c155af9199af9e69b889claireho // PATTERNS[patidx] + " for locale " + LOCALES[locidx].getName() + " - " + u_errorName(*status)); 15627f654740f2a26ad62a5c155af9199af9e69b889claireho *status = U_ZERO_ERROR; 15727f654740f2a26ad62a5c155af9199af9e69b889claireho continue; 15827f654740f2a26ad62a5c155af9199af9e69b889claireho } 15927f654740f2a26ad62a5c155af9199af9e69b889claireho 16027f654740f2a26ad62a5c155af9199af9e69b889claireho tzids->reset(*status); 16127f654740f2a26ad62a5c155af9199af9e69b889claireho const UnicodeString *tzid; 16227f654740f2a26ad62a5c155af9199af9e69b889claireho while ((tzid = tzids->snext(*status))) { 16327f654740f2a26ad62a5c155af9199af9e69b889claireho TimeZone *tz = TimeZone::createTimeZone(*tzid); 16427f654740f2a26ad62a5c155af9199af9e69b889claireho 16527f654740f2a26ad62a5c155af9199af9e69b889claireho for (int32_t datidx = 0; datidx < nDates; datidx++) { 16627f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString tzstr; 16727f654740f2a26ad62a5c155af9199af9e69b889claireho FieldPosition fpos(0); 16827f654740f2a26ad62a5c155af9199af9e69b889claireho 16927f654740f2a26ad62a5c155af9199af9e69b889claireho // Format 17027f654740f2a26ad62a5c155af9199af9e69b889claireho sdf->setTimeZone(*tz); 17127f654740f2a26ad62a5c155af9199af9e69b889claireho sdf->format(DATES[datidx], tzstr, fpos); 17227f654740f2a26ad62a5c155af9199af9e69b889claireho 17327f654740f2a26ad62a5c155af9199af9e69b889claireho // Before parse, set unknown zone to SimpleDateFormat instance 17427f654740f2a26ad62a5c155af9199af9e69b889claireho // just for making sure that it does not depends on the time zone 17527f654740f2a26ad62a5c155af9199af9e69b889claireho // originally set. 17627f654740f2a26ad62a5c155af9199af9e69b889claireho sdf->setTimeZone(unknownZone); 17727f654740f2a26ad62a5c155af9199af9e69b889claireho 17827f654740f2a26ad62a5c155af9199af9e69b889claireho // Parse 17927f654740f2a26ad62a5c155af9199af9e69b889claireho ParsePosition pos(0); 18027f654740f2a26ad62a5c155af9199af9e69b889claireho Calendar *outcal = Calendar::createInstance(unknownZone, *status); 18127f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(*status)) { 18227f654740f2a26ad62a5c155af9199af9e69b889claireho //errln("Failed to create an instance of calendar for receiving parse result."); 18327f654740f2a26ad62a5c155af9199af9e69b889claireho *status = U_ZERO_ERROR; 18427f654740f2a26ad62a5c155af9199af9e69b889claireho continue; 18527f654740f2a26ad62a5c155af9199af9e69b889claireho } 18627f654740f2a26ad62a5c155af9199af9e69b889claireho outcal->set(UCAL_DST_OFFSET, badDstOffset); 18727f654740f2a26ad62a5c155af9199af9e69b889claireho outcal->set(UCAL_ZONE_OFFSET, badZoneOffset); 18827f654740f2a26ad62a5c155af9199af9e69b889claireho sdf->parse(tzstr, *outcal, pos); 18927f654740f2a26ad62a5c155af9199af9e69b889claireho 19027f654740f2a26ad62a5c155af9199af9e69b889claireho // clean loop 19127f654740f2a26ad62a5c155af9199af9e69b889claireho delete outcal; 19227f654740f2a26ad62a5c155af9199af9e69b889claireho 19327f654740f2a26ad62a5c155af9199af9e69b889claireho } 19427f654740f2a26ad62a5c155af9199af9e69b889claireho delete tz; 19527f654740f2a26ad62a5c155af9199af9e69b889claireho // break time zone loop 19627f654740f2a26ad62a5c155af9199af9e69b889claireho break; 19727f654740f2a26ad62a5c155af9199af9e69b889claireho 19827f654740f2a26ad62a5c155af9199af9e69b889claireho } 19927f654740f2a26ad62a5c155af9199af9e69b889claireho delete sdf; 20027f654740f2a26ad62a5c155af9199af9e69b889claireho } 20127f654740f2a26ad62a5c155af9199af9e69b889claireho } 20227f654740f2a26ad62a5c155af9199af9e69b889claireho delete cal; 20327f654740f2a26ad62a5c155af9199af9e69b889claireho delete tzids; 20427f654740f2a26ad62a5c155af9199af9e69b889claireho 20527f654740f2a26ad62a5c155af9199af9e69b889claireho } 20627f654740f2a26ad62a5c155af9199af9e69b889claireho 20727f654740f2a26ad62a5c155af9199af9e69b889claireho virtual long getOperationsPerIteration() 20827f654740f2a26ad62a5c155af9199af9e69b889claireho { 20927f654740f2a26ad62a5c155af9199af9e69b889claireho return NUM_PATTERNS * nLocales * 6; 21027f654740f2a26ad62a5c155af9199af9e69b889claireho } 21127f654740f2a26ad62a5c155af9199af9e69b889claireho}; 21227f654740f2a26ad62a5c155af9199af9e69b889claireho 21327f654740f2a26ad62a5c155af9199af9e69b889claireho 21427f654740f2a26ad62a5c155af9199af9e69b889clairehoclass DateTimeRoundTripPerfTest : public UPerfTest 21527f654740f2a26ad62a5c155af9199af9e69b889claireho{ 21627f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate: 21727f654740f2a26ad62a5c155af9199af9e69b889claireho 21827f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 21927f654740f2a26ad62a5c155af9199af9e69b889claireho 22027f654740f2a26ad62a5c155af9199af9e69b889claireho DateTimeRoundTripPerfTest(int32_t argc, const char* argv[], UErrorCode& status); 22127f654740f2a26ad62a5c155af9199af9e69b889claireho ~DateTimeRoundTripPerfTest(); 22227f654740f2a26ad62a5c155af9199af9e69b889claireho virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec,const char* &name, char* par); 22327f654740f2a26ad62a5c155af9199af9e69b889claireho 22427f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* RoundTripLocale1(); 22527f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* RoundTripLocale10(); 22627f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* RoundTripLocale11(); 22727f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* RoundTripLocale21(); 22827f654740f2a26ad62a5c155af9199af9e69b889claireho}; 22927f654740f2a26ad62a5c155af9199af9e69b889claireho 23027f654740f2a26ad62a5c155af9199af9e69b889claireho 23127f654740f2a26ad62a5c155af9199af9e69b889claireho#endif // DateTimeRoundTripPerfTest