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