[RFC PATCH 4/9] msvcrt/tests: Add tests for iswctype.

Jeff Smith whydoubt at gmail.com
Thu Jan 9 00:53:44 CST 2020


Signed-off-by: Jeff Smith <whydoubt at gmail.com>
---
 dlls/msvcr120/tests/msvcr120.c | 75 ++++++++++++++++++++++++++++++++++
 dlls/msvcrt/tests/string.c     | 73 +++++++++++++++++++++++++++++++++
 dlls/ucrtbase/tests/string.c   | 68 ++++++++++++++++++++++++++++++
 3 files changed, 216 insertions(+)

diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c
index a055feeac9..97862c0eaf 100644
--- a/dlls/msvcr120/tests/msvcr120.c
+++ b/dlls/msvcr120/tests/msvcr120.c
@@ -174,6 +174,7 @@ static double (CDECL *p_remainder)(double, double);
 static int* (CDECL *p_errno)(void);
 static int (CDECL *p_fegetenv)(fenv_t*);
 static int (CDECL *p__clearfp)(void);
+static _locale_t (__cdecl *p_create_locale)(int, const char *);
 static _locale_t (__cdecl *p_wcreate_locale)(int, const wchar_t *);
 static void (__cdecl *p_free_locale)(_locale_t);
 static unsigned short (__cdecl *p_wctype)(const char*);
@@ -185,6 +186,8 @@ static float (__cdecl *p_nexttowardf)(float, double);
 static double (__cdecl *p_nexttowardl)(double, double);
 static wctrans_t (__cdecl *p_wctrans)(const char*);
 static wint_t (__cdecl *p_towctrans)(wint_t, wctrans_t);
+static int (__cdecl *p_iswctype)(int, int);
+static int (__cdecl *p__iswctype_l)(int, int, _locale_t);
 
 /* make sure we use the correct errno */
 #undef errno
@@ -237,8 +240,10 @@ static BOOL init(void)
     p_wcstof = (void*)GetProcAddress(module, "wcstof");
     p_remainder = (void*)GetProcAddress(module, "remainder");
     p_errno = (void*)GetProcAddress(module, "_errno");
+    p_create_locale = (void*)GetProcAddress(module, "_create_locale");
     p_wcreate_locale = (void*)GetProcAddress(module, "_wcreate_locale");
     p_free_locale = (void*)GetProcAddress(module, "_free_locale");
+    p__iswctype_l = (void*)GetProcAddress(module, "_iswctype_l");
     SET(p_wctype, "wctype");
     SET(p_fegetenv, "fegetenv");
     SET(p__clearfp, "_clearfp");
@@ -250,6 +255,7 @@ static BOOL init(void)
     SET(p_nexttowardl, "nexttowardl");
     SET(p_wctrans, "wctrans");
     SET(p_towctrans, "towctrans");
+    SET(p_iswctype, "iswctype");
     if(sizeof(void*) == 8) { /* 64-bit initialization */
         SET(p_critical_section_ctor,
                 "??0critical_section at Concurrency@@QEAA at XZ");
@@ -1065,6 +1071,74 @@ static void test_towctrans(void)
     ok(ret == 'T', "towctrans('T', 1) returned %c, expected T\n", ret);
 }
 
+static void test_iswctype(void)
+{
+    unsigned int c, i;
+    unsigned short types = 0;
+    unsigned short base_wctype[65536];
+    const char *locales[] = { NULL, "zh_CN", "en_US", "hi_IN", "es_ES",
+                              "ar_EG", "ms_MY", "ru_RU", "pt_BR", "fr_FR" };
+    static const struct
+    {
+        unsigned int c;
+        unsigned int wctype;
+    }
+    iswctype_tests[] =
+    {
+        { '\t', C1_CNTRL | C1_SPACE },
+        { 0xa0, C1_SPACE },
+        { 0x85, C1_CNTRL },
+        { 0xad, C1_PUNCT },
+        { 0xaa, C1_PUNCT },
+        { 0xb5, C1_PUNCT },
+        { 0xba, C1_PUNCT },
+        { 0xb2, C1_PUNCT },
+        { 0xb3, C1_PUNCT },
+        { 0xb9, C1_PUNCT },
+    };
+
+    for (c = 0; c <= 0xff; c++)
+    {
+        base_wctype[c] = p_iswctype(c, 0xffff);
+        types |= base_wctype[c];
+    }
+    todo_wine ok(types == 0x1ff, "Unexpected wctype bits present\n");
+
+    for (c = 0x100; c <= 0xffff; c++)
+    {
+        base_wctype[c] = p_iswctype(c, 0xffff);
+        types |= base_wctype[c];
+    }
+    ok(types == 0x3ff, "Unexpected wctype bits present\n");
+
+    for (i = 0; i < ARRAY_SIZE(iswctype_tests); i++)
+    {
+        todo_wine {
+            ok(base_wctype[iswctype_tests[i].c] == iswctype_tests[i].wctype,
+                "Unexpected wctype %#x for char %#x\n",
+                base_wctype[iswctype_tests[i].c], iswctype_tests[i].c);
+        }
+    }
+
+    if (!p__iswctype_l || !p_create_locale)
+    {
+        win_skip("_iswctype_l tests\n");
+        return;
+    }
+
+    for (i = 0; i < ARRAY_SIZE(locales); i++)
+    {
+        _locale_t locale = locales[i] ? p_create_locale(LC_ALL, locales[i]) : NULL;
+        for (c = 0; c <= 0xffff; c++)
+        {
+            unsigned short wct = p__iswctype_l(c, 0xffff, locale);
+            todo_wine_if(wct & 0xf000) {
+                ok(base_wctype[c] == wct, "Character %#x in %s does not match C locale.\n", c, locales[i]);
+            }
+        }
+    }
+}
+
 START_TEST(msvcr120)
 {
     if (!init()) return;
@@ -1086,4 +1160,5 @@ START_TEST(msvcr120)
     test__Cbuild();
     test_nexttoward();
     test_towctrans();
+    test_iswctype();
 }
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 08bc0781e1..940e8166ae 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -110,6 +110,8 @@ static int (__cdecl *p__mbccpy_s)(unsigned char*, size_t, int*, const unsigned c
 static int (__cdecl *p__memicmp)(const char*, const char*, size_t);
 static int (__cdecl *p__memicmp_l)(const char*, const char*, size_t, _locale_t);
 static size_t (__cdecl *p___strncnt)(const char*, size_t);
+static int (__cdecl *p_iswctype)(int, int);
+static int (__cdecl *p__iswctype_l)(int, int, _locale_t);
 
 #define SETNOFAIL(x,y) x = (void*)GetProcAddress(hMsvcrt,y)
 #define SET(x,y) SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y)
@@ -4050,6 +4052,74 @@ static void test_iswdigit(void)
     }
 }
 
+static void test_iswctype(void)
+{
+    unsigned int c, i;
+    unsigned short types = 0;
+    unsigned short base_wctype[65536];
+    const char *locales[] = { NULL, "zh_CN", "en_US", "hi_IN", "es_ES",
+                              "ar_EG", "ms_MY", "ru_RU", "pt_BR", "fr_FR" };
+    static const struct
+    {
+        unsigned int c;
+        unsigned int wctype;
+    }
+    iswctype_tests[] =
+    {
+        { '\t', C1_CNTRL | C1_SPACE | C1_BLANK },
+        { 0xa0, C1_SPACE | C1_BLANK },
+        { 0x85, C1_CNTRL },
+        { 0xad, C1_PUNCT },
+        { 0xaa, C1_PUNCT },
+        { 0xb5, C1_PUNCT },
+        { 0xba, C1_PUNCT },
+        { 0xb2, C1_PUNCT | C1_DIGIT },
+        { 0xb3, C1_PUNCT | C1_DIGIT },
+        { 0xb9, C1_PUNCT | C1_DIGIT },
+    };
+
+    for (c = 0; c <= 0xff; c++)
+    {
+        base_wctype[c] = p_iswctype(c, 0xffff);
+        types |= base_wctype[c];
+    }
+    todo_wine ok(types == 0x1ff, "Unexpected wctype bits present\n");
+
+    for (c = 0x100; c <= 0xffff; c++)
+    {
+        base_wctype[c] = p_iswctype(c, 0xffff);
+        types |= base_wctype[c];
+    }
+    ok(types == 0x3ff, "Unexpected wctype bits present\n");
+
+    for (i = 0; i < ARRAY_SIZE(iswctype_tests); i++)
+    {
+        todo_wine {
+            ok(base_wctype[iswctype_tests[i].c] == iswctype_tests[i].wctype,
+                "Unexpected wctype %#x for char %#x\n",
+                base_wctype[iswctype_tests[i].c], iswctype_tests[i].c);
+        }
+    }
+
+    if (!p__iswctype_l || !p__create_locale)
+    {
+        win_skip("_iswctype_l tests\n");
+        return;
+    }
+
+    for (i = 0; i < ARRAY_SIZE(locales); i++)
+    {
+        _locale_t locale = locales[i] ? p__create_locale(LC_ALL, locales[i]) : NULL;
+        for (c = 0; c <= 0xffff; c++)
+        {
+            unsigned short wct = p__iswctype_l(c, 0xffff, locale);
+            todo_wine_if(wct & 0xf000) {
+                ok(base_wctype[c] == wct, "Character %#x in %s does not match C locale.\n", c, locales[i]);
+            }
+        }
+    }
+}
+
 START_TEST(string)
 {
     char mem[100];
@@ -4117,6 +4187,8 @@ START_TEST(string)
     p__memicmp = (void*)GetProcAddress(hMsvcrt, "_memicmp");
     p__memicmp_l = (void*)GetProcAddress(hMsvcrt, "_memicmp_l");
     p___strncnt = (void*)GetProcAddress(hMsvcrt, "__strncnt");
+    p_iswctype = (void*)GetProcAddress(hMsvcrt, "iswctype");
+    p__iswctype_l = (void*)GetProcAddress(hMsvcrt, "_iswctype_l");
 
     /* MSVCRT memcpy behaves like memmove for overlapping moves,
        MFC42 CString::Insert seems to rely on that behaviour */
@@ -4192,4 +4264,5 @@ START_TEST(string)
     test_C_locale();
     test_strstr();
     test_iswdigit();
+    test_iswctype();
 }
diff --git a/dlls/ucrtbase/tests/string.c b/dlls/ucrtbase/tests/string.c
index 0bb3feaa2f..ca219a97ce 100644
--- a/dlls/ucrtbase/tests/string.c
+++ b/dlls/ucrtbase/tests/string.c
@@ -25,6 +25,7 @@
 
 #include <windef.h>
 #include <winbase.h>
+#include <winnls.h>
 #include "wine/test.h"
 
 #include <math.h>
@@ -83,6 +84,8 @@ static void (__cdecl *p__free_locale)(_locale_t);
 static int (__cdecl *p__getmbcp)(void);
 static int (__cdecl *p__setmbcp)(int);
 static size_t (__cdecl *p__mbsspn)(const unsigned char*, const unsigned char*);
+static int (__cdecl *p_iswctype)(int, int);
+static int (__cdecl *p__iswctype_l)(int, int, _locale_t);
 
 static BOOL init(void)
 {
@@ -110,6 +113,8 @@ static BOOL init(void)
     p__getmbcp = (void*)GetProcAddress(module, "_getmbcp");
     p__setmbcp = (void*)GetProcAddress(module, "_setmbcp");
     p__mbsspn = (void*)GetProcAddress(module, "_mbsspn");
+    p_iswctype = (void*)GetProcAddress(module, "iswctype");
+    p__iswctype_l = (void*)GetProcAddress(module, "_iswctype_l");
     return TRUE;
 }
 
@@ -398,6 +403,68 @@ static void test_mbsspn( void)
     p__setmbcp(cp);
 }
 
+static void test_iswctype(void)
+{
+    unsigned int c, i;
+    unsigned short types = 0;
+    unsigned short base_wctype[65536];
+    const char *locales[] = { NULL, "zh_CN", "en_US", "hi_IN", "es_ES",
+                              "ar_EG", "ms_MY", "ru_RU", "pt_BR", "fr_FR" };
+    static const struct
+    {
+        unsigned int c;
+        unsigned int wctype;
+    }
+    iswctype_tests[] =
+    {
+        { '\t', C1_CNTRL | C1_SPACE },
+        { 0xa0, C1_SPACE },
+        { 0x85, C1_CNTRL | C1_SPACE },
+        { 0xad, C1_PUNCT | C1_CNTRL },
+        { 0xaa, C1_PUNCT | C1_LOWER | C1_ALPHA },
+        { 0xb5, C1_PUNCT | C1_LOWER | C1_ALPHA },
+        { 0xba, C1_PUNCT | C1_LOWER | C1_ALPHA },
+        { 0xb2, C1_PUNCT | C1_DIGIT },
+        { 0xb3, C1_PUNCT | C1_DIGIT },
+        { 0xb9, C1_PUNCT | C1_DIGIT },
+    };
+
+    for (c = 0; c <= 0xff; c++)
+    {
+        base_wctype[c] = p_iswctype(c, 0xffff);
+        types |= base_wctype[c];
+    }
+    todo_wine ok(types == 0x1ff, "Unexpected wctype bits present\n");
+
+    for (c = 0x100; c <= 0xffff; c++)
+    {
+        base_wctype[c] = p_iswctype(c, 0xffff);
+        types |= base_wctype[c];
+    }
+    ok(types == 0x3ff, "Unexpected wctype bits present\n");
+
+    for (i = 0; i < ARRAY_SIZE(iswctype_tests); i++)
+    {
+        todo_wine {
+            ok(base_wctype[iswctype_tests[i].c] == iswctype_tests[i].wctype,
+                "Unexpected wctype %#x for char %#x\n",
+                base_wctype[iswctype_tests[i].c], iswctype_tests[i].c);
+        }
+    }
+
+    for (i = 0; i < ARRAY_SIZE(locales); i++)
+    {
+        _locale_t locale = locales[i] ? p__create_locale(LC_ALL, locales[i]) : NULL;
+        for (c = 0; c <= 0xffff; c++)
+        {
+            unsigned short wct = p__iswctype_l(c, 0xffff, locale);
+            todo_wine_if(wct & 0xf000) {
+                ok(base_wctype[c] == wct, "Character %#x in %s does not match C locale.\n", c, locales[i]);
+            }
+        }
+    }
+}
+
 START_TEST(string)
 {
     if (!init()) return;
@@ -407,4 +474,5 @@ START_TEST(string)
     test___strncnt();
     test_C_locale();
     test_mbsspn();
+    test_iswctype();
 }
-- 
2.23.0




More information about the wine-devel mailing list