[1/3] kernel32: Some test for handling locales specified by language only
Nikolay Sivov
nsivov at codeweavers.com
Thu Jul 26 04:31:51 CDT 2012
Some test for handling locales specified by language only
-------------- next part --------------
>From 621451e0b9e1b79c87af536e58b004604088e5be Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu, 26 Jul 2012 11:20:46 +0400
Subject: [PATCH 1/3] Some test for handling locales specified by language only
---
dlls/kernel32/tests/locale.c | 190 +++++++++++++++++++++++++++++++++++++++++-
1 files changed, 188 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 8079679..856b46e 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -85,6 +85,7 @@ static BOOL (WINAPI *pIsValidLanguageGroup)(LGRPID, DWORD);
static INT (WINAPI *pIdnToNameprepUnicode)(DWORD, LPCWSTR, INT, LPWSTR, INT);
static INT (WINAPI *pIdnToAscii)(DWORD, LPCWSTR, INT, LPWSTR, INT);
static INT (WINAPI *pIdnToUnicode)(DWORD, LPCWSTR, INT, LPWSTR, INT);
+static INT (WINAPI *pGetLocaleInfoEx)(LPCWSTR, LCTYPE, LPWSTR, INT);
static void InitFunctionPointers(void)
{
@@ -102,6 +103,7 @@ static void InitFunctionPointers(void)
pIdnToNameprepUnicode = (void*)GetProcAddress(hKernel32, "IdnToNameprepUnicode");
pIdnToAscii = (void*)GetProcAddress(hKernel32, "IdnToAscii");
pIdnToUnicode = (void*)GetProcAddress(hKernel32, "IdnToUnicode");
+ pGetLocaleInfoEx = (void*)GetProcAddress(hKernel32, "GetLocaleInfoEx");
}
#define eq(received, expected, label, type) \
@@ -131,9 +133,15 @@ static void test_GetLocaleInfoA(void)
LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
char buffer[BUFFER_SIZE];
char expected[BUFFER_SIZE];
+ DWORD val;
ok(lcid == 0x409, "wrong LCID calculated - %d\n", lcid);
+ ret = GetLocaleInfoA(lcid, LOCALE_ILANGUAGE|LOCALE_RETURN_NUMBER, (char*)&val, sizeof(val));
+ ok(ret, "got %d\n", ret);
+todo_wine
+ ok(val == lcid, "got 0x%08x\n", val);
+
/* en and ar use SUBLANG_NEUTRAL, but GetLocaleInfo assume SUBLANG_DEFAULT
Same is true for zh on pre-Vista, but on Vista and higher GetLocaleInfo
assumes SUBLANG_NEUTRAL for zh */
@@ -192,12 +200,39 @@ static void test_GetLocaleInfoA(void)
ok(!strcmp(buffer, "Monday"), "Expected 'Monday', got '%s'\n", buffer);
}
+struct neutralsublang_name2_t {
+ WCHAR name[3];
+ LCID lcid;
+ LCID lcid_broken;
+};
+
+static const struct neutralsublang_name2_t neutralsublang_names2[] = {
+ { {'a','r',0}, MAKELCID(MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA), SORT_DEFAULT) },
+ { {'a','z',0}, MAKELCID(MAKELANGID(LANG_AZERI, SUBLANG_AZERI_LATIN), SORT_DEFAULT) },
+ { {'d','e',0}, MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT) },
+ { {'e','n',0}, MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) },
+ { {'e','s',0}, MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), SORT_DEFAULT),
+ MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH), SORT_DEFAULT) /* vista */ },
+ { {'g','a',0}, MAKELCID(MAKELANGID(LANG_IRISH, SUBLANG_IRISH_IRELAND), SORT_DEFAULT) },
+ { {'i','t',0}, MAKELCID(MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN), SORT_DEFAULT) },
+ { {'m','s',0}, MAKELCID(MAKELANGID(LANG_MALAY, SUBLANG_MALAY_MALAYSIA), SORT_DEFAULT) },
+ { {'n','l',0}, MAKELCID(MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH), SORT_DEFAULT) },
+ { {'p','t',0}, MAKELCID(MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN), SORT_DEFAULT) },
+ { {'s','r',0}, MAKELCID(MAKELANGID(LANG_SERBIAN, SUBLANG_SERBIAN_CROATIA), SORT_DEFAULT) },
+ { {'s','v',0}, MAKELCID(MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH), SORT_DEFAULT) },
+ { {'u','z',0}, MAKELCID(MAKELANGID(LANG_UZBEK, SUBLANG_UZBEK_LATIN), SORT_DEFAULT) },
+ { {'z','h',0}, MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT) },
+ { {0} }
+};
+
static void test_GetLocaleInfoW(void)
{
LCID lcid_en = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
LCID lcid_ru = MAKELCID(MAKELANGID(LANG_RUSSIAN, SUBLANG_NEUTRAL), SORT_DEFAULT);
+ LCID lcid_en_neut = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), SORT_DEFAULT);
WCHAR bufferW[80], buffer2W[80];
CHAR bufferA[80];
+ DWORD val;
DWORD ret;
INT i;
@@ -206,6 +241,49 @@ static void test_GetLocaleInfoW(void)
win_skip("GetLocaleInfoW() isn't implemented\n");
return;
}
+
+ ret = GetLocaleInfoW(lcid_en, LOCALE_ILANGUAGE|LOCALE_RETURN_NUMBER, (WCHAR*)&val, sizeof(val)/sizeof(WCHAR));
+ ok(ret, "got %d\n", ret);
+todo_wine
+ ok(val == lcid_en, "got 0x%08x\n", val);
+
+ ret = GetLocaleInfoW(lcid_en_neut, LOCALE_SNAME, bufferW, COUNTOF(bufferW));
+ if (ret)
+ {
+ static const WCHAR slangW[] = {'E','n','g','l','i','s','h',' ','(','U','n','i','t','e','d',' ',
+ 'S','t','a','t','e','s',')',0};
+ static const WCHAR statesW[] = {'U','n','i','t','e','d',' ','S','t','a','t','e','s',0};
+ static const WCHAR enW[] = {'e','n','-','U','S',0};
+ const struct neutralsublang_name2_t *ptr = neutralsublang_names2;
+
+ ok(!lstrcmpW(bufferW, enW), "got wrong name %s\n", wine_dbgstr_w(bufferW));
+
+ ret = GetLocaleInfoW(lcid_en_neut, LOCALE_SCOUNTRY, bufferW, COUNTOF(bufferW));
+ ok(ret, "got %d\n", ret);
+ ok(!lstrcmpW(statesW, bufferW), "got wrong name %s\n", wine_dbgstr_w(bufferW));
+
+ ret = GetLocaleInfoW(lcid_en_neut, LOCALE_SLANGUAGE, bufferW, COUNTOF(bufferW));
+ ok(ret, "got %d\n", ret);
+ ok(!lstrcmpW(slangW, bufferW), "got wrong name %s\n", wine_dbgstr_w(bufferW));
+
+ while (*ptr->name)
+ {
+ LANGID langid;
+
+ /* make neutral lcid */
+ langid = MAKELANGID(PRIMARYLANGID(LANGIDFROMLCID(ptr->lcid)), SUBLANG_NEUTRAL);
+
+ val = 0;
+ GetLocaleInfoW(MAKELCID(langid, SORT_DEFAULT), LOCALE_ILANGUAGE|LOCALE_RETURN_NUMBER, (WCHAR*)&val, sizeof(val)/sizeof(WCHAR));
+ todo_wine
+ ok(val == ptr->lcid || broken(val == ptr->lcid_broken), "%s: got wrong lcid 0x%04x, expected 0x%04x\n",
+ wine_dbgstr_w(ptr->name), val, ptr->lcid);
+ ptr++;
+ }
+ }
+ else
+ win_skip("English neutral locale not supported\n");
+
ret = GetLocaleInfoW(lcid_ru, LOCALE_SMONTHNAME1, bufferW, COUNTOF(bufferW));
if (!ret) {
win_skip("LANG_RUSSIAN locale data unavailable\n");
@@ -1714,11 +1792,36 @@ static void test_LCMapStringEx(void)
test_lcmapstring_unicode(LCMapStringEx_wrapper, "LCMapStringEx:");
}
-static void test_LocaleNames(void)
+struct neutralsublang_name_t {
+ WCHAR name[3];
+ LCID lcid;
+ int todo;
+};
+
+static const struct neutralsublang_name_t neutralsublang_names[] = {
+ { {'a','r',0}, MAKELCID(MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA), SORT_DEFAULT) },
+ { {'a','z',0}, MAKELCID(MAKELANGID(LANG_AZERI, SUBLANG_AZERI_LATIN), SORT_DEFAULT) },
+ { {'d','e',0}, MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT) },
+ { {'e','n',0}, MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) },
+ { {'e','s',0}, MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), SORT_DEFAULT), 1 },
+ { {'g','a',0}, MAKELCID(MAKELANGID(LANG_IRISH, SUBLANG_IRISH_IRELAND), SORT_DEFAULT), 1 },
+ { {'i','t',0}, MAKELCID(MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN), SORT_DEFAULT) },
+ { {'m','s',0}, MAKELCID(MAKELANGID(LANG_MALAY, SUBLANG_MALAY_MALAYSIA), SORT_DEFAULT) },
+ { {'n','l',0}, MAKELCID(MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH), SORT_DEFAULT) },
+ { {'p','t',0}, MAKELCID(MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN), SORT_DEFAULT) },
+ { {'s','r',0}, MAKELCID(MAKELANGID(LANG_SERBIAN, SUBLANG_SERBIAN_SERBIA_LATIN), SORT_DEFAULT), 1 },
+ { {'s','v',0}, MAKELCID(MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH), SORT_DEFAULT) },
+ { {'u','z',0}, MAKELCID(MAKELANGID(LANG_UZBEK, SUBLANG_UZBEK_LATIN), SORT_DEFAULT) },
+ { {'z','h',0}, MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT), 1 },
+ { {0} }
+};
+
+static void test_LocaleNameToLCID(void)
{
LCID lcid;
INT ret;
WCHAR buffer[LOCALE_NAME_MAX_LENGTH];
+ static const WCHAR enW[] = {'e','n',0};
if (!pLocaleNameToLCID)
{
@@ -1749,6 +1852,28 @@ static void test_LocaleNames(void)
ret = pLCIDToLocaleName(lcid, buffer, LOCALE_NAME_MAX_LENGTH, 0);
ok(ret > 0, "Expected ret > 0, got %d, error %d\n", ret, GetLastError());
trace("%08x, %s\n", lcid, wine_dbgstr_w(buffer));
+
+ /* english neutral name */
+ lcid = pLocaleNameToLCID(enW, 0);
+ ok(lcid == MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) ||
+ broken(lcid == 0) /* Vista */, "got 0x%04x\n", lcid);
+ if (lcid)
+ {
+ const struct neutralsublang_name_t *ptr = neutralsublang_names;
+
+ while (*ptr->name)
+ {
+ lcid = pLocaleNameToLCID(ptr->name, 0);
+ if (ptr->todo)
+ todo_wine
+ ok(lcid == ptr->lcid, "%s: got wrong lcid 0x%04x, expected 0x%04x\n",
+ wine_dbgstr_w(ptr->name), lcid, ptr->lcid);
+ else
+ ok(lcid == ptr->lcid, "%s: got wrong lcid 0x%04x, expected 0x%04x\n",
+ wine_dbgstr_w(ptr->name), lcid, ptr->lcid);
+ ptr++;
+ }
+ }
}
/* this requires collation table patch to make it MS compatible */
@@ -3204,14 +3329,75 @@ static void test_IdnToUnicode(void)
}
}
+static void test_GetLocaleInfoEx(void)
+{
+ static const WCHAR enW[] = {'e','n',0};
+ WCHAR bufferW[80];
+ INT ret;
+
+ if (!pGetLocaleInfoEx)
+ {
+ win_skip("GetLocaleInfoEx not supported\n");
+ return;
+ }
+
+ ret = pGetLocaleInfoEx(enW, LOCALE_SNAME, bufferW, sizeof(bufferW)/sizeof(WCHAR));
+ ok(ret || broken(ret == 0) /* Vista */, "got %d\n", ret);
+ if (ret)
+ {
+ static const WCHAR statesW[] = {'U','n','i','t','e','d',' ','S','t','a','t','e','s',0};
+ static const WCHAR dummyW[] = {'d','u','m','m','y',0};
+ static const WCHAR enusW[] = {'e','n','-','U','S',0};
+ static const WCHAR usaW[] = {'U','S','A',0};
+ static const WCHAR enuW[] = {'E','N','U',0};
+ const struct neutralsublang_name_t *ptr = neutralsublang_names;
+ DWORD val;
+
+todo_wine
+ ok(!lstrcmpW(bufferW, enW), "got %s\n", wine_dbgstr_w(bufferW));
+
+ ret = pGetLocaleInfoEx(enusW, LOCALE_SNAME, bufferW, sizeof(bufferW)/sizeof(WCHAR));
+ ok(ret, "got %d\n", ret);
+ ok(!lstrcmpW(bufferW, enusW), "got %s\n", wine_dbgstr_w(bufferW));
+
+ ret = pGetLocaleInfoEx(enW, LOCALE_SABBREVCTRYNAME, bufferW, sizeof(bufferW)/sizeof(WCHAR));
+ ok(ret, "got %d\n", ret);
+ ok(!lstrcmpW(bufferW, usaW), "got %s\n", wine_dbgstr_w(bufferW));
+
+ ret = pGetLocaleInfoEx(enW, LOCALE_SABBREVLANGNAME, bufferW, sizeof(bufferW)/sizeof(WCHAR));
+ ok(ret, "got %d\n", ret);
+ ok(!lstrcmpW(bufferW, enuW), "got %s\n", wine_dbgstr_w(bufferW));
+
+ ret = pGetLocaleInfoEx(enW, LOCALE_SCOUNTRY, bufferW, sizeof(bufferW)/sizeof(WCHAR));
+ ok(ret, "got %d\n", ret);
+ ok(!lstrcmpW(bufferW, statesW), "got %s\n", wine_dbgstr_w(bufferW));
+
+ bufferW[0] = 0;
+ ret = pGetLocaleInfoEx(dummyW, LOCALE_SNAME, bufferW, sizeof(bufferW)/sizeof(WCHAR));
+todo_wine
+ ok(!ret, "got %d\n", ret);
+
+ while (*ptr->name)
+ {
+ val = 0;
+ pGetLocaleInfoEx(ptr->name, LOCALE_ILANGUAGE|LOCALE_RETURN_NUMBER, (WCHAR*)&val, sizeof(val)/sizeof(WCHAR));
+ todo_wine
+ ok(val == ptr->lcid, "%s: got wrong lcid 0x%04x, expected 0x%04x\n", wine_dbgstr_w(ptr->name), val, ptr->lcid);
+ ptr++;
+ }
+ }
+}
+
START_TEST(locale)
{
InitFunctionPointers();
+
test_EnumTimeFormatsA();
test_EnumDateFormatsA();
test_GetLocaleInfoA();
test_GetLocaleInfoW();
+ test_GetLocaleInfoEx();
test_GetTimeFormatA();
test_GetDateFormatA();
test_GetDateFormatW();
@@ -3221,7 +3407,7 @@ START_TEST(locale)
test_LCMapStringA();
test_LCMapStringW();
test_LCMapStringEx();
- test_LocaleNames();
+ test_LocaleNameToLCID();
test_FoldStringA();
test_FoldStringW();
test_ConvertDefaultLocale();
--
1.5.6.5
More information about the wine-patches
mailing list