msvcr90/tests: Added _getptd tests.
This commit is contained in:
parent
e253e526fc
commit
197826b12d
@ -23,6 +23,8 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <share.h>
|
#include <share.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <locale.h>
|
||||||
|
|
||||||
#include <windef.h>
|
#include <windef.h>
|
||||||
#include <winbase.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_realloc_crt)(void*, size_t);
|
||||||
static void* (__cdecl *p_malloc)(size_t);
|
static void* (__cdecl *p_malloc)(size_t);
|
||||||
static void (__cdecl *p_free)(void*);
|
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 */
|
/* type info */
|
||||||
typedef struct __type_info
|
typedef struct __type_info
|
||||||
@ -225,6 +246,24 @@ static BOOL init(void)
|
|||||||
SET(p_realloc_crt, "_realloc_crt");
|
SET(p_realloc_crt, "_realloc_crt");
|
||||||
SET(p_malloc, "malloc");
|
SET(p_malloc, "malloc");
|
||||||
SET(p_free, "free");
|
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)
|
if (sizeof(void *) == 8)
|
||||||
{
|
{
|
||||||
SET(p_type_info_name_internal_method, "?_name_internal_method@type_info@@QEBAPEBDPEAU__type_info_node@@@Z");
|
SET(p_type_info_name_internal_method, "?_name_internal_method@type_info@@QEBAPEBDPEAU__type_info_node@@@Z");
|
||||||
@ -864,6 +903,84 @@ static void test_typeinfo(void)
|
|||||||
call_func1(ptype_info_dtor, &t1);
|
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)
|
START_TEST(msvcr90)
|
||||||
{
|
{
|
||||||
if(!init())
|
if(!init())
|
||||||
@ -883,4 +1000,5 @@ START_TEST(msvcr90)
|
|||||||
test__wsopen_s();
|
test__wsopen_s();
|
||||||
test__realloc_crt();
|
test__realloc_crt();
|
||||||
test_typeinfo();
|
test_typeinfo();
|
||||||
|
test_getptd();
|
||||||
}
|
}
|
||||||
|
@ -157,6 +157,7 @@ typedef struct MSVCRT_localeinfo_struct
|
|||||||
/* TLS data */
|
/* TLS data */
|
||||||
extern DWORD msvcrt_tls_index;
|
extern DWORD msvcrt_tls_index;
|
||||||
|
|
||||||
|
/* Keep in sync with msvcr90/tests/msvcr90.c */
|
||||||
struct __thread_data {
|
struct __thread_data {
|
||||||
DWORD tid;
|
DWORD tid;
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user