+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
/*
********************************************************************************
-* Copyright (C) 2005-2006, International Business Machines
+* Copyright (C) 2005-2016, International Business Machines
* Corporation and others. All Rights Reserved.
********************************************************************************
*
#include "unicode/utypes.h"
-#ifdef U_WINDOWS
+#if U_PLATFORM_USES_ONLY_WIN32_API
#if !UCONFIG_NO_FORMATTING
#include "winutil.h"
#include "windttst.h"
+#include "dtfmttst.h"
+
#include "cmemory.h"
#include "cstring.h"
#include "locmap.h"
-#include "wintz.h"
+#include "wintzimpl.h"
# define WIN32_LEAN_AND_MEAN
# define VC_EXTRALEAN
# define NOMCX
# include <windows.h>
-#define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
+#include <algorithm>
static const char *getCalendarType(int32_t type)
{
}
}
-void Win32DateTimeTest::testLocales(TestLog *log)
+void Win32DateTimeTest::testLocales(DateFormatTest *log)
{
SYSTEMTIME winNow;
UDate icuNow = 0;
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;
for (int z = 0; z < ec; z += 1) {
UnicodeString equiv = TimeZone::getEquivalentID(zoneID, z);
- if (found = uprv_getWindowsTimeZoneInfo(&tzi, equiv.getBuffer(), equiv.length())) {
+ found = uprv_getWindowsTimeZoneInfo(&tzi, equiv.getBuffer(), equiv.length());
+ if (found) {
break;
}
}
for(int i = 0; i < lcidCount; i += 1) {
UErrorCode status = U_ZERO_ERROR;
WCHAR longDateFormat[81], longTimeFormat[81], wdBuffer[256], wtBuffer[256];
+ DWORD value = 0;
int32_t calType = 0;
- // NULL localeID means ICU didn't recognize this locale
- if (lcidRecords[i].localeID == NULL) {
- continue;
- }
+ // NULL localeID means ICU didn't recognize this locale
+ if (lcidRecords[i].localeID == NULL) {
+ continue;
+ }
+
+ // Some locales have had their names change over various OS releases; skip them in the test for now.
+ int32_t failingLocaleLCIDs[] = {
+ 0x040a, /* es-ES_tradnl;es-ES-u-co-trad; */
+ 0x048c, /* fa-AF;prs-AF;prs-Arab-AF; */
+ 0x046b, /* qu-BO;quz-BO;quz-Latn-BO; */
+ 0x086b, /* qu-EC;quz-EC;quz-Latn-EC; */
+ 0x0c6b, /* qu-PE;quz-PE;quz-Latn-PE; */
+ 0x0492 /* ckb-IQ;ku-Arab-IQ; */
+ };
+ bool skip = (std::find(std::begin(failingLocaleLCIDs), std::end(failingLocaleLCIDs), lcidRecords[i].lcid) != std::end(failingLocaleLCIDs));
+ if (skip && log->logKnownIssue("13119", "Windows '@compat=host' fails on down-level versions of the OS")) {
+ log->logln("ticket:13119 - Skipping LCID = 0x%04x", lcidRecords[i].lcid);
+ 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));
+ GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_RETURN_NUMBER|LOCALE_ICALENDARTYPE, (LPWSTR)&value, sizeof(value)/sizeof(WCHAR));
+ calType = value;
char localeID[64];
uprv_strcpy(localeID, lcidRecords[i].localeID);
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));
+ wdLength = GetDateFormatW(lcidRecords[i].lcid, DATE_LONGDATE, &winNow, NULL, wdBuffer, UPRV_LENGTHOF(wdBuffer));
+ wtLength = GetTimeFormatW(lcidRecords[i].lcid, 0, &winNow, NULL, wtBuffer, UPRV_LENGTHOF(wtBuffer));
if (uprv_strchr(localeID, '@') > 0) {
uprv_strcat(localeID, ";");
wdf->format(icuNow, udBuffer);
wtf->format(icuNow, utBuffer);
- if (ubBuffer.indexOf(wdBuffer, wdLength - 1, 0) < 0) {
+ if (ubBuffer.indexOf((const UChar *)wdBuffer, wdLength - 1, 0) < 0) {
UnicodeString baseName(wlocale.getBaseName());
- UnicodeString expected(wdBuffer);
+ UnicodeString expected((const UChar *)wdBuffer);
log->errln("DateTime format error for locale " + baseName + ": expected date \"" + expected +
"\" got \"" + ubBuffer + "\"");
}
- if (ubBuffer.indexOf(wtBuffer, wtLength - 1, 0) < 0) {
+ if (ubBuffer.indexOf((const UChar *)wtBuffer, wtLength - 1, 0) < 0) {
UnicodeString baseName(wlocale.getBaseName());
- UnicodeString expected(wtBuffer);
+ UnicodeString expected((const UChar *)wtBuffer);
log->errln("DateTime format error for locale " + baseName + ": expected time \"" + expected +
"\" got \"" + ubBuffer + "\"");
}
- if (udBuffer.compare(wdBuffer) != 0) {
+ if (udBuffer.compare((const UChar *)wdBuffer) != 0) {
UnicodeString baseName(wlocale.getBaseName());
- UnicodeString expected(wdBuffer);
+ UnicodeString expected((const UChar *)wdBuffer);
log->errln("Date format error for locale " + baseName + ": expected \"" + expected +
"\" got \"" + udBuffer + "\"");
}
- if (utBuffer.compare(wtBuffer) != 0) {
+ if (utBuffer.compare((const UChar *)wtBuffer) != 0) {
UnicodeString baseName(wlocale.getBaseName());
- UnicodeString expected(wtBuffer);
+ UnicodeString expected((const UChar *)wtBuffer);
log->errln("Time format error for locale " + baseName + ": expected \"" + expected +
"\" got \"" + utBuffer + "\"");
#endif /* #if !UCONFIG_NO_FORMATTING */
-#endif /* #ifdef U_WINDOWS */
+#endif /* U_PLATFORM_USES_ONLY_WIN32_API */