[PATCH 2/2] ntdll/tests: Add RtlLCIDToCultureName tests.
Mark Harmstone
mark at harmstone.com
Tue Apr 6 13:22:06 CDT 2021
Signed-off-by: Mark Harmstone <mark at harmstone.com>
---
dlls/ntdll/tests/Makefile.in | 1 +
dlls/ntdll/tests/mui.c | 451 +++++++++++++++++++++++++++++++++++
2 files changed, 452 insertions(+)
create mode 100644 dlls/ntdll/tests/mui.c
diff --git a/dlls/ntdll/tests/Makefile.in b/dlls/ntdll/tests/Makefile.in
index ed15c51339f..e8896fe25cb 100644
--- a/dlls/ntdll/tests/Makefile.in
+++ b/dlls/ntdll/tests/Makefile.in
@@ -12,6 +12,7 @@ C_SRCS = \
generated.c \
info.c \
large_int.c \
+ mui.c \
om.c \
path.c \
pipe.c \
diff --git a/dlls/ntdll/tests/mui.c b/dlls/ntdll/tests/mui.c
new file mode 100644
index 00000000000..488dfc02033
--- /dev/null
+++ b/dlls/ntdll/tests/mui.c
@@ -0,0 +1,451 @@
+/*
+ * Unit test suite for MUI functions
+ *
+ * Copyright 2021 Mark Harmstone
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "ntdll_test.h"
+
+static BOOLEAN (NTAPI *pRtlLCIDToCultureName)(LCID, PUNICODE_STRING);
+static NTSTATUS (NTAPI *pNtQueryDefaultLocale)(BOOLEAN, PLCID);
+static LONG (NTAPI *pRtlCompareUnicodeString)(PCUNICODE_STRING, PCUNICODE_STRING, BOOLEAN);
+
+static const char *debugstr_us( const UNICODE_STRING *us )
+{
+ if (!us) return "<null>";
+ return debugstr_wn( us->Buffer, us->Length / sizeof(WCHAR) );
+}
+
+static void test_lcid_to_culture_name(void)
+{
+ struct lang
+ {
+ LCID lcid;
+ const WCHAR *name;
+ };
+
+ static const struct lang list[] =
+ {
+ { 0x0001, L"ar" },
+ { 0x0002, L"bg" },
+ { 0x0003, L"ca" },
+ { 0x0004, L"zh-Hans" },
+ { 0x0005, L"cs" },
+ { 0x0006, L"da" },
+ { 0x0007, L"de" },
+ { 0x0008, L"el" },
+ { 0x0009, L"en" },
+ { 0x000a, L"es" },
+ { 0x000b, L"fi" },
+ { 0x000c, L"fr" },
+ { 0x000d, L"he" },
+ { 0x000e, L"hu" },
+ { 0x000f, L"is" },
+ { 0x0010, L"it" },
+ { 0x0011, L"ja" },
+ { 0x0012, L"ko" },
+ { 0x0013, L"nl" },
+ { 0x0014, L"no" },
+ { 0x0015, L"pl" },
+ { 0x0016, L"pt" },
+ { 0x0017, L"rm" },
+ { 0x0018, L"ro" },
+ { 0x0019, L"ru" },
+ { 0x001a, L"hr" },
+ { 0x001b, L"sk" },
+ { 0x001c, L"sq" },
+ { 0x001d, L"sv" },
+ { 0x001e, L"th" },
+ { 0x001f, L"tr" },
+ { 0x0020, L"ur" },
+ { 0x0021, L"id" },
+ { 0x0022, L"uk" },
+ { 0x0023, L"be" },
+ { 0x0024, L"sl" },
+ { 0x0025, L"et" },
+ { 0x0026, L"lv" },
+ { 0x0027, L"lt" },
+ { 0x0028, L"tg" },
+ { 0x0029, L"fa" },
+ { 0x002a, L"vi" },
+ { 0x002b, L"hy" },
+ { 0x002c, L"az" },
+ { 0x002d, L"eu" },
+ { 0x002e, L"hsb" },
+ { 0x002f, L"mk" },
+ { 0x0032, L"tn" },
+ { 0x0034, L"xh" },
+ { 0x0035, L"zu" },
+ { 0x0036, L"af" },
+ { 0x0037, L"ka" },
+ { 0x0038, L"fo" },
+ { 0x0039, L"hi" },
+ { 0x003a, L"mt" },
+ { 0x003b, L"se" },
+ { 0x003c, L"ga" },
+ { 0x003e, L"ms" },
+ { 0x003f, L"kk" },
+ { 0x0040, L"ky" },
+ { 0x0041, L"sw" },
+ { 0x0042, L"tk" },
+ { 0x0043, L"uz" },
+ { 0x0044, L"tt" },
+ { 0x0045, L"bn" },
+ { 0x0046, L"pa" },
+ { 0x0047, L"gu" },
+ { 0x0048, L"or" },
+ { 0x0049, L"ta" },
+ { 0x004a, L"te" },
+ { 0x004b, L"kn" },
+ { 0x004c, L"ml" },
+ { 0x004d, L"as" },
+ { 0x004e, L"mr" },
+ { 0x004f, L"sa" },
+ { 0x0050, L"mn" },
+ { 0x0051, L"bo" },
+ { 0x0052, L"cy" },
+ { 0x0053, L"km" },
+ { 0x0054, L"lo" },
+ { 0x0056, L"gl" },
+ { 0x0057, L"kok" },
+ { 0x005a, L"syr" },
+ { 0x005b, L"si" },
+ { 0x005d, L"iu" },
+ { 0x005e, L"am" },
+ { 0x005f, L"tzm" },
+ { 0x0061, L"ne" },
+ { 0x0062, L"fy" },
+ { 0x0063, L"ps" },
+ { 0x0064, L"fil" },
+ { 0x0065, L"dv" },
+ { 0x0068, L"ha" },
+ { 0x006a, L"yo" },
+ { 0x006b, L"quz" },
+ { 0x006c, L"nso" },
+ { 0x006d, L"ba" },
+ { 0x006e, L"lb" },
+ { 0x006f, L"kl" },
+ { 0x0070, L"ig" },
+ { 0x0078, L"ii" },
+ { 0x007a, L"arn" },
+ { 0x007c, L"moh" },
+ { 0x007e, L"br" },
+ { 0x007f, L"" },
+ { 0x0080, L"ug" },
+ { 0x0081, L"mi" },
+ { 0x0082, L"oc" },
+ { 0x0083, L"co" },
+ { 0x0084, L"gsw" },
+ { 0x0085, L"sah" },
+ { 0x0087, L"rw" },
+ { 0x0088, L"wo" },
+ { 0x008c, L"prs" },
+ { 0x0401, L"ar-SA" },
+ { 0x0402, L"bg-BG" },
+ { 0x0403, L"ca-ES" },
+ { 0x0404, L"zh-TW" },
+ { 0x0405, L"cs-CZ" },
+ { 0x0406, L"da-DK" },
+ { 0x0407, L"de-DE" },
+ { 0x0408, L"el-GR" },
+ { 0x0409, L"en-US" },
+ { 0x040a, L"es-ES_tradnl" },
+ { 0x040b, L"fi-FI" },
+ { 0x040c, L"fr-FR" },
+ { 0x040d, L"he-IL" },
+ { 0x040e, L"hu-HU" },
+ { 0x040f, L"is-IS" },
+ { 0x0410, L"it-IT" },
+ { 0x0411, L"ja-JP" },
+ { 0x0412, L"ko-KR" },
+ { 0x0413, L"nl-NL" },
+ { 0x0414, L"nb-NO" },
+ { 0x0415, L"pl-PL" },
+ { 0x0416, L"pt-BR" },
+ { 0x0417, L"rm-CH" },
+ { 0x0418, L"ro-RO" },
+ { 0x0419, L"ru-RU" },
+ { 0x041a, L"hr-HR" },
+ { 0x041b, L"sk-SK" },
+ { 0x041c, L"sq-AL" },
+ { 0x041d, L"sv-SE" },
+ { 0x041e, L"th-TH" },
+ { 0x041f, L"tr-TR" },
+ { 0x0420, L"ur-PK" },
+ { 0x0421, L"id-ID" },
+ { 0x0422, L"uk-UA" },
+ { 0x0423, L"be-BY" },
+ { 0x0424, L"sl-SI" },
+ { 0x0425, L"et-EE" },
+ { 0x0426, L"lv-LV" },
+ { 0x0427, L"lt-LT" },
+ { 0x0429, L"fa-IR" },
+ { 0x042a, L"vi-VN" },
+ { 0x042b, L"hy-AM" },
+ { 0x042c, L"az-Latn-AZ" },
+ { 0x042d, L"eu-ES" },
+ { 0x042f, L"mk-MK" },
+ { 0x0436, L"af-ZA" },
+ { 0x0437, L"ka-GE" },
+ { 0x0438, L"fo-FO" },
+ { 0x0439, L"hi-IN" },
+ { 0x043e, L"ms-MY" },
+ { 0x043f, L"kk-KZ" },
+ { 0x0440, L"ky-KG" },
+ { 0x0441, L"sw-KE" },
+ { 0x0443, L"uz-Latn-UZ" },
+ { 0x0444, L"tt-RU" },
+ { 0x0445, L"bn-IN" },
+ { 0x0446, L"pa-IN" },
+ { 0x0447, L"gu-IN" },
+ { 0x0449, L"ta-IN" },
+ { 0x044a, L"te-IN" },
+ { 0x044b, L"kn-IN" },
+ { 0x044e, L"mr-IN" },
+ { 0x044f, L"sa-IN" },
+ { 0x0450, L"mn-MN" },
+ { 0x0452, L"cy-GB" },
+ { 0x0456, L"gl-ES" },
+ { 0x0457, L"kok-IN" },
+ { 0x045a, L"syr-SY" },
+ { 0x045b, L"si-LK" },
+ { 0x0461, L"ne-NP" },
+ { 0x0465, L"dv-MV" },
+ { 0x047e, L"br-FR" },
+ { 0x0801, L"ar-IQ" },
+ { 0x0804, L"zh-CN" },
+ { 0x0807, L"de-CH" },
+ { 0x0809, L"en-GB" },
+ { 0x080a, L"es-MX" },
+ { 0x080c, L"fr-BE" },
+ { 0x0810, L"it-CH" },
+ { 0x0813, L"nl-BE" },
+ { 0x0814, L"nn-NO" },
+ { 0x0816, L"pt-PT" },
+ { 0x081a, L"sr-Latn-CS" },
+ { 0x081d, L"sv-FI" },
+ { 0x082c, L"az-Cyrl-AZ" },
+ { 0x083c, L"ga-IE" },
+ { 0x083e, L"ms-BN" },
+ { 0x0843, L"uz-Cyrl-UZ" },
+ { 0x0c01, L"ar-EG" },
+ { 0x0c04, L"zh-HK" },
+ { 0x0c07, L"de-AT" },
+ { 0x0c09, L"en-AU" },
+ { 0x0c0a, L"es-ES" },
+ { 0x0c0c, L"fr-CA" },
+ { 0x1001, L"ar-LY" },
+ { 0x1004, L"zh-SG" },
+ { 0x1007, L"de-LU" },
+ { 0x1009, L"en-CA" },
+ { 0x100a, L"es-GT" },
+ { 0x100c, L"fr-CH" },
+ { 0x1401, L"ar-DZ" },
+ { 0x1404, L"zh-MO" },
+ { 0x1407, L"de-LI" },
+ { 0x1409, L"en-NZ" },
+ { 0x140a, L"es-CR" },
+ { 0x140c, L"fr-LU" },
+ { 0x1801, L"ar-MA" },
+ { 0x1809, L"en-IE" },
+ { 0x180a, L"es-PA" },
+ { 0x180c, L"fr-MC" },
+ { 0x1c01, L"ar-TN" },
+ { 0x1c09, L"en-ZA" },
+ { 0x1c0a, L"es-DO" },
+ { 0x2001, L"ar-OM" },
+ { 0x2009, L"en-JM" },
+ { 0x200a, L"es-VE" },
+ { 0x2401, L"ar-YE" },
+ { 0x2409, L"en-029" },
+ { 0x240a, L"es-CO" },
+ { 0x2801, L"ar-SY" },
+ { 0x2809, L"en-BZ" },
+ { 0x280a, L"es-PE" },
+ { 0x2c01, L"ar-JO" },
+ { 0x2c09, L"en-TT" },
+ { 0x2c0a, L"es-AR" },
+ { 0x3001, L"ar-LB" },
+ { 0x3009, L"en-ZW" },
+ { 0x300a, L"es-EC" },
+ { 0x3401, L"ar-KW" },
+ { 0x3409, L"en-PH" },
+ { 0x340a, L"es-CL" },
+ { 0x3801, L"ar-AE" },
+ { 0x380a, L"es-UY" },
+ { 0x3c01, L"ar-BH" },
+ { 0x3c0a, L"es-PY" },
+ { 0x4001, L"ar-QA" },
+ { 0x400a, L"es-BO" },
+ { 0x440a, L"es-SV" },
+ { 0x480a, L"es-HN" },
+ { 0x4c0a, L"es-NI" },
+ { 0x500a, L"es-PR" },
+ { 0, NULL }
+ };
+
+ /* Languages introduced after Vista */
+ static const struct lang opt_list[] =
+ {
+ { 0x0058, L"mni" },
+ { 0x0059, L"sd" },
+ { 0x0491, L"gd-GB" },
+ { 0x241a, L"sr-Latn-RS" },
+ { 0, NULL }
+ };
+
+ unsigned int i;
+ WCHAR buf[255];
+ UNICODE_STRING us;
+ NTSTATUS nts;
+ LCID user_lcid, system_lcid;
+
+ if (!pRtlLCIDToCultureName)
+ {
+ win_skip("RtlLCIDToCultureName not supported\n");
+ return;
+ }
+
+ us.Buffer = buf;
+ us.Length = us.MaximumLength = sizeof(buf);
+
+ i = 0;
+ while (list[i].name)
+ {
+ BOOLEAN ret;
+
+ ret = pRtlLCIDToCultureName(list[i].lcid, &us);
+
+ ok(ret, "RtlLCIDTOCultureName failed for LCID %04x\n", list[i].lcid);
+
+ if (ret)
+ {
+ ok(us.Length == wcslen(list[i].name) * sizeof(WCHAR)
+ && !memcmp(us.Buffer, list[i].name, us.Length),
+ "RtlLCIDTOCultureName returned wrong value for LCID %04x (%s, expected %s)\n",
+ list[i].lcid, debugstr_us(&us), debugstr_w(list[i].name));
+ }
+
+ i++;
+ }
+
+ i = 0;
+ while (opt_list[i].name)
+ {
+ BOOLEAN ret;
+
+ ret = pRtlLCIDToCultureName(opt_list[i].lcid, &us);
+
+ if (!ret)
+ {
+ win_skip("RtlLCIDTOCultureName does not recognize LCID %04x\n",
+ opt_list[i].lcid);
+ }
+ else
+ {
+ ok(us.Length == wcslen(opt_list[i].name) * sizeof(WCHAR)
+ && !memcmp(us.Buffer, opt_list[i].name, us.Length),
+ "RtlLCIDTOCultureName returned wrong value for LCID %04x (%s, expected %s)\n",
+ opt_list[i].lcid, debugstr_us(&us), debugstr_w(opt_list[i].name));
+ }
+
+ i++;
+ }
+
+ if (!pNtQueryDefaultLocale)
+ {
+ win_skip("NtQueryDefaultLocale not supported\n");
+ return;
+ }
+
+ nts = pNtQueryDefaultLocale(TRUE, &user_lcid);
+
+ ok(NT_SUCCESS(nts), "NtQueryDefaultLocale(TRUE) returned %08x, expected STATUS_SUCCESS\n",
+ nts);
+
+ if (NT_SUCCESS(nts))
+ {
+ WCHAR buf2[255];
+ UNICODE_STRING us2;
+ BOOLEAN ret;
+
+ us2.Buffer = buf2;
+ us2.Length = us2.MaximumLength = sizeof(buf2);
+
+ ret = pRtlLCIDToCultureName(user_lcid, &us2);
+
+ ok(ret, "RtlLCIDTOCultureName failed for LCID %04x\n", list[i].lcid);
+
+ if (ret)
+ {
+ ret = pRtlLCIDToCultureName(LOCALE_USER_DEFAULT, &us);
+
+ ok(ret, "RtlLCIDTOCultureName failed for LOCALE_USER_DEFAULT\n");
+
+ if (ret)
+ {
+ ok(!pRtlCompareUnicodeString(&us, &us2, FALSE),
+ "RtlLCIDTOCultureName returned incorrect value for LOCALE_USER_DEFAULT (%s, expected %s)\n",
+ debugstr_us(&us), debugstr_us(&us2));
+ }
+ }
+ }
+
+ nts = pNtQueryDefaultLocale(FALSE, &system_lcid);
+
+ ok(NT_SUCCESS(nts), "NtQueryDefaultLocale(FALSE) returned %08x, expected STATUS_SUCCESS\n",
+ nts);
+
+ if (NT_SUCCESS(nts))
+ {
+ WCHAR buf2[255];
+ UNICODE_STRING us2;
+ BOOLEAN ret;
+
+ us2.Buffer = buf2;
+ us2.Length = us2.MaximumLength = sizeof(buf2);
+
+ ret = pRtlLCIDToCultureName(system_lcid, &us2);
+
+ ok(ret, "RtlLCIDTOCultureName failed for LCID %04x\n", list[i].lcid);
+
+ if (ret)
+ {
+ ret = pRtlLCIDToCultureName(LOCALE_SYSTEM_DEFAULT, &us);
+
+ ok(ret, "RtlLCIDTOCultureName failed for LOCALE_SYSTEM_DEFAULT\n");
+
+ if (ret)
+ {
+ ok(!pRtlCompareUnicodeString(&us, &us2, FALSE),
+ "RtlLCIDTOCultureName returned incorrect value for LOCALE_SYSTEM_DEFAULT (%s, expected %s)\n",
+ debugstr_us(&us), debugstr_us(&us2));
+ }
+ }
+ }
+}
+
+START_TEST(mui)
+{
+ HMODULE hntdll = GetModuleHandleA( "ntdll.dll" );
+
+ pRtlCompareUnicodeString = (void*)GetProcAddress( hntdll, "RtlCompareUnicodeString" );
+ pRtlLCIDToCultureName = (void*)GetProcAddress( hntdll, "RtlLCIDToCultureName" );
+ pNtQueryDefaultLocale = (void*)GetProcAddress( hntdll, "NtQueryDefaultLocale" );
+
+ test_lcid_to_culture_name();
+}
--
2.26.3
More information about the wine-devel
mailing list