summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-xetex/test/intltest/windttst.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/icu/icu-xetex/test/intltest/windttst.cpp')
-rw-r--r--Build/source/libs/icu/icu-xetex/test/intltest/windttst.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-xetex/test/intltest/windttst.cpp b/Build/source/libs/icu/icu-xetex/test/intltest/windttst.cpp
new file mode 100644
index 00000000000..3869f34acfc
--- /dev/null
+++ b/Build/source/libs/icu/icu-xetex/test/intltest/windttst.cpp
@@ -0,0 +1,197 @@
+/*
+********************************************************************************
+* Copyright (C) 2005-2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+********************************************************************************
+*
+* File WINDTTST.CPP
+*
+********************************************************************************
+*/
+
+#include "unicode/utypes.h"
+
+#ifdef U_WINDOWS
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "unicode/format.h"
+#include "unicode/numfmt.h"
+#include "unicode/locid.h"
+#include "unicode/ustring.h"
+#include "unicode/testlog.h"
+#include "unicode/utmscale.h"
+
+#include "windtfmt.h"
+#include "winutil.h"
+#include "windttst.h"
+
+#include "cmemory.h"
+#include "cstring.h"
+#include "locmap.h"
+#include "wintz.h"
+
+# define WIN32_LEAN_AND_MEAN
+# define VC_EXTRALEAN
+# define NOUSER
+# define NOSERVICE
+# define NOIME
+# define NOMCX
+# include <windows.h>
+
+#define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
+
+static const char *getCalendarType(int32_t type)
+{
+ switch (type)
+ {
+ case 1:
+ case 2:
+ return "@calendar=gregorian";
+
+ case 3:
+ return "@calendar=japanese";
+
+ case 6:
+ return "@calendar=islamic";
+
+ case 7:
+ return "@calendar=buddhist";
+
+ case 8:
+ return "@calendar=hebrew";
+
+ default:
+ return "";
+ }
+}
+
+void Win32DateTimeTest::testLocales(TestLog *log)
+{
+ SYSTEMTIME winNow;
+ UDate icuNow = 0;
+ SYSTEMTIME st;
+ FILETIME ft;
+ UnicodeString zoneID;
+ const TimeZone *tz = TimeZone::createDefault();
+ TIME_ZONE_INFORMATION tzi;
+
+ uprv_memset(&tzi, 0, sizeof(tzi));
+ tz->getID(zoneID);
+ if (! uprv_getWindowsTimeZoneInfo(&tzi, zoneID.getBuffer(), zoneID.length())) {
+ UBool found = FALSE;
+ int32_t ec = TimeZone::countEquivalentIDs(zoneID);
+
+ for (int z = 0; z < ec; z += 1) {
+ UnicodeString equiv = TimeZone::getEquivalentID(zoneID, z);
+
+ if (found = uprv_getWindowsTimeZoneInfo(&tzi, equiv.getBuffer(), equiv.length())) {
+ break;
+ }
+ }
+
+ if (! found) {
+ GetTimeZoneInformation(&tzi);
+ }
+ }
+
+ GetSystemTime(&st);
+ SystemTimeToFileTime(&st, &ft);
+ SystemTimeToTzSpecificLocalTime(&tzi, &st, &winNow);
+
+ int64_t wftNow = ((int64_t) ft.dwHighDateTime << 32) + ft.dwLowDateTime;
+ UErrorCode status = U_ZERO_ERROR;
+
+ int64_t udtsNow = utmscale_fromInt64(wftNow, UDTS_WINDOWS_FILE_TIME, &status);
+
+ icuNow = (UDate) utmscale_toInt64(udtsNow, UDTS_ICU4C_TIME, &status);
+
+ int32_t lcidCount = 0;
+ Win32Utilities::LCIDRecord *lcidRecords = Win32Utilities::getLocales(lcidCount);
+
+ for(int i = 0; i < lcidCount; i += 1) {
+ UErrorCode status = U_ZERO_ERROR;
+ WCHAR longDateFormat[81], longTimeFormat[81], wdBuffer[256], wtBuffer[256];
+ int32_t calType = 0;
+
+ // NULL localeID means ICU didn't recognize this locale
+ if (lcidRecords[i].localeID == NULL) {
+ continue;
+ }
+
+ GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_SLONGDATE, longDateFormat, 81);
+ GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_STIMEFORMAT, longTimeFormat, 81);
+ GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_RETURN_NUMBER|LOCALE_ICALENDARTYPE, (LPWSTR) calType, sizeof(int32_t));
+
+ char localeID[64];
+
+ uprv_strcpy(localeID, lcidRecords[i].localeID);
+ uprv_strcat(localeID, getCalendarType(calType));
+
+ UnicodeString ubBuffer, udBuffer, utBuffer;
+ Locale ulocale(localeID);
+ int32_t wdLength, wtLength;
+
+ wdLength = GetDateFormatW(lcidRecords[i].lcid, DATE_LONGDATE, &winNow, NULL, wdBuffer, ARRAY_SIZE(wdBuffer));
+ wtLength = GetTimeFormatW(lcidRecords[i].lcid, 0, &winNow, NULL, wtBuffer, ARRAY_SIZE(wtBuffer));
+
+ if (uprv_strchr(localeID, '@') > 0) {
+ uprv_strcat(localeID, ";");
+ } else {
+ uprv_strcat(localeID, "@");
+ }
+
+ uprv_strcat(localeID, "compat=host");
+
+ Locale wlocale(localeID);
+ DateFormat *wbf = DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, wlocale);
+ DateFormat *wdf = DateFormat::createDateInstance(DateFormat::kFull, wlocale);
+ DateFormat *wtf = DateFormat::createTimeInstance(DateFormat::kFull, wlocale);
+
+ wbf->format(icuNow, ubBuffer);
+ wdf->format(icuNow, udBuffer);
+ wtf->format(icuNow, utBuffer);
+
+ if (ubBuffer.indexOf(wdBuffer, wdLength - 1, 0) < 0) {
+ UnicodeString baseName(wlocale.getBaseName());
+ UnicodeString expected(wdBuffer);
+
+ log->errln("DateTime format error for locale " + baseName + ": expected date \"" + expected +
+ "\" got \"" + ubBuffer + "\"");
+ }
+
+ if (ubBuffer.indexOf(wtBuffer, wtLength - 1, 0) < 0) {
+ UnicodeString baseName(wlocale.getBaseName());
+ UnicodeString expected(wtBuffer);
+
+ log->errln("DateTime format error for locale " + baseName + ": expected time \"" + expected +
+ "\" got \"" + ubBuffer + "\"");
+ }
+
+ if (udBuffer.compare(wdBuffer) != 0) {
+ UnicodeString baseName(wlocale.getBaseName());
+ UnicodeString expected(wdBuffer);
+
+ log->errln("Date format error for locale " + baseName + ": expected \"" + expected +
+ "\" got \"" + udBuffer + "\"");
+ }
+
+ if (utBuffer.compare(wtBuffer) != 0) {
+ UnicodeString baseName(wlocale.getBaseName());
+ UnicodeString expected(wtBuffer);
+
+ log->errln("Time format error for locale " + baseName + ": expected \"" + expected +
+ "\" got \"" + utBuffer + "\"");
+ }
+ delete wbf;
+ delete wdf;
+ delete wtf;
+ }
+
+ Win32Utilities::freeLocales(lcidRecords);
+ delete tz;
+}
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
+
+#endif /* #ifdef U_WINDOWS */