• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 ********************************************************************************
3 *   Copyright (C) 2005-2006, International Business Machines
4 *   Corporation and others.  All Rights Reserved.
5 ********************************************************************************
6 *
7 * File WINDTTST.CPP
8 *
9 ********************************************************************************
10 */
11 
12 #include "unicode/utypes.h"
13 
14 #ifdef U_WINDOWS
15 
16 #if !UCONFIG_NO_FORMATTING
17 
18 #include "unicode/format.h"
19 #include "unicode/numfmt.h"
20 #include "unicode/locid.h"
21 #include "unicode/ustring.h"
22 #include "unicode/testlog.h"
23 #include "unicode/utmscale.h"
24 
25 #include "windtfmt.h"
26 #include "winutil.h"
27 #include "windttst.h"
28 
29 #include "cmemory.h"
30 #include "cstring.h"
31 #include "locmap.h"
32 #include "wintz.h"
33 
34 #   define WIN32_LEAN_AND_MEAN
35 #   define VC_EXTRALEAN
36 #   define NOUSER
37 #   define NOSERVICE
38 #   define NOIME
39 #   define NOMCX
40 #   include <windows.h>
41 
42 #define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
43 
getCalendarType(int32_t type)44 static const char *getCalendarType(int32_t type)
45 {
46     switch (type)
47     {
48     case 1:
49     case 2:
50         return "@calendar=gregorian";
51 
52     case 3:
53         return "@calendar=japanese";
54 
55     case 6:
56         return "@calendar=islamic";
57 
58     case 7:
59         return "@calendar=buddhist";
60 
61     case 8:
62         return "@calendar=hebrew";
63 
64     default:
65         return "";
66     }
67 }
68 
testLocales(TestLog * log)69 void Win32DateTimeTest::testLocales(TestLog *log)
70 {
71     SYSTEMTIME winNow;
72     UDate icuNow = 0;
73     SYSTEMTIME st;
74     FILETIME ft;
75     UnicodeString zoneID;
76     const TimeZone *tz = TimeZone::createDefault();
77     TIME_ZONE_INFORMATION tzi;
78 
79     uprv_memset(&tzi, 0, sizeof(tzi));
80     tz->getID(zoneID);
81     if (! uprv_getWindowsTimeZoneInfo(&tzi, zoneID.getBuffer(), zoneID.length())) {
82         UBool found = FALSE;
83         int32_t ec = TimeZone::countEquivalentIDs(zoneID);
84 
85         for (int z = 0; z < ec; z += 1) {
86             UnicodeString equiv = TimeZone::getEquivalentID(zoneID, z);
87 
88             if (found = uprv_getWindowsTimeZoneInfo(&tzi, equiv.getBuffer(), equiv.length())) {
89                 break;
90             }
91         }
92 
93         if (! found) {
94             GetTimeZoneInformation(&tzi);
95         }
96     }
97 
98     GetSystemTime(&st);
99     SystemTimeToFileTime(&st, &ft);
100     SystemTimeToTzSpecificLocalTime(&tzi, &st, &winNow);
101 
102     int64_t wftNow = ((int64_t) ft.dwHighDateTime << 32) + ft.dwLowDateTime;
103     UErrorCode status = U_ZERO_ERROR;
104 
105     int64_t udtsNow = utmscale_fromInt64(wftNow, UDTS_WINDOWS_FILE_TIME, &status);
106 
107     icuNow = (UDate) utmscale_toInt64(udtsNow, UDTS_ICU4C_TIME, &status);
108 
109     int32_t lcidCount = 0;
110     Win32Utilities::LCIDRecord *lcidRecords = Win32Utilities::getLocales(lcidCount);
111 
112     for(int i = 0; i < lcidCount; i += 1) {
113         UErrorCode status = U_ZERO_ERROR;
114         WCHAR longDateFormat[81], longTimeFormat[81], wdBuffer[256], wtBuffer[256];
115         int32_t calType = 0;
116 
117 		// NULL localeID means ICU didn't recognize this locale
118 		if (lcidRecords[i].localeID == NULL) {
119 			continue;
120 		}
121 
122         GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_SLONGDATE,   longDateFormat, 81);
123         GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_STIMEFORMAT, longTimeFormat, 81);
124         GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_RETURN_NUMBER|LOCALE_ICALENDARTYPE, (LPWSTR) calType, sizeof(int32_t));
125 
126         char localeID[64];
127 
128         uprv_strcpy(localeID, lcidRecords[i].localeID);
129         uprv_strcat(localeID, getCalendarType(calType));
130 
131         UnicodeString ubBuffer, udBuffer, utBuffer;
132         Locale ulocale(localeID);
133         int32_t wdLength, wtLength;
134 
135         wdLength = GetDateFormatW(lcidRecords[i].lcid, DATE_LONGDATE, &winNow, NULL, wdBuffer, ARRAY_SIZE(wdBuffer));
136         wtLength = GetTimeFormatW(lcidRecords[i].lcid, 0, &winNow, NULL, wtBuffer, ARRAY_SIZE(wtBuffer));
137 
138         if (uprv_strchr(localeID, '@') > 0) {
139             uprv_strcat(localeID, ";");
140         } else {
141             uprv_strcat(localeID, "@");
142         }
143 
144         uprv_strcat(localeID, "compat=host");
145 
146         Locale wlocale(localeID);
147         DateFormat *wbf = DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, wlocale);
148         DateFormat *wdf = DateFormat::createDateInstance(DateFormat::kFull, wlocale);
149         DateFormat *wtf = DateFormat::createTimeInstance(DateFormat::kFull, wlocale);
150 
151         wbf->format(icuNow, ubBuffer);
152         wdf->format(icuNow, udBuffer);
153         wtf->format(icuNow, utBuffer);
154 
155         if (ubBuffer.indexOf(wdBuffer, wdLength - 1, 0) < 0) {
156             UnicodeString baseName(wlocale.getBaseName());
157             UnicodeString expected(wdBuffer);
158 
159             log->errln("DateTime format error for locale " + baseName + ": expected date \"" + expected +
160                        "\" got \"" + ubBuffer + "\"");
161         }
162 
163         if (ubBuffer.indexOf(wtBuffer, wtLength - 1, 0) < 0) {
164             UnicodeString baseName(wlocale.getBaseName());
165             UnicodeString expected(wtBuffer);
166 
167             log->errln("DateTime format error for locale " + baseName + ": expected time \"" + expected +
168                        "\" got \"" + ubBuffer + "\"");
169         }
170 
171         if (udBuffer.compare(wdBuffer) != 0) {
172             UnicodeString baseName(wlocale.getBaseName());
173             UnicodeString expected(wdBuffer);
174 
175             log->errln("Date format error for locale " + baseName + ": expected \"" + expected +
176                        "\" got \"" + udBuffer + "\"");
177         }
178 
179         if (utBuffer.compare(wtBuffer) != 0) {
180             UnicodeString baseName(wlocale.getBaseName());
181             UnicodeString expected(wtBuffer);
182 
183             log->errln("Time format error for locale " + baseName + ": expected \"" + expected +
184                        "\" got \"" + utBuffer + "\"");
185         }
186         delete wbf;
187         delete wdf;
188         delete wtf;
189     }
190 
191     Win32Utilities::freeLocales(lcidRecords);
192     delete tz;
193 }
194 
195 #endif /* #if !UCONFIG_NO_FORMATTING */
196 
197 #endif /* #ifdef U_WINDOWS */
198