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