21#ifndef __WINE_WINE_TEST_H
22#define __WINE_WINE_TEST_H
31#error config.h should not be used in Wine tests
33#ifdef __WINE_WINE_LIBRARY_H
34#error wine/library.h should not be used in Wine tests
36#ifdef __WINE_WINE_UNICODE_H
37#error wine/unicode.h should not be used in Wine tests
39#ifdef __WINE_WINE_DEBUG_H
40#error wine/debug.h should not be used in Wine tests
47#ifndef INVALID_FILE_ATTRIBUTES
48#define INVALID_FILE_ATTRIBUTES (~0u)
50#ifndef INVALID_SET_FILE_POINTER
51#define INVALID_SET_FILE_POINTER (~0u)
86#ifdef WINETEST_USE_DBGSTR_LONGLONG
101 while (*str1 && (*str1 == *str2)) { str1++; str2++; }
102 return *str1 - *str2;
107#define KUSER_SHARED_DATA_UMPTR 0x7FFE0000
108#define GetMajorNTVersion() (*(ULONG*)(KUSER_SHARED_DATA_UMPTR + 0x026C))
109#define GetMinorNTVersion() (*(ULONG*)(KUSER_SHARED_DATA_UMPTR + 0x0270))
110#define GetNTVersion() ((GetMajorNTVersion() << 8) | GetMinorNTVersion())
115#define START_TEST(name) \
116 static void func_##name(void); \
117 const struct test winetest_testlist[] = { { #name, func_##name }, { 0, 0 } }; \
118 static void func_##name(void)
123#define START_TEST(name) extern "C" void func_##name(void)
125#define START_TEST(name) void func_##name(void)
130#if defined(__x86_64__) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT)
131#define __winetest_cdecl __cdecl
132#define __winetest_va_list __builtin_ms_va_list
134#define __winetest_cdecl
135#define __winetest_va_list va_list
143# define __WINE_PRINTF_ATTR(fmt,args) __attribute__((format (printf,fmt,args)))
153# define __WINE_PRINTF_ATTR(fmt,args)
164#define subtest_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_subtest
165#define ok_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_ok
166#define skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_skip
167#define win_skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_win_skip
168#define trace_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_trace
169#define wait_child_process_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_wait_child_process
170#define ignore_exceptions_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_ignore_exceptions
172#define subtest subtest_(__FILE__, __LINE__)
173#define ok ok_(__FILE__, __LINE__)
174#define skip skip_(__FILE__, __LINE__)
175#define win_skip win_skip_(__FILE__, __LINE__)
176#define trace trace_(__FILE__, __LINE__)
177#define wait_child_process wait_child_process_(__FILE__, __LINE__)
178#define ignore_exceptions ignore_exceptions_(__FILE__, __LINE__)
180#define todo_if(is_todo) for (winetest_start_todo(is_todo); \
181 winetest_loop_todo(); \
184#define todo_ros todo_if(!strcmp(winetest_platform, "reactos"))
185#define todo_ros_if(is_todo) todo_if((is_todo) && !strcmp(winetest_platform, "reactos"))
187#define todo_wine todo_ros
188#define todo_wine_if todo_ros_if
190#define todo_wine todo_if(!strcmp(winetest_platform, "wine"))
191#define todo_wine_if(is_todo) todo_if((is_todo) && !strcmp(winetest_platform, "wine"))
194#define ros_skip_flaky for (winetest_start_nocount(3); \
195 winetest_loop_nocount(); \
196 winetest_end_nocount())
198#define disable_success_count for (winetest_start_nocount(1); \
199 winetest_loop_nocount(); \
200 winetest_end_nocount())
202#define skip_2k3_crash if (_winver < 0x600) skip("Test skipped, because it crashes on win 2003\n"); else
203#define skip_2k3_fail if (_winver < 0x600) skip("Test skipped, because it fails on win 2003\n"); else
205#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
207#ifdef NONAMELESSUNION
229#ifdef NONAMELESSSTRUCT
257#if defined(__x86_64__) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT)
258# define __winetest_va_start(list,arg) __builtin_ms_va_start(list,arg)
259# define __winetest_va_end(list) __builtin_ms_va_end(list)
261# define __winetest_va_start(list,arg) va_start(list,arg)
262# define __winetest_va_end(list) va_end(list)
267#if defined(WINETEST_MSVC_IDE_FORMATTING)
268# define __winetest_file_line_prefix "%s(%d)"
270# define __winetest_file_line_prefix "%s:%d"
294static int winetest_argc;
295static char** winetest_argv;
297static const struct test *current_test;
299static LONG successes;
302static LONG todo_successes;
303static LONG todo_failures;
308 const char* current_file;
311 unsigned int nocount_level;
316 unsigned int context_count;
355static void exit_process(
int code )
365#if defined(WINETEST_MSVC_IDE_FORMATTING)
374 data->current_file++;
392 __winetest_va_end(
valist );
404static void winetest_print_location(
const char *
msg, ... )
409 winetest_printf(
"%s:%d ",
data->current_file,
data->current_line );
420 winetest_printf(
"%s", msgtype );
421 for (
i = 0;
i <
data->context_count; ++
i)
428 fprintf(
stdout, __winetest_file_line_prefix
": Subtest %s\n",
434 winetest_print_location(
"IgnoreExceptions=%d\n", ignore ? 1 : 0 );
440#ifndef USE_WINE_TODOS
460 if (
data->todo_level)
464 winetest_print_context(
"Test succeeded inside todo block: " );
466 if ((
data->nocount_level & 2) == 0)
475 winetest_print_context(
"Test marked todo: " );
478 if ((
data->nocount_level & 1) == 0)
487 winetest_print_context(
"Test failed: " );
489 if ((
data->nocount_level & 2) == 0)
497 winetest_printf(
"Test succeeded\n");
499 if ((
data->nocount_level & 1) == 0)
512 __winetest_va_end(
valist);
521 winetest_print_context(
"" );
524 __winetest_va_end(
valist);
536 __winetest_va_end(
valist);
541 winetest_print_context(
"Tests skipped: " );
551 __winetest_va_end(
valist);
559#
if !defined(USE_WINE_TODOS) || defined(USE_WIN_SKIP)
566 __winetest_va_end(
valist);
572 data->todo_level = (
data->todo_level << 1) | (is_todo != 0);
573 data->todo_do_loop=1;
580 data->todo_do_loop=0;
587 data->todo_level >>= 1;
601 data->todo_do_loop = 1;
608 data->todo_do_loop = 0;
615 data->nocount_level >>= 2;
627 __winetest_va_end(
valist);
628 data->context[
data->context_count][
sizeof(
data->context[
data->context_count]) - 1] = 0;
630 ++
data->context_count;
637 if (
data->context_count)
638 --
data->context_count;
643 *pargv = winetest_argv;
644 return winetest_argc;
659 while (new_failures-- > 0)
668 fprintf(
stdout,
"%s: child process wait failed\n", current_test->name );
682 current_test->name, (
unsigned)
exit_code );
696 if (!
str)
return "(null)";
716 case '\n': *
dst++ =
'\\'; *
dst++ =
'n';
break;
717 case '\r': *
dst++ =
'\\'; *
dst++ =
'r';
break;
718 case '\t': *
dst++ =
'\\'; *
dst++ =
't';
break;
719 case '"': *
dst++ =
'\\'; *
dst++ =
'"';
break;
720 case '\\': *
dst++ =
'\\'; *
dst++ =
'\\';
break;
722 if (
c >=
' ' &&
c <= 126)
747 static const char hex[16] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'a',
'b',
'c',
'd',
'e',
'f'};
750 if (!
str)
return "(null)";
758 if (
n == -1)
for (
n = 0;
str[
n];
n++) ;
766 case '\n': *
dst++ =
'\\'; *
dst++ =
'n';
break;
767 case '\r': *
dst++ =
'\\'; *
dst++ =
'r';
break;
768 case '\t': *
dst++ =
'\\'; *
dst++ =
't';
break;
769 case '"': *
dst++ =
'\\'; *
dst++ =
'"';
break;
770 case '\\': *
dst++ =
'\\'; *
dst++ =
'\\';
break;
772 if (
c <
' ' ||
c >= 127)
775 *
dst++ =
hex[(
c >> 12) & 0x0f];
801 if (!
guid)
return "(null)";
803 sprintf(
res,
"{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
814 if (!
point)
return "(null)";
829 if (!
size)
return "(null)";
844 if (!
rect)
return "(null)";
855#ifdef WINETEST_USE_DBGSTR_LONGLONG
862 sprintf(
res,
"%lx%08lx", (
unsigned long)(
ll >> 32), (
unsigned long)
ll );
871static const struct test *find_test(
const char *
name )
891static void list_tests(
void)
902#pragma warning(disable:28182)
916 successes =
failures = todo_successes = todo_failures = 0;
924 fprintf(
stdout,
"\n%s: %d tests executed (%d marked as todo, %d %s), %d skipped.\n",
926 (
int)todo_successes, (
int)(
failures + todo_failures),
927 (
failures + todo_failures != 1) ?
"failures" :
"failure",
954 winetest_argc =
argc;
955 winetest_argv =
argv;
985#define ok_hex_(file, line, expression, result) \
987 int _value = (expression); \
988 int _result = (result); \
989 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (0x%x), got: 0x%x\n", \
990 #expression, _result, _value); \
992#define ok_hex(expression, result) ok_hex_(__FILE__, __LINE__, expression, result)
994#define ok_dec_(file, line, expression, result) \
996 int _value = (expression); \
997 int _result = (result); \
998 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (%d), got: %d\n", \
999 #expression, _result, _value); \
1001#define ok_dec(expression, result) ok_dec_(__FILE__, __LINE__, expression, result)
1003#define ok_ptr_(file, line, expression, result) \
1005 const void *_value = (expression); \
1006 const void *_result = (result); \
1007 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (%p), got: %p\n", \
1008 #expression, _result, _value); \
1010#define ok_ptr(expression, result) ok_ptr_(__FILE__, __LINE__, expression, result)
1012#define ok_size_t_(file, line, expression, result) \
1014 size_t _value = (expression); \
1015 size_t _result = (result); \
1016 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (%Ix), got: %Ix\n", \
1017 #expression, _result, _value); \
1019#define ok_size_t(expression, result) ok_size_t_(__FILE__, __LINE__, expression, result)
1021#define ok_char(expression, result) ok_hex(expression, result)
1023#define ok_err_(file, line, error) \
1024 ok_(file, line)(GetLastError() == (error), "Wrong last error. Expected " #error ", got 0x%lx\n", GetLastError())
1025#define ok_err(error) ok_err_(__FILE__, __LINE__, error)
1027#define ok_str_(file, line, x, y) \
1028 ok_(file, line)(strcmp(x, y) == 0, "Wrong string. Expected '%s', got '%s'\n", y, x)
1029#define ok_str(x, y) ok_str_(__FILE__, __LINE__, x, y)
1031#define ok_wstr_(file, line, x, y) \
1032 ok_(file, line)(wcscmp(x, y) == 0, "Wrong string. Expected '%S', got '%S'\n", y, x)
1033#define ok_wstr(x, y) ok_wstr_(__FILE__, __LINE__, x, y)
1035#define ok_long(expression, result) ok_hex(expression, result)
1036#define ok_int(expression, result) ok_dec(expression, result)
1037#define ok_int_(file, line, expression, result) ok_dec_(file, line, expression, result)
1038#define ok_ntstatus(status, expected) ok_hex(status, expected)
1039#define ok_hdl ok_ptr
1041#define is_reactos() \
1042 (*(unsigned*)((size_t)0x7FFE0FFC) == 0x8EAC705)
int strcmp(const char *String1, const char *String2)
ACPI_SIZE strlen(const char *String)
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
#define InterlockedIncrement
static INT do_loop(const PropSheetInfo *psInfo)
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
#define GetEnvironmentVariableA(x, y, z)
UINT WINAPI SetErrorMode(IN UINT uMode)
BOOL NTAPI IsBadStringPtrW(IN LPCWSTR lpsz, IN UINT_PTR ucchMax)
BOOL WINAPI GetExitCodeProcess(IN HANDLE hProcess, IN LPDWORD lpExitCode)
VOID WINAPI ExitProcess(IN UINT uExitCode)
LPVOID WINAPI TlsGetValue(IN DWORD Index)
BOOL WINAPI TlsSetValue(IN DWORD Index, IN LPVOID Value)
DWORD WINAPI DECLSPEC_HOTPATCH TlsAlloc(void)
static LPSTR get_temp_buffer(void)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLsizei const GLchar *const * strings
GLsizeiptr const GLvoid GLenum usage
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
_Check_return_opt_ _CRTIMP int __cdecl fflush(_Inout_opt_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl vfprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format, va_list _ArgList)
_Check_return_opt_ _CRTIMP int __cdecl setvbuf(_Inout_ FILE *_File, _Inout_updates_opt_z_(_Size) char *_Buf, _In_ int _Mode, _In_ size_t _Size)
#define SEM_FAILCRITICALERRORS
#define SEM_NOGPFAULTERRORBOX
const struct test winetest_testlist[]
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
_CRT_RESTORE_GCC_WARNINGS _CRT_DISABLE_GCC_WARNINGS _Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
void winetest_start_todo(int is_todo)
const char * winetest_platform
const char * wine_dbgstr_size(const SIZE *guid)
void __winetest_cdecl winetest_push_context(const char *fmt,...)
LONG winetest_get_failures(void)
void __winetest_cdecl winetest_win_skip(const char *msg,...)
LONG winetest_get_successes(void)
const char * wine_dbgstr_rect(const RECT *rect)
void winetest_set_location(const char *file, int line)
void __winetest_cdecl winetest_skip(const char *msg,...)
void winetest_vskip(const char *msg, __winetest_va_list ap)
void winetest_end_nocount(void)
void winetest_ignore_exceptions(BOOL ignore)
static int winetest_strcmpW(const WCHAR *str1, const WCHAR *str2)
void __winetest_cdecl winetest_ok(int condition, const char *msg,...)
const char * wine_dbgstr_guid(const GUID *guid)
int winetest_get_mainargs(char ***pargv)
int winetest_vok(int condition, const char *msg, __winetest_va_list ap)
void winetest_start_nocount(unsigned int flags)
void winetest_wait_child_process(HANDLE process)
void winetest_subtest(const char *name)
const char * wine_dbgstr_point(const POINT *guid)
void winetest_end_todo(void)
int winetest_loop_nocount(void)
static const char * wine_dbgstr_a(const char *s)
#define __winetest_va_list
static const char * debugstr_an(const CHAR *s, intptr_t n)
int winetest_loop_todo(void)
const char * wine_dbgstr_an(const CHAR *str, intptr_t n)
void __winetest_cdecl winetest_print(const char *msg,...)
void winetest_add_failures(LONG new_failures)
void winetest_pop_context(void)
void __winetest_cdecl winetest_trace(const char *msg,...)
static void release_temp_buffer(char *buffer, size_t size)
static char argv0[MAX_PATH]
TCHAR str_pos[MAX_LOADSTRING]
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
tls_data_t * get_tls_data(void)
DWORD WINAPI GetLastError(void)
void int int ULONGLONG int va_list * ap