[PATCH 2/2] Added ui64tow_s tests for msvcrt take 4 Can't believe I forgot to commit before creating the patch...

Arno Teigseth arnotixe at gmail.com
Tue Dec 28 22:06:05 CST 2010


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

diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 2a5d4fc..20fbecf 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -29,6 +29,35 @@
 #include <errno.h>
 #include <limits.h>
 
+#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_EXPECT(invalid_parameter_handler);
+
+static _invalid_parameter_handler (__cdecl *p_set_invalid_parameter_handler)(_invalid_parameter_handler);
+
 static char *buf_to_string(const unsigned char *bin, int len, int nr)
 {
     static char buf[2][1024];
@@ -47,9 +76,16 @@ static void __cdecl test_invalid_parameter_handler(const wchar_t *expression,
         const wchar_t *function, const wchar_t *file,
         unsigned line, uintptr_t arg)
 {
-    /* we just ignore handler calls */
+    /* we USED TO just ignore handler calls */
+    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);
 }
 
+
 #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)); }
 
@@ -69,6 +105,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_ui64tow_s)(int,char*,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;
@@ -1389,6 +1426,111 @@ static void test__itoa_s(void)
                 "Cannot reset invalid parameter handler\n");
 }
 
+static void test__ui64tow_s(void)
+{
+
+    /* mostly copied from _itoa_s tests since these functions are similar in function:
+       _itoa_s (on msvcr90) doesn't set errno (in case of errors) while msvcrt does
+     * as we always set errno in our msvcrt implementation, don't test here that errno
+     * isn't changed
+     */
+
+    errno_t ret;
+    char buffer[33];
+
+    if (!p_ui64tow_s)
+    {
+        win_skip("Skipping _ui64tow_s tests\n");
+        return;
+    }
+
+    if(!p_set_invalid_parameter_handler) {
+        win_skip("_set_invalid_parameter_handler not found\n");
+        return;
+    }
+
+    SET_EXPECT(invalid_parameter_handler);
+    ret = p_ui64tow_s(0, NULL, 0, 0);
+    ok(ret == EINVAL, "Expected _ui64tow_s to return EINVAL, got %d\n", ret);
+    CHECK_CALLED(invalid_parameter_handler);
+
+    memset(buffer, 'X', sizeof(buffer));
+    SET_EXPECT(invalid_parameter_handler);
+    ret = p_ui64tow_s(0, buffer, 0, 0);
+    ok(ret == EINVAL, "Expected _ui64tow_s to return EINVAL, got %d\n", ret);
+    ok(buffer[0] == 'X', "Expected the output buffer to be untouched\n");
+    CHECK_CALLED(invalid_parameter_handler);
+
+    memset(buffer, 'X', sizeof(buffer));
+    SET_EXPECT(invalid_parameter_handler);
+    ret = p_ui64tow_s(0, buffer, sizeof(buffer), 0);
+    ok(ret == EINVAL, "Expected _ui64tow_s to return EINVAL, got %d\n", ret);
+    ok(buffer[0] == '\0', "Expected the output buffer to be null terminated\n");
+    CHECK_CALLED(invalid_parameter_handler);
+
+    memset(buffer, 'X', sizeof(buffer));
+    SET_EXPECT(invalid_parameter_handler);
+    ret = p_ui64tow_s(0, buffer, sizeof(buffer), 64);
+    ok(ret == EINVAL, "Expected _ui64tow_s to return EINVAL, got %d\n", ret);
+    ok(buffer[0] == '\0', "Expected the output buffer to be null terminated\n");
+    CHECK_CALLED(invalid_parameter_handler);
+
+    memset(buffer, 'X', sizeof(buffer));
+    SET_EXPECT(invalid_parameter_handler);
+    ret = p_ui64tow_s(12345678, buffer, 4, 10);
+    ok(ret == ERANGE, "Expected _ui64tow_s to return ERANGE, got %d\n", ret);
+    ok(!memcmp(buffer, "\000765", 4),
+       "Expected the output buffer to be null terminated with truncated output\n");
+    CHECK_CALLED(invalid_parameter_handler);
+
+    memset(buffer, 'X', sizeof(buffer));
+    SET_EXPECT(invalid_parameter_handler);
+    ret = p_ui64tow_s(12345678, buffer, 8, 10);
+    ok(ret == ERANGE, "Expected _ui64tow_s to return ERANGE, got %d\n", ret);
+    ok(!memcmp(buffer, "\0007654321", 8),
+       "Expected the output buffer to be null terminated with truncated output\n");
+    CHECK_CALLED(invalid_parameter_handler);
+
+    memset(buffer, 'X', sizeof(buffer));
+    SET_EXPECT(invalid_parameter_handler);
+    ret = p_ui64tow_s(-12345678, buffer, 9, 10);
+    ok(ret == ERANGE, "Expected _ui64tow_s to return ERANGE, got %d\n", ret);
+    ok(!memcmp(buffer, "\00087654321", 9),
+       "Expected the output buffer to be null terminated with truncated output\n");
+    CHECK_CALLED(invalid_parameter_handler);
+
+    ret = p_ui64tow_s(12345678, buffer, 9, 10);
+    ok(ret == 0, "Expected _ui64tow_s to return 0, got %d\n", ret);
+    ok(!strcmp(buffer, "12345678"),
+       "Expected output buffer string to be \"12345678\", got \"%s\"\n",
+       buffer);
+
+    ret = p_ui64tow_s(43690, buffer, sizeof(buffer), 2);
+    ok(ret == 0, "Expected _ui64tow_s to return 0, got %d\n", ret);
+    ok(!strcmp(buffer, "1010101010101010"),
+       "Expected output buffer string to be \"1010101010101010\", got \"%s\"\n",
+       buffer);
+
+    ret = p_ui64tow_s(1092009, buffer, sizeof(buffer), 36);
+    ok(ret == 0, "Expected _ui64tow_s to return 0, got %d\n", ret);
+    ok(!strcmp(buffer, "nell"),
+       "Expected output buffer string to be \"nell\", got \"%s\"\n",
+       buffer);
+
+    ret = p_ui64tow_s(5704, buffer, sizeof(buffer), 18);
+    ok(ret == 0, "Expected _ui64tow_s to return 0, got %d\n", ret);
+    ok(!strcmp(buffer, "hag"),
+       "Expected output buffer string to be \"hag\", got \"%s\"\n",
+       buffer);
+
+    ret = p_ui64tow_s(-12345678, buffer, sizeof(buffer), 10);
+    ok(ret == 0, "Expected _ui64tow_s to return 0, got %d\n", ret);
+    ok(!strcmp(buffer, "-12345678"),
+       "Expected output buffer string to be \"-12345678\", got \"%s\"\n",
+       buffer);
+}
+
+
 static void test__strlwr_s(void)
 {
     errno_t ret;
@@ -1726,9 +1868,13 @@ 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_ui64tow_s = (void *)GetProcAddress(hMsvcrt, "_ui64tow_s");
     p_strlwr_s = (void *)GetProcAddress(hMsvcrt, "_strlwr_s");
     p_ultoa_s = (void *)GetProcAddress(hMsvcrt, "_ultoa_s");
     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");
 
     /* MSVCRT memcpy behaves like memmove for overlapping moves,
        MFC42 CString::Insert seems to rely on that behaviour */
@@ -1764,6 +1910,7 @@ START_TEST(string)
     test_mbstowcs();
     test_gcvt();
     test__itoa_s();
+    test__ui64tow_s();
     test__strlwr_s();
     test_wcsncat_s();
     test__mbsnbcat_s();
-- 
1.6.3.3

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: This is a digitally signed message part
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20101228/17573a8b/attachment.pgp>


More information about the wine-patches mailing list