Daniel Lehman : msvcrt/tests: Add some wcstombs_s_l tests.

Alexandre Julliard julliard at winehq.org
Tue Feb 4 15:33:20 CST 2020


Module: wine
Branch: master
Commit: 05e335c103dce905a12e35777fe3a8763cf1b84c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=05e335c103dce905a12e35777fe3a8763cf1b84c

Author: Daniel Lehman <dlehman at esri.com>
Date:   Mon Feb  3 11:15:54 2020 -0800

msvcrt/tests: Add some wcstombs_s_l tests.

Signed-off-by: Daniel Lehman <dlehman at esri.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/tests/string.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 73 insertions(+)

diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 8f97d8959e..32e264908a 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -76,6 +76,7 @@ static unsigned __int64 (__cdecl *p_strtoui64)(const char *, char **, int);
 static __int64 (__cdecl *p_wcstoi64)(const wchar_t *, wchar_t **, int);
 static unsigned __int64 (__cdecl *p_wcstoui64)(const wchar_t *, wchar_t **, int);
 static int (__cdecl *pwcstombs_s)(size_t*,char*,size_t,const wchar_t*,size_t);
+static int (__cdecl *p_wcstombs_s_l)(size_t*,char*,size_t,const wchar_t*,size_t,_locale_t);
 static int (__cdecl *pmbstowcs_s)(size_t*,wchar_t*,size_t,const char*,size_t);
 static size_t (__cdecl *p_mbsrtowcs)(wchar_t*, const char**, size_t, mbstate_t*);
 static int (__cdecl *p_mbsrtowcs_s)(size_t*,wchar_t*,size_t,const char**,size_t,mbstate_t*);
@@ -2277,6 +2278,76 @@ static void test_mbstowcs(void)
     setlocale(LC_ALL, "C");
 }
 
+static void test__wcstombs_s_l(void)
+{
+    struct test {
+        const wchar_t *wstr;
+        size_t wlen;
+        const char *str;
+        size_t len;
+        size_t ret;
+        int err;
+        const char *locale;
+        BOOL todo_ret;
+        BOOL todo_err;
+    } tests[] = {
+        /* wstr                 str        ret err        locale */
+        { L"",       0,         NULL,   0, 1,  0,         NULL },
+        { L"\xfffd", 1,         NULL,   0, 2,  0,         NULL },
+        { L"\xfffd", 1,         "",     1, 0,  EILSEQ,    NULL, TRUE },
+        { L"\xfffd", 1,         "",     6, 0,  EILSEQ,    NULL, TRUE },
+        { L"text",   _TRUNCATE, "text", 5, 5,  0,         NULL },
+        { L"text",   _TRUNCATE, "",     1, 1,  STRUNCATE, NULL, FALSE, TRUE },
+        { L"text",   5,         "",     3, 0,  ERANGE,    NULL, TRUE },
+
+        { L"",       0,         NULL,   0, 1,  0,         "English_United States.1252", TRUE, TRUE },
+        { L"\xfffd", 1,         NULL,   0, 0,  EILSEQ,    "English_United States.1252", TRUE },
+        { L"\xfffd", 1,         "",     1, 0,  EILSEQ,    "English_United States.1252", TRUE },
+        { L"\xfffd", 1,         "",     6, 0,  EILSEQ,    "English_United States.1252", TRUE },
+        { L"text",   _TRUNCATE, "text", 5, 5,  0,         "English_United States.1252" },
+        { L"text",   _TRUNCATE, "",     1, 1,  STRUNCATE, "English_United States.1252", FALSE, TRUE },
+        { L"text",   5,         "",     3, 0,  ERANGE,    "English_United States.1252", TRUE },
+    };
+    _locale_t locale;
+    char out[6];
+    size_t ret;
+    int err;
+    int i;
+
+    if(!p__create_locale) {
+        win_skip("_create_locale not available\n");
+        return;
+    }
+
+    for (i = 0; i < ARRAY_SIZE(tests); i++)
+    {
+        if(tests[i].locale)
+        {
+            locale = p__create_locale(LC_ALL, tests[i].locale);
+            ok(locale != NULL, "_create_locale failed for %s\n", tests[i].locale);
+        }
+        else
+            locale = NULL;
+
+        ret = ~0;
+        memset(out, 0xcc, sizeof(out));
+        err = p_wcstombs_s_l(&ret, tests[i].str ? out : NULL, tests[i].len,
+                             tests[i].wstr, tests[i].wlen, locale);
+        todo_wine_if(tests[i].todo_ret)
+        ok(ret == tests[i].ret, "%d: expected ret %d, got %d for '%s' in locale %s\n", i, tests[i].ret, ret,
+            wine_dbgstr_w(tests[i].wstr), tests[i].locale);
+        todo_wine_if(tests[i].todo_err)
+        ok(err == tests[i].err, "%d: expected err %d, got %d for '%s' in locale %s\n", i, tests[i].err, err,
+            wine_dbgstr_w(tests[i].wstr), tests[i].locale);
+        if(tests[i].str)
+            ok(!memcmp(out, tests[i].str, strlen(tests[i].str)+1),
+                "%d: expected out %s, got %s for '%s' in locale %s\n", i, tests[i].str, out,
+                wine_dbgstr_w(tests[i].wstr), tests[i].locale);
+
+        p__free_locale(locale);
+    }
+}
+
 static void test_gcvt(void)
 {
     char buf[1024], *res;
@@ -4196,6 +4267,7 @@ START_TEST(string)
     p_wcstoui64 = (void *)GetProcAddress(hMsvcrt, "_wcstoui64");
     pmbstowcs_s = (void *)GetProcAddress(hMsvcrt, "mbstowcs_s");
     pwcstombs_s = (void *)GetProcAddress(hMsvcrt, "wcstombs_s");
+    p_wcstombs_s_l = (void *)GetProcAddress(hMsvcrt, "_wcstombs_s_l");
     pwcsrtombs = (void *)GetProcAddress(hMsvcrt, "wcsrtombs");
     p_gcvt_s = (void *)GetProcAddress(hMsvcrt, "_gcvt_s");
     p_itoa_s = (void *)GetProcAddress(hMsvcrt, "_itoa_s");
@@ -4272,6 +4344,7 @@ START_TEST(string)
     test__strtoi64();
     test__strtod();
     test_mbstowcs();
+    test__wcstombs_s_l();
     test_gcvt();
     test__itoa_s();
     test__strlwr_s();




More information about the wine-cvs mailing list