msvcrt/tests: _itow_s tests (try 3)

Vincas Miliūnas vincas.miliunas at gmail.com
Wed Nov 3 15:24:37 CDT 2010


Originally part of my qsort_s and _itow_s patch for bug #24925; since an implementation is already committed, submitting my test code.

---
 dlls/msvcrt/tests/string.c |  183 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 183 insertions(+), 0 deletions(-)

diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index ab647db..b3e4381 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -46,6 +46,42 @@ static char *buf_to_string(const unsigned char *bin, int len, int nr)
 #define expect_eq(expr, value, type, format) { type ret = (expr); ok((value) == ret, #expr " expected " format " got " format "\n", value, ret); }
 #define expect_bin(buf, value, len) { ok(memcmp((buf), value, len) == 0, "Binary buffer mismatch - expected %s, got %s\n", buf_to_string((unsigned char *)value, len, 1), buf_to_string((buf), len, 0)); }
 
+#define DEFINE_EXPECT(func) \
+    static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
+
+#define SET_EXPECT(func) \
+    expect_ ## func = TRUE
+
+#define CHECK_EXPECT2(func) \
+    do { \
+        ok(expect_ ##func, "unexpected call " #func  "\n"); \
+        called_ ## func = TRUE; \
+    }while(0)
+
+#define CHECK_EXPECT(func) \
+    do { \
+        CHECK_EXPECT2(func);     \
+        expect_ ## func = FALSE; \
+    }while(0)
+
+#define CHECK_CALLED(func) \
+    do { \
+        ok(called_ ## func, "expected " #func "\n"); \
+        expect_ ## func = called_ ## func = FALSE; \
+    }while(0)
+
+#define CHECK_NOT_CALLED(func) \
+    do { \
+        ok(!called_ ## func, "unexpected " #func "\n"); \
+        expect_ ## func = called_ ## func = FALSE; \
+    }while(0)
+
+#define CLEAR_CALLED(func) \
+    expect_ ## func = called_ ## func = FALSE
+
+DEFINE_EXPECT(invalid_parameter_handler);
+
+static _invalid_parameter_handler (__cdecl *p_set_invalid_parameter_handler)(_invalid_parameter_handler);
 static void* (__cdecl *pmemcpy)(void *, const void *, size_t n);
 static int* (__cdecl *pmemcmp)(void *, const void *, size_t n);
 static int (__cdecl *pstrcpy_s)(char *dst, size_t len, const char *src);
@@ -62,6 +98,7 @@ static int (__cdecl *pwcstombs_s)(size_t*,char*,size_t,const wchar_t*,size_t);
 static int (__cdecl *pmbstowcs_s)(size_t*,wchar_t*,size_t,const char*,size_t);
 static errno_t (__cdecl *p_gcvt_s)(char*,size_t,double,int);
 static errno_t (__cdecl *p_itoa_s)(int,char*,size_t,int);
+static errno_t (__cdecl *p_itow_s)(int,wchar_t*,size_t,int);
 static errno_t (__cdecl *p_strlwr_s)(char*,size_t);
 static errno_t (__cdecl *p_ultoa_s)(__msvcrt_ulong,char*,size_t,int);
 static int *p__mb_cur_max;
@@ -72,6 +109,18 @@ static unsigned char *p_mbctype;
 
 static HMODULE hMsvcrt;
 
+static void __cdecl test_invalid_parameter_handler(const wchar_t *expression,
+        const wchar_t *function, const wchar_t *file,
+        unsigned line, uintptr_t arg)
+{
+    CHECK_EXPECT(invalid_parameter_handler);
+    ok(expression == NULL, "expression is not NULL\n");
+    ok(function == NULL, "function is not NULL\n");
+    ok(file == NULL, "file is not NULL\n");
+    ok(line == 0, "line = %u\n", line);
+    ok(arg == 0, "arg = %lx\n", (UINT_PTR)arg);
+}
+
 static void test_swab( void ) {
     char original[]  = "BADCFEHGJILKNMPORQTSVUXWZY@#";
     char expected1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ@#";
@@ -1374,6 +1423,132 @@ static void test__itoa_s(void)
        buffer);
 }
 
+/* Based on test__itoa_s */
+static void test__itow_s(void)
+{
+    errno_t ret;
+    wchar_t buffer[33];
+    char * const abuffer = (char *) buffer;
+    wchar_t tmp[64];
+    char tmp2[64];
+
+    if (!p_itow_s)
+    {
+        win_skip("Skipping _itow_s tests\n");
+        return;
+    }
+
+    SET_EXPECT(invalid_parameter_handler);
+    errno = EBADF;
+    ret = p_itow_s(0, NULL, 0, 0);
+    ok(ret == EINVAL, "Expected _itow_s to return EINVAL, got %d\n", ret);
+    ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
+    CHECK_CALLED(invalid_parameter_handler);
+
+    SET_EXPECT(invalid_parameter_handler);
+    memset(buffer, 'X', sizeof(buffer));
+    errno = EBADF;
+    ret = p_itow_s(0, buffer, 0, 0);
+    ok(ret == EINVAL, "Expected _itow_s to return EINVAL, got %d\n", ret);
+    ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
+    ok(abuffer[0] == 'X', "Expected the output buffer to be untouched\n");
+    CHECK_CALLED(invalid_parameter_handler);
+
+    SET_EXPECT(invalid_parameter_handler);
+    memset(buffer, 'X', sizeof(buffer));
+    errno = EBADF;
+    ret = p_itow_s(0, buffer, sizeof(buffer), 0);
+    ok(ret == EINVAL, "Expected _itow_s to return EINVAL, got %d\n", ret);
+    ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
+    ok(buffer[0] == '\0', "Expected the output buffer to be null terminated\n");
+    CHECK_CALLED(invalid_parameter_handler);
+
+    SET_EXPECT(invalid_parameter_handler);
+    memset(buffer, 'X', sizeof(buffer));
+    errno = EBADF;
+    ret = p_itow_s(0, buffer, sizeof(buffer), 64);
+    ok(ret == EINVAL, "Expected _itow_s to return EINVAL, got %d\n", ret);
+    ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
+    ok(buffer[0] == '\0', "Expected the output buffer to be null terminated\n");
+    CHECK_CALLED(invalid_parameter_handler);
+
+    SET_EXPECT(invalid_parameter_handler);
+    memset(buffer, 'X', sizeof(buffer));
+    errno = EBADF;
+    ret = p_itow_s(12345678, buffer, 4, 10);
+    ok(ret == ERANGE, "Expected _itow_s to return ERANGE, got %d\n", ret);
+    ok(errno == ERANGE, "Expected errno to be ERANGE, got %d\n", errno);
+    mbstowcs(tmp, "*765", 64);
+    tmp[0] = '\0';
+    ok(!memcmp(buffer, tmp, 4 * sizeof(wchar_t)),
+       "Expected the output buffer to be null terminated with truncated output\n");
+    CHECK_CALLED(invalid_parameter_handler);
+
+    SET_EXPECT(invalid_parameter_handler);
+    memset(buffer, 'X', sizeof(buffer));
+    errno = EBADF;
+    ret = p_itow_s(12345678, buffer, 8, 10);
+    ok(ret == ERANGE, "Expected _itow_s to return ERANGE, got %d\n", ret);
+    ok(errno == ERANGE, "Expected errno to be ERANGE, got %d\n", errno);
+    mbstowcs(tmp, "*7654321", 64);
+    tmp[0] = '\0';
+    ok(!memcmp(buffer, tmp, 8 * sizeof(wchar_t)),
+       "Expected the output buffer to be null terminated with truncated output\n");
+    CHECK_CALLED(invalid_parameter_handler);
+
+    SET_EXPECT(invalid_parameter_handler);
+    memset(buffer, 'X', sizeof(buffer));
+    errno = EBADF;
+    ret = p_itow_s(-12345678, buffer, 9, 10);
+    ok(ret == ERANGE, "Expected _itow_s to return ERANGE, got %d\n", ret);
+    ok(errno == ERANGE, "Expected errno to be ERANGE, got %d\n", errno);
+    mbstowcs(tmp, "*87654321", 64);
+    tmp[0] = '\0';
+    ok(!memcmp(buffer, tmp, 9 * sizeof(wchar_t)),
+       "Expected the output buffer to be null terminated with truncated output\n");
+    CHECK_CALLED(invalid_parameter_handler);
+
+    ret = p_itow_s(12345678, buffer, 9, 10);
+    ok(ret == 0, "Expected _itow_s to return 0, got %d\n", ret);
+    wcstombs(tmp2, buffer, 64);
+    mbstowcs(tmp, "12345678", 64);
+    ok(!wcscmp(buffer, tmp),
+       "Expected output buffer string to be \"12345678\", got \"%s\"\n",
+       tmp2);
+
+    ret = p_itow_s(43690, buffer, sizeof(buffer), 2);
+    ok(ret == 0, "Expected _itow_s to return 0, got %d\n", ret);
+    wcstombs(tmp2, buffer, 64);
+    mbstowcs(tmp, "1010101010101010", 64);
+    ok(!wcscmp(buffer, tmp),
+       "Expected output buffer string to be \"1010101010101010\", got \"%s\"\n",
+       tmp2);
+
+    ret = p_itow_s(1092009, buffer, sizeof(buffer), 36);
+    ok(ret == 0, "Expected _itow_s to return 0, got %d\n", ret);
+    wcstombs(tmp2, buffer, 64);
+    mbstowcs(tmp, "nell", 64);
+    ok(!strcmp(buffer, tmp),
+       "Expected output buffer string to be \"nell\", got \"%s\"\n",
+       tmp2);
+
+    ret = p_itow_s(5704, buffer, sizeof(buffer), 18);
+    ok(ret == 0, "Expected _itow_s to return 0, got %d\n", ret);
+    wcstombs(tmp2, buffer, 64);
+    mbstowcs(tmp, "hag", 64);
+    ok(!strcmp(buffer, tmp),
+       "Expected output buffer string to be \"hag\", got \"%s\"\n",
+       tmp2);
+
+    ret = p_itow_s(-12345678, buffer, sizeof(buffer), 10);
+    ok(ret == 0, "Expected _itow_s to return 0, got %d\n", ret);
+    wcstombs(tmp2, buffer, 64);
+    mbstowcs(tmp, "-12345678", 64);
+    ok(!strcmp(buffer, tmp),
+       "Expected output buffer string to be \"-12345678\", got \"%s\"\n",
+       tmp2);
+}
+
 static void test__strlwr_s(void)
 {
     errno_t ret;
@@ -1685,6 +1860,12 @@ START_TEST(string)
     if (!hMsvcrt)
         hMsvcrt = GetModuleHandleA("msvcrtd.dll");
     ok(hMsvcrt != 0, "GetModuleHandleA failed\n");
+
+    p_set_invalid_parameter_handler = (void *) GetProcAddress(hMsvcrt, "_set_invalid_parameter_handler");
+    if(p_set_invalid_parameter_handler)
+        ok(p_set_invalid_parameter_handler(test_invalid_parameter_handler) == NULL,
+                "Invalid parameter handler was already set\n");
+
     SET(pmemcpy,"memcpy");
     SET(pmemcmp,"memcmp");
     SET(p_mbctype,"_mbctype");
@@ -1703,6 +1884,7 @@ START_TEST(string)
     pwcstombs_s = (void *)GetProcAddress(hMsvcrt, "wcstombs_s");
     p_gcvt_s = (void *)GetProcAddress(hMsvcrt, "_gcvt_s");
     p_itoa_s = (void *)GetProcAddress(hMsvcrt, "_itoa_s");
+    p_itow_s = (void *)GetProcAddress(hMsvcrt, "_itow_s");
     p_strlwr_s = (void *)GetProcAddress(hMsvcrt, "_strlwr_s");
     p_ultoa_s = (void *)GetProcAddress(hMsvcrt, "_ultoa_s");
 
@@ -1740,6 +1922,7 @@ START_TEST(string)
     test_mbstowcs();
     test_gcvt();
     test__itoa_s();
+    test__itow_s();
     test__strlwr_s();
     test_wcsncat_s();
     test__mbsnbcat_s();
-- 
1.7.2.3




More information about the wine-patches mailing list