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)
85#ifdef WINETEST_USE_DBGSTR_LONGLONG
99 while (*str1 && (*str1 == *str2)) { str1++; str2++; }
100 return *str1 - *str2;
105#define START_TEST(name) \
106 static void func_##name(void); \
107 const struct test winetest_testlist[] = { { #name, func_##name }, { 0, 0 } }; \
108 static void func_##name(void)
113#define START_TEST(name) extern "C" void func_##name(void)
115#define START_TEST(name) void func_##name(void)
120#if defined(__x86_64__) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT)
121#define __winetest_cdecl __cdecl
122#define __winetest_va_list __builtin_ms_va_list
124#define __winetest_cdecl
125#define __winetest_va_list va_list
133# define WINETEST_PRINTF_ATTR(fmt,args) __attribute__((format (printf,fmt,args)))
143# define WINETEST_PRINTF_ATTR(fmt,args)
154#define subtest_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_subtest
155#define ok_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_ok
156#define skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_skip
157#define win_skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_win_skip
158#define trace_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_trace
159#define wait_child_process_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_wait_child_process
161#define subtest subtest_(__FILE__, __LINE__)
162#define ok ok_(__FILE__, __LINE__)
163#define skip skip_(__FILE__, __LINE__)
164#define win_skip win_skip_(__FILE__, __LINE__)
165#define trace trace_(__FILE__, __LINE__)
166#define wait_child_process wait_child_process_(__FILE__, __LINE__)
168#define todo_if(is_todo) for (winetest_start_todo(is_todo); \
169 winetest_loop_todo(); \
172#define todo_ros todo_if(!strcmp(winetest_platform, "reactos"))
173#define todo_ros_if(is_todo) todo_if((is_todo) && !strcmp(winetest_platform, "reactos"))
175#define todo_wine todo_ros
176#define todo_wine_if todo_ros_if
178#define todo_wine todo_if(!strcmp(winetest_platform, "wine"))
179#define todo_wine_if(is_todo) todo_if((is_todo) && !strcmp(winetest_platform, "wine"))
182#define ros_skip_flaky for (winetest_start_nocount(3); \
183 winetest_loop_nocount(); \
184 winetest_end_nocount())
186#define disable_success_count for (winetest_start_nocount(1); \
187 winetest_loop_nocount(); \
188 winetest_end_nocount())
190#define skip_2k3_crash if (_winver < 0x600) skip("Test skipped, because it crashes on win 2003\n"); else
191#define skip_2k3_fail if (_winver < 0x600) skip("Test skipped, because it fails on win 2003\n"); else
193#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
195#ifdef NONAMELESSUNION
217#ifdef NONAMELESSSTRUCT
245#if defined(__x86_64__) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT)
246# define __winetest_va_start(list,arg) __builtin_ms_va_start(list,arg)
247# define __winetest_va_end(list) __builtin_ms_va_end(list)
249# define __winetest_va_start(list,arg) va_start(list,arg)
250# define __winetest_va_end(list) va_end(list)
255#if defined(WINETEST_MSVC_IDE_FORMATTING)
256# define __winetest_file_line_prefix "%s(%d)"
258# define __winetest_file_line_prefix "%s:%d"
282static int winetest_argc;
283static char** winetest_argv;
285static const struct test *current_test;
287static LONG successes;
290static LONG todo_successes;
291static LONG todo_failures;
296 const char* current_file;
299 unsigned int nocount_level;
304 unsigned int context_count;
343static void exit_process(
int code )
353#if defined(WINETEST_MSVC_IDE_FORMATTING)
362 data->current_file++;
380 __winetest_va_end(
valist );
388 winetest_printf(
"%s", msgtype );
389 for (
i = 0;
i <
data->context_count; ++
i)
396 fprintf(
stdout, __winetest_file_line_prefix
": Subtest %s\n",
403#ifndef USE_WINE_TODOS
423 if (
data->todo_level)
427 winetest_print_context(
"Test succeeded inside todo block: " );
429 if ((
data->nocount_level & 2) == 0)
438 winetest_print_context(
"Test marked todo: " );
441 if ((
data->nocount_level & 1) == 0)
450 winetest_print_context(
"Test failed: " );
452 if ((
data->nocount_level & 2) == 0)
460 winetest_printf(
"Test succeeded\n");
462 if ((
data->nocount_level & 1) == 0)
475 __winetest_va_end(
valist);
484 winetest_print_context(
"" );
487 __winetest_va_end(
valist);
499 __winetest_va_end(
valist);
504 winetest_print_context(
"Tests skipped: " );
514 __winetest_va_end(
valist);
522#ifndef USE_WINE_TODOS
529 __winetest_va_end(
valist);
535 data->todo_level = (
data->todo_level << 1) | (is_todo != 0);
536 data->todo_do_loop=1;
543 data->todo_do_loop=0;
550 data->todo_level >>= 1;
564 data->todo_do_loop = 1;
571 data->todo_do_loop = 0;
578 data->nocount_level >>= 2;
590 __winetest_va_end(
valist);
591 data->context[
data->context_count][
sizeof(
data->context[
data->context_count]) - 1] = 0;
593 ++
data->context_count;
600 if (
data->context_count)
601 --
data->context_count;
606 *pargv = winetest_argv;
607 return winetest_argc;
622 while (new_failures-- > 0)
631 fprintf(
stdout,
"%s: child process wait failed\n", current_test->name );
645 current_test->name, (
unsigned)
exit_code );
659 if (!
str)
return "(null)";
679 case '\n': *
dst++ =
'\\'; *
dst++ =
'n';
break;
680 case '\r': *
dst++ =
'\\'; *
dst++ =
'r';
break;
681 case '\t': *
dst++ =
'\\'; *
dst++ =
't';
break;
682 case '"': *
dst++ =
'\\'; *
dst++ =
'"';
break;
683 case '\\': *
dst++ =
'\\'; *
dst++ =
'\\';
break;
685 if (
c >=
' ' &&
c <= 126)
710 static const char hex[16] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'a',
'b',
'c',
'd',
'e',
'f'};
713 if (!
str)
return "(null)";
721 if (
n == -1)
for (
n = 0;
str[
n];
n++) ;
729 case '\n': *
dst++ =
'\\'; *
dst++ =
'n';
break;
730 case '\r': *
dst++ =
'\\'; *
dst++ =
'r';
break;
731 case '\t': *
dst++ =
'\\'; *
dst++ =
't';
break;
732 case '"': *
dst++ =
'\\'; *
dst++ =
'"';
break;
733 case '\\': *
dst++ =
'\\'; *
dst++ =
'\\';
break;
735 if (
c <
' ' ||
c >= 127)
738 *
dst++ =
hex[(
c >> 12) & 0x0f];
764 if (!
guid)
return "(null)";
766 sprintf(
res,
"{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
777 if (!
point)
return "(null)";
792 if (!
size)
return "(null)";
807 if (!
rect)
return "(null)";
818#ifdef WINETEST_USE_DBGSTR_LONGLONG
825 sprintf(
res,
"%lx%08lx", (
unsigned long)(
ll >> 32), (
unsigned long)
ll );
834static const struct test *find_test(
const char *
name )
854static void list_tests(
void)
865#pragma warning(disable:28182)
879 successes =
failures = todo_successes = todo_failures = 0;
887 fprintf(
stdout,
"\n%s: %d tests executed (%d marked as todo, %d %s), %d skipped.\n",
889 (
int)todo_successes, (
int)(
failures + todo_failures),
890 (
failures + todo_failures != 1) ?
"failures" :
"failure",
917 winetest_argc =
argc;
918 winetest_argv =
argv;
948#define ok_hex_(file, line, expression, result) \
950 int _value = (expression); \
951 int _result = (result); \
952 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (0x%x), got: 0x%x\n", \
953 #expression, _result, _value); \
955#define ok_hex(expression, result) ok_hex_(__FILE__, __LINE__, expression, result)
957#define ok_dec_(file, line, expression, result) \
959 int _value = (expression); \
960 int _result = (result); \
961 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (%d), got: %d\n", \
962 #expression, _result, _value); \
964#define ok_dec(expression, result) ok_dec_(__FILE__, __LINE__, expression, result)
966#define ok_ptr_(file, line, expression, result) \
968 const void *_value = (expression); \
969 const void *_result = (result); \
970 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (%p), got: %p\n", \
971 #expression, _result, _value); \
973#define ok_ptr(expression, result) ok_ptr_(__FILE__, __LINE__, expression, result)
975#define ok_size_t_(file, line, expression, result) \
977 size_t _value = (expression); \
978 size_t _result = (result); \
979 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (%Ix), got: %Ix\n", \
980 #expression, _result, _value); \
982#define ok_size_t(expression, result) ok_size_t_(__FILE__, __LINE__, expression, result)
984#define ok_char(expression, result) ok_hex(expression, result)
986#define ok_err_(file, line, error) \
987 ok_(file, line)(GetLastError() == (error), "Wrong last error. Expected " #error ", got 0x%lx\n", GetLastError())
988#define ok_err(error) ok_err_(__FILE__, __LINE__, error)
990#define ok_str_(file, line, x, y) \
991 ok_(file, line)(strcmp(x, y) == 0, "Wrong string. Expected '%s', got '%s'\n", y, x)
992#define ok_str(x, y) ok_str_(__FILE__, __LINE__, x, y)
994#define ok_wstr_(file, line, x, y) \
995 ok_(file, line)(wcscmp(x, y) == 0, "Wrong string. Expected '%S', got '%S'\n", y, x)
996#define ok_wstr(x, y) ok_wstr_(__FILE__, __LINE__, x, y)
998#define ok_long(expression, result) ok_hex(expression, result)
999#define ok_int(expression, result) ok_dec(expression, result)
1000#define ok_int_(file, line, expression, result) ok_dec_(file, line, expression, result)
1001#define ok_ntstatus(status, expected) ok_hex(status, expected)
1002#define ok_hdl ok_ptr
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)
DWORD WINAPI TlsAlloc(VOID)
BOOL WINAPI TlsSetValue(IN DWORD Index, IN LPVOID Value)
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)
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
#define sprintf(buf, format,...)
#define SEM_FAILCRITICALERRORS
#define SEM_NOGPFAULTERRORBOX
const struct test winetest_testlist[]
_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)
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