Piotr Caban : msvcr90/tests: Added _getptd tests.
Alexandre Julliard
julliard at winehq.org
Wed May 25 11:28:13 CDT 2011
Module: wine
Branch: master
Commit: 197826b12d0e1fb468e2ff3b897318caaf1e8d1d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=197826b12d0e1fb468e2ff3b897318caaf1e8d1d
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue May 24 17:23:57 2011 +0200
msvcr90/tests: Added _getptd tests.
---
dlls/msvcr90/tests/msvcr90.c | 118 ++++++++++++++++++++++++++++++++++++++++++
dlls/msvcrt/msvcrt.h | 1 +
2 files changed, 119 insertions(+), 0 deletions(-)
diff --git a/dlls/msvcr90/tests/msvcr90.c b/dlls/msvcr90/tests/msvcr90.c
index 95cedd1..c3a837d 100644
--- a/dlls/msvcr90/tests/msvcr90.c
+++ b/dlls/msvcr90/tests/msvcr90.c
@@ -23,6 +23,8 @@
#include <fcntl.h>
#include <share.h>
#include <sys/stat.h>
+#include <time.h>
+#include <locale.h>
#include <windef.h>
#include <winbase.h>
@@ -78,6 +80,25 @@ static int (__cdecl *p_wsopen_s)(int*, const wchar_t*, int, int, int);
static void* (__cdecl *p_realloc_crt)(void*, size_t);
static void* (__cdecl *p_malloc)(size_t);
static void (__cdecl *p_free)(void*);
+static void* (__cdecl *p_getptd)(void);
+static int* (__cdecl *p_errno)(void);
+static __msvcrt_ulong* (__cdecl *p_doserrno)(void);
+static void (__cdecl *p_srand)(unsigned int);
+static char* (__cdecl *p_strtok)(char*, const char*);
+static wchar_t* (__cdecl *p_wcstok)(wchar_t*, const wchar_t*);
+static char* (__cdecl *p_strerror)(int);
+static wchar_t* (__cdecl *p_wcserror)(int);
+static char* (__cdecl *p_tmpnam)(char*);
+static wchar_t* (__cdecl *p_wtmpnam)(wchar_t*);
+static char* (__cdecl *p_asctime)(struct tm*);
+static wchar_t* (__cdecl *p_wasctime)(struct tm*);
+static struct tm* (__cdecl *p_localtime64)(__time64_t*);
+static char* (__cdecl *p_ecvt)(double, int, int*, int*);
+static int* (__cdecl *p_fpecode)(void);
+static int (__cdecl *p_configthreadlocale)(int);
+static void* (__cdecl *p_get_terminate)(void);
+static void* (__cdecl *p_get_unexpected)(void);
+
/* type info */
typedef struct __type_info
@@ -225,6 +246,24 @@ static BOOL init(void)
SET(p_realloc_crt, "_realloc_crt");
SET(p_malloc, "malloc");
SET(p_free, "free");
+ SET(p_getptd, "_getptd");
+ SET(p_errno, "_errno");
+ SET(p_doserrno, "__doserrno");
+ SET(p_srand, "srand");
+ SET(p_strtok, "strtok");
+ SET(p_wcstok, "wcstok");
+ SET(p_strerror, "strerror");
+ SET(p_wcserror, "_wcserror");
+ SET(p_tmpnam, "tmpnam");
+ SET(p_wtmpnam, "_wtmpnam");
+ SET(p_asctime, "asctime");
+ SET(p_wasctime, "_wasctime");
+ SET(p_localtime64, "_localtime64");
+ SET(p_ecvt, "_ecvt");
+ SET(p_fpecode, "__fpecode");
+ SET(p_configthreadlocale, "_configthreadlocale");
+ SET(p_get_terminate, "_get_terminate");
+ SET(p_get_unexpected, "_get_unexpected");
if (sizeof(void *) == 8)
{
SET(p_type_info_name_internal_method, "?_name_internal_method at type_info@@QEBAPEBDPEAU__type_info_node@@@Z");
@@ -864,6 +903,84 @@ static void test_typeinfo(void)
call_func1(ptype_info_dtor, &t1);
}
+/* Keep in sync with msvcrt/msvcrt.h */
+struct __thread_data {
+ DWORD tid;
+ HANDLE handle;
+ int thread_errno;
+ __msvcrt_ulong thread_doserrno;
+ int unk1;
+ unsigned int random_seed;
+ char *strtok_next;
+ wchar_t *wcstok_next;
+ unsigned char *mbstok_next;
+ char *strerror_buffer;
+ wchar_t *wcserror_buffer;
+ char *tmpnam_buffer;
+ wchar_t *wtmpnam_buffer;
+ void *unk2[2];
+ char *asctime_buffer;
+ wchar_t *wasctime_buffer;
+ struct tm *time_buffer;
+ char *efcvt_buffer;
+ int unk3[2];
+ void *unk4[4];
+ int fpecode;
+ pthreadmbcinfo mbcinfo;
+ pthreadlocinfo locinfo;
+ BOOL have_locale;
+ int unk5[1];
+ void* terminate_handler;
+ void* unexpected_handler;
+ void* se_translator;
+ void *unk6[3];
+ int unk7;
+ EXCEPTION_RECORD *exc_record;
+};
+
+static void test_getptd(void)
+{
+ struct __thread_data *ptd = p_getptd();
+ DWORD tid = GetCurrentThreadId();
+ wchar_t testW[] = {'t','e','s','t',0}, tW[] = {'t',0}, *wp;
+ char test[] = "test", *p;
+ struct tm time;
+ __time64_t secs = 0;
+ int dec, sign;
+ void *mbcinfo, *locinfo;
+
+ ok(ptd->tid == tid, "ptd->tid = %x, expected %x\n", ptd->tid, tid);
+ ok(ptd->handle == INVALID_HANDLE_VALUE, "ptd->handle = %p\n", ptd->handle);
+ ok(p_errno() == &ptd->thread_errno, "ptd->thread_errno is different then _errno()\n");
+ ok(p_doserrno() == &ptd->thread_doserrno, "ptd->thread_doserrno is different then __doserrno()\n");
+ p_srand(1234);
+ ok(ptd->random_seed == 1234, "ptd->random_seed = %d\n", ptd->random_seed);
+ p = p_strtok(test, "t");
+ ok(ptd->strtok_next == p+3, "ptd->strtok_next is incorrect\n");
+ wp = p_wcstok(testW, tW);
+ ok(ptd->wcstok_next == wp+3, "ptd->wcstok_next is incorrect\n");
+ ok(p_strerror(0) == ptd->strerror_buffer, "ptd->strerror_buffer is incorrect\n");
+ ok(p_wcserror(0) == ptd->wcserror_buffer, "ptd->wcserror_buffer is incorrect\n");
+ ok(p_tmpnam(NULL) == ptd->tmpnam_buffer, "ptd->tmpnam_buffer is incorrect\n");
+ ok(p_wtmpnam(NULL) == ptd->wtmpnam_buffer, "ptd->wtmpnam_buffer is incorrect\n");
+ memset(&time, 0, sizeof(time));
+ time.tm_mday = 1;
+ ok(p_asctime(&time) == ptd->asctime_buffer, "ptd->asctime_buffer is incorrect\n");
+ ok(p_wasctime(&time) == ptd->wasctime_buffer, "ptd->wasctime_buffer is incorrect\n");
+ ok(p_localtime64(&secs) == ptd->time_buffer, "ptd->time_buffer is incorrect\n");
+ ok(p_ecvt(3.12, 1, &dec, &sign) == ptd->efcvt_buffer, "ptd->efcvt_buffer is incorrect\n");
+ ok(p_fpecode() == &ptd->fpecode, "ptd->fpecode is incorrect\n");
+ mbcinfo = ptd->mbcinfo;
+ locinfo = ptd->locinfo;
+ todo_wine ok(ptd->have_locale == 1, "ptd->have_locale = %x\n", ptd->have_locale);
+ p_configthreadlocale(1);
+ todo_wine ok(mbcinfo == ptd->mbcinfo, "ptd->mbcinfo != mbcinfo\n");
+ todo_wine ok(locinfo == ptd->locinfo, "ptd->locinfo != locinfo\n");
+ todo_wine ok(ptd->have_locale == 3, "ptd->have_locale = %x\n", ptd->have_locale);
+ ok(p_get_terminate() == ptd->terminate_handler, "ptd->terminate_handler != _get_terminate()\n");
+ ok(p_get_unexpected() == ptd->unexpected_handler, "ptd->unexpected_handler != _get_unexpected()\n");
+}
+
START_TEST(msvcr90)
{
if(!init())
@@ -883,4 +1000,5 @@ START_TEST(msvcr90)
test__wsopen_s();
test__realloc_crt();
test_typeinfo();
+ test_getptd();
}
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index a0d3acb..48d200b 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -157,6 +157,7 @@ typedef struct MSVCRT_localeinfo_struct
/* TLS data */
extern DWORD msvcrt_tls_index;
+/* Keep in sync with msvcr90/tests/msvcr90.c */
struct __thread_data {
DWORD tid;
HANDLE handle;
More information about the wine-cvs
mailing list