[1/2] kernel32/tests: Add tests for LCMapStringEx
André Hentschel
nerv at dawncrow.de
Sun Apr 1 09:53:43 CDT 2012
---
dlls/kernel32/tests/locale.c | 154 ++++++++++++++++++++++++++---------------
include/winnls.h | 14 ++++
2 files changed, 112 insertions(+), 56 deletions(-)
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 49678ce..d27666a 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -36,6 +36,11 @@
#include "winerror.h"
#include "winnls.h"
+static const WCHAR upper_case[] = {'\t','J','U','S','T','!',' ','A',',',' ','T','E','S','T',';',' ','S','T','R','I','N','G',' ','1','/','*','+','-','.','\r','\n',0};
+static const WCHAR lower_case[] = {'\t','j','u','s','t','!',' ','a',',',' ','t','e','s','t',';',' ','s','t','r','i','n','g',' ','1','/','*','+','-','.','\r','\n',0};
+static const WCHAR symbols_stripped[] = {'j','u','s','t','a','t','e','s','t','s','t','r','i','n','g','1',0};
+static const WCHAR fooW[] = {'f','o','o',0};
+
static inline unsigned int strlenW( const WCHAR *str )
{
const WCHAR *s = str;
@@ -71,6 +76,7 @@ static BOOL (WINAPI *pEnumSystemLanguageGroupsA)(LANGUAGEGROUP_ENUMPROC, DWORD,
static BOOL (WINAPI *pEnumLanguageGroupLocalesA)(LANGGROUPLOCALE_ENUMPROC, LGRPID, DWORD, LONG_PTR);
static BOOL (WINAPI *pEnumUILanguagesA)(UILANGUAGE_ENUMPROC, DWORD, LONG_PTR);
static BOOL (WINAPI *pEnumSystemLocalesEx)(LOCALE_ENUMPROCEX, DWORD, LPARAM, LPVOID);
+static INT (WINAPI *pLCMapStringEx)(LPCWSTR, DWORD, LPCWSTR, INT, LPWSTR, INT, LPNLSVERSIONINFO, LPVOID, LPARAM);
static LCID (WINAPI *pLocaleNameToLCID)(LPCWSTR, DWORD);
static INT (WINAPI *pLCIDToLocaleName)(LCID, LPWSTR, INT, DWORD);
static INT (WINAPI *pFoldStringA)(DWORD, LPCSTR, INT, LPSTR, INT);
@@ -84,6 +90,7 @@ static void InitFunctionPointers(void)
pEnumLanguageGroupLocalesA = (void*)GetProcAddress(hKernel32, "EnumLanguageGroupLocalesA");
pLocaleNameToLCID = (void*)GetProcAddress(hKernel32, "LocaleNameToLCID");
pLCIDToLocaleName = (void*)GetProcAddress(hKernel32, "LCIDToLocaleName");
+ pLCMapStringEx = (void*)GetProcAddress(hKernel32, "LCMapStringEx");
pFoldStringA = (void*)GetProcAddress(hKernel32, "FoldStringA");
pFoldStringW = (void*)GetProcAddress(hKernel32, "FoldStringW");
pIsValidLanguageGroup = (void*)GetProcAddress(hKernel32, "IsValidLanguageGroup");
@@ -1484,123 +1491,106 @@ static void test_LCMapStringA(void)
"unexpected error code %d\n", GetLastError());
}
-static void test_LCMapStringW(void)
+static void test_LCMapStringUnicode(INT LCMapStringU(DWORD, LPCWSTR, INT, LPWSTR, INT))
{
int ret, ret2;
WCHAR buf[256], buf2[256];
char *p_buf = (char *)buf, *p_buf2 = (char *)buf2;
- static const WCHAR upper_case[] = {'\t','J','U','S','T','!',' ','A',',',' ','T','E','S','T',';',' ','S','T','R','I','N','G',' ','1','/','*','+','-','.','\r','\n',0};
- static const WCHAR lower_case[] = {'\t','j','u','s','t','!',' ','a',',',' ','t','e','s','t',';',' ','s','t','r','i','n','g',' ','1','/','*','+','-','.','\r','\n',0};
- static const WCHAR symbols_stripped[] = {'j','u','s','t','a','t','e','s','t','s','t','r','i','n','g','1',0};
- static const WCHAR fooW[] = {'f','o','o',0};
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE | LCMAP_UPPERCASE,
+ ret = LCMapStringU(LCMAP_LOWERCASE | LCMAP_UPPERCASE,
upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR));
- if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
- {
- win_skip("LCMapStringW is not implemented\n");
- return;
- }
if (broken(ret))
ok(lstrcmpW(buf, upper_case) == 0, "Expected upper case string\n");
else
{
ok(!ret, "LCMAP_LOWERCASE and LCMAP_UPPERCASE are mutually exclusive\n");
- ok(GetLastError() == ERROR_INVALID_FLAGS,
- "unexpected error code %d\n", GetLastError());
+ ok(GetLastError() == ERROR_INVALID_FLAGS, "unexpected error code %d\n", GetLastError());
}
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_HIRAGANA | LCMAP_KATAKANA,
+ ret = LCMapStringU(LCMAP_HIRAGANA | LCMAP_KATAKANA,
upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR));
ok(!ret, "LCMAP_HIRAGANA and LCMAP_KATAKANA are mutually exclusive\n");
- ok(GetLastError() == ERROR_INVALID_FLAGS,
- "unexpected error code %d\n", GetLastError());
+ ok(GetLastError() == ERROR_INVALID_FLAGS, "unexpected error code %d\n", GetLastError());
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_HALFWIDTH | LCMAP_FULLWIDTH,
+ ret = LCMapStringU(LCMAP_HALFWIDTH | LCMAP_FULLWIDTH,
upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR));
ok(!ret, "LCMAP_HALFWIDTH | LCMAP_FULLWIDTH are mutually exclusive\n");
- ok(GetLastError() == ERROR_INVALID_FLAGS,
- "unexpected error code %d\n", GetLastError());
+ ok(GetLastError() == ERROR_INVALID_FLAGS, "unexpected error code %d\n", GetLastError());
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_TRADITIONAL_CHINESE | LCMAP_SIMPLIFIED_CHINESE,
+ ret = LCMapStringU(LCMAP_TRADITIONAL_CHINESE | LCMAP_SIMPLIFIED_CHINESE,
upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR));
ok(!ret, "LCMAP_TRADITIONAL_CHINESE and LCMAP_SIMPLIFIED_CHINESE are mutually exclusive\n");
- ok(GetLastError() == ERROR_INVALID_FLAGS,
- "unexpected error code %d\n", GetLastError());
+ ok(GetLastError() == ERROR_INVALID_FLAGS, "unexpected error code %d\n", GetLastError());
/* SORT_STRINGSORT must be used exclusively with LCMAP_SORTKEY */
SetLastError(0xdeadbeef);
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE | SORT_STRINGSORT,
+ ret = LCMapStringU(LCMAP_LOWERCASE | SORT_STRINGSORT,
upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR));
ok(GetLastError() == ERROR_INVALID_FLAGS, "expected ERROR_INVALID_FLAGS, got %d\n", GetLastError());
ok(!ret, "SORT_STRINGSORT without LCMAP_SORTKEY must fail\n");
/* test LCMAP_LOWERCASE */
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE,
+ ret = LCMapStringU(LCMAP_LOWERCASE,
upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR));
- ok(ret == lstrlenW(upper_case) + 1,
- "ret %d, error %d, expected value %d\n",
+ ok(ret == lstrlenW(upper_case) + 1, "ret %d, error %d, expected value %d\n",
ret, GetLastError(), lstrlenW(upper_case) + 1);
ok(!lstrcmpW(buf, lower_case), "string compare mismatch\n");
/* test LCMAP_UPPERCASE */
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_UPPERCASE,
+ ret = LCMapStringU(LCMAP_UPPERCASE,
lower_case, -1, buf, sizeof(buf)/sizeof(WCHAR));
- ok(ret == lstrlenW(lower_case) + 1,
- "ret %d, error %d, expected value %d\n",
+ ok(ret == lstrlenW(lower_case) + 1, "ret %d, error %d, expected value %d\n",
ret, GetLastError(), lstrlenW(lower_case) + 1);
ok(!lstrcmpW(buf, upper_case), "string compare mismatch\n");
/* test buffer overflow */
SetLastError(0xdeadbeef);
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_UPPERCASE,
+ ret = LCMapStringU(LCMAP_UPPERCASE,
lower_case, -1, buf, 4);
ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"should return 0 and ERROR_INSUFFICIENT_BUFFER, got %d\n", ret);
/* LCMAP_UPPERCASE or LCMAP_LOWERCASE should accept src == dst */
lstrcpyW(buf, lower_case);
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_UPPERCASE,
+ ret = LCMapStringU(LCMAP_UPPERCASE,
buf, -1, buf, sizeof(buf)/sizeof(WCHAR));
- ok(ret == lstrlenW(lower_case) + 1,
- "ret %d, error %d, expected value %d\n",
+ ok(ret == lstrlenW(lower_case) + 1, "ret %d, error %d, expected value %d\n",
ret, GetLastError(), lstrlenW(lower_case) + 1);
ok(!lstrcmpW(buf, upper_case), "string compare mismatch\n");
lstrcpyW(buf, upper_case);
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE,
+ ret = LCMapStringU(LCMAP_LOWERCASE,
buf, -1, buf, sizeof(buf)/sizeof(WCHAR));
- ok(ret == lstrlenW(upper_case) + 1,
- "ret %d, error %d, expected value %d\n",
+ ok(ret == lstrlenW(upper_case) + 1, "ret %d, error %d, expected value %d\n",
ret, GetLastError(), lstrlenW(lower_case) + 1);
ok(!lstrcmpW(buf, lower_case), "string compare mismatch\n");
/* otherwise src == dst should fail */
SetLastError(0xdeadbeef);
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY | LCMAP_UPPERCASE,
+ ret = LCMapStringU(LCMAP_SORTKEY | LCMAP_UPPERCASE,
buf, 10, buf, sizeof(buf));
ok(GetLastError() == ERROR_INVALID_FLAGS /* NT */ ||
- GetLastError() == ERROR_INVALID_PARAMETER /* Win9x */,
+ GetLastError() == ERROR_INVALID_PARAMETER /* Win7+ */,
"unexpected error code %d\n", GetLastError());
ok(!ret, "src == dst without LCMAP_UPPERCASE or LCMAP_LOWERCASE must fail\n");
/* test whether '\0' is always appended */
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY,
+ ret = LCMapStringU(LCMAP_SORTKEY,
upper_case, -1, buf, sizeof(buf));
- ok(ret, "LCMapStringW must succeed\n");
- ret2 = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY,
+ ok(ret, "LCMapStringU must succeed\n");
+ ret2 = LCMapStringU(LCMAP_SORTKEY,
upper_case, lstrlenW(upper_case), buf2, sizeof(buf2));
- ok(ret, "LCMapStringW must succeed\n");
+ ok(ret, "LCMapStringU must succeed\n");
ok(ret == ret2, "lengths of sort keys must be equal\n");
ok(!lstrcmpA(p_buf, p_buf2), "sort keys must be equal\n");
/* test LCMAP_SORTKEY | NORM_IGNORECASE */
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY | NORM_IGNORECASE,
+ ret = LCMapStringU(LCMAP_SORTKEY | NORM_IGNORECASE,
upper_case, -1, buf, sizeof(buf));
- ok(ret, "LCMapStringW must succeed\n");
- ret2 = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY,
+ ok(ret, "LCMapStringU must succeed\n");
+ ret2 = LCMapStringU(LCMAP_SORTKEY,
lower_case, -1, buf2, sizeof(buf2));
- ok(ret2, "LCMapStringW must succeed\n");
+ ok(ret2, "LCMapStringU must succeed\n");
ok(ret == ret2, "lengths of sort keys must be equal\n");
ok(!lstrcmpA(p_buf, p_buf2), "sort keys must be equal\n");
@@ -1608,39 +1598,90 @@ static void test_LCMapStringW(void)
results from plain LCMAP_SORTKEY on Vista */
/* test LCMAP_SORTKEY | NORM_IGNORESYMBOLS */
- ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY | NORM_IGNORESYMBOLS,
+ ret = LCMapStringU(LCMAP_SORTKEY | NORM_IGNORESYMBOLS,
lower_case, -1, buf, sizeof(buf));
- ok(ret, "LCMapStringW must succeed\n");
- ret2 = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY,
+ ok(ret, "LCMapStringU must succeed\n");
+ ret2 = LCMapStringU(LCMAP_SORTKEY,
symbols_stripped, -1, buf2, sizeof(buf2));
- ok(ret2, "LCMapStringW must succeed\n");
+ ok(ret2, "LCMapStringU must succeed\n");
ok(ret == ret2, "lengths of sort keys must be equal\n");
ok(!lstrcmpA(p_buf, p_buf2), "sort keys must be equal\n");
/* test NORM_IGNORENONSPACE */
lstrcpyW(buf, fooW);
- ret = LCMapStringW(LOCALE_USER_DEFAULT, NORM_IGNORENONSPACE,
+ ret = LCMapStringU(NORM_IGNORENONSPACE,
lower_case, -1, buf, sizeof(buf)/sizeof(WCHAR));
- ok(ret == lstrlenW(lower_case) + 1, "LCMapStringW should return %d, ret = %d\n",
+ ok(ret == lstrlenW(lower_case) + 1, "LCMapStringU should return %d, ret = %d\n",
lstrlenW(lower_case) + 1, ret);
ok(!lstrcmpW(buf, lower_case), "string comparison mismatch\n");
/* test NORM_IGNORESYMBOLS */
lstrcpyW(buf, fooW);
- ret = LCMapStringW(LOCALE_USER_DEFAULT, NORM_IGNORESYMBOLS,
+ ret = LCMapStringU(NORM_IGNORESYMBOLS,
lower_case, -1, buf, sizeof(buf)/sizeof(WCHAR));
- ok(ret == lstrlenW(symbols_stripped) + 1, "LCMapStringW should return %d, ret = %d\n",
+ ok(ret == lstrlenW(symbols_stripped) + 1, "LCMapStringU should return %d, ret = %d\n",
lstrlenW(symbols_stripped) + 1, ret);
ok(!lstrcmpW(buf, symbols_stripped), "string comparison mismatch\n");
/* test srclen = 0 */
SetLastError(0xdeadbeef);
- ret = LCMapStringW(LOCALE_USER_DEFAULT, 0, upper_case, 0, buf, sizeof(buf)/sizeof(WCHAR));
- ok(!ret, "LCMapStringW should fail with srclen = 0\n");
+ ret = LCMapStringU(0, upper_case, 0, buf, sizeof(buf)/sizeof(WCHAR));
+ ok(!ret, "LCMapStringU should fail with srclen = 0\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"unexpected error code %d\n", GetLastError());
}
+static INT LCMapStringW_wrapper(DWORD flags, LPCWSTR src, INT srclen, LPWSTR dst, INT dstlen)
+{
+ return LCMapStringW(LOCALE_USER_DEFAULT, flags, src, srclen, dst, dstlen);
+}
+
+static void test_LCMapStringW(void)
+{
+ trace("testing LCMapStringW\n");
+
+ test_LCMapStringUnicode(LCMapStringW_wrapper);
+}
+
+static INT LCMapStringEx_wrapper(DWORD flags, LPCWSTR src, INT srclen, LPWSTR dst, INT dstlen)
+{
+ return pLCMapStringEx(LOCALE_NAME_USER_DEFAULT, flags, src, srclen, dst, dstlen, NULL, NULL, 0);
+}
+
+static void test_LCMapStringEx(void)
+{
+ int ret;
+ WCHAR buf[256];
+
+ if (!pLCMapStringEx)
+ {
+ skip( "LCMapStringEx not available\n" );
+ return;
+ }
+
+ trace("testing LCMapStringEx\n");
+
+ /* test reserved parameters */
+ ret = pLCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_LOWERCASE,
+ upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR), NULL, NULL, 1);
+ ok(ret == lstrlenW(upper_case) + 1, "ret %d, error %d, expected value %d\n",
+ ret, GetLastError(), lstrlenW(upper_case) + 1);
+ ok(!lstrcmpW(buf, lower_case), "string compare mismatch\n");
+
+ ret = pLCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_LOWERCASE,
+ upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR), NULL, (void*)1, 0);
+ ok(ret == lstrlenW(upper_case) + 1, "ret %d, error %d, expected value %d\n",
+ ret, GetLastError(), lstrlenW(upper_case) + 1);
+ ok(!lstrcmpW(buf, lower_case), "string compare mismatch\n");
+
+ /* crashes on native */
+ if(0)
+ ret = pLCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_LOWERCASE,
+ upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR), (void*)1, NULL, 0);
+
+ test_LCMapStringUnicode(LCMapStringEx_wrapper);
+}
+
static void test_LocaleNames(void)
{
LCID lcid;
@@ -2823,6 +2864,7 @@ START_TEST(locale)
test_CompareStringA();
test_LCMapStringA();
test_LCMapStringW();
+ test_LCMapStringEx();
test_LocaleNames();
test_FoldStringA();
test_FoldStringW();
diff --git a/include/winnls.h b/include/winnls.h
index c7da119..b52209c 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -667,6 +667,19 @@ typedef struct _currencyfmtW
DECL_WINELIB_TYPE_AW(CURRENCYFMT)
DECL_WINELIB_TYPE_AW(LPCURRENCYFMT)
+typedef struct _nlsversioninfo {
+ DWORD dwNLSVersionInfoSize;
+ DWORD dwNLSVersion;
+ DWORD dwDefinedVersion;
+} NLSVERSIONINFO, *LPNLSVERSIONINFO;
+
+typedef struct _nlsversioninfoex {
+ DWORD dwNLSVersionInfoSize;
+ DWORD dwNLSVersion;
+ DWORD dwDefinedVersion;
+ DWORD dwEffectiveId;
+ GUID guidCustomVersion;
+} NLSVERSIONINFOEX, *LPNLSVERSIONINFOEX;
/* Define a bunch of callback types */
@@ -849,6 +862,7 @@ WINBASEAPI INT WINAPI LCIDToLocaleName(LCID,LPWSTR,INT,DWORD);
WINBASEAPI INT WINAPI LCMapStringA(LCID,DWORD,LPCSTR,INT,LPSTR,INT);
WINBASEAPI INT WINAPI LCMapStringW(LCID,DWORD,LPCWSTR,INT,LPWSTR,INT);
#define LCMapString WINELIB_NAME_AW(LCMapString)
+WINBASEAPI INT WINAPI LCMapStringEx(LPCWSTR,DWORD,LPCWSTR,INT,LPWSTR,INT,LPNLSVERSIONINFO,LPVOID,LPARAM);
WINBASEAPI LCID WINAPI LocaleNameToLCID(LPCWSTR,DWORD);
WINBASEAPI INT WINAPI MultiByteToWideChar(UINT,DWORD,LPCSTR,INT,LPWSTR,INT);
WINNORMALIZEAPI INT WINAPI NormalizeString(NORM_FORM,LPCWSTR,INT,LPWSTR,INT);
--
1.7.7.3
More information about the wine-patches
mailing list