21#ifndef __WINE_WINE_TEST_H
22#define __WINE_WINE_TEST_H
31#pragma GCC diagnostic push
32#pragma GCC diagnostic ignored "-Wunused-function"
36#error config.h should not be used in Wine tests
38#ifdef __WINE_WINE_LIBRARY_H
39#error wine/library.h should not be used in Wine tests
41#ifdef __WINE_WINE_UNICODE_H
42#error wine/unicode.h should not be used in Wine tests
44#ifdef __WINE_WINE_DEBUG_H
45#error wine/debug.h should not be used in Wine tests
48#ifndef __WINE_PRINTF_ATTR
50# define __WINE_PRINTF_ATTR(fmt,args) __attribute__((format (printf,fmt,args)))
52# define __WINE_PRINTF_ATTR(fmt,args)
60#ifndef INVALID_FILE_ATTRIBUTES
61#define INVALID_FILE_ATTRIBUTES (~0u)
63#ifndef INVALID_SET_FILE_POINTER
64#define INVALID_SET_FILE_POINTER (~0u)
129#define START_TEST(name) \
130 static void func_##name(void); \
131 const struct test winetest_testlist[] = { { #name, func_##name }, { 0, 0 } }; \
132 static void func_##name(void)
134#define START_TEST(name) EXTERN_C void func_##name(void)
137#ifdef WINETEST_NO_LINE_NUMBERS
138# define subtest_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_subtest
139# define ignore_exceptions_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_ignore_exceptions
140# define ok_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_ok
141# define skip_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_skip
142# define win_skip_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_win_skip
143# define trace_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_trace
144# define wait_child_process_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_wait_child_process
146# define subtest_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_subtest
147# define ignore_exceptions_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_ignore_exceptions
148# define ok_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_ok
149# define skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_skip
150# define win_skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_win_skip
151# define trace_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_trace
152# define wait_child_process_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_wait_child_process
155#define subtest subtest_(__FILE__, __LINE__)
156#define ignore_exceptions ignore_exceptions_(__FILE__, __LINE__)
157#define ok ok_(__FILE__, __LINE__)
158#define skip skip_(__FILE__, __LINE__)
159#define win_skip win_skip_(__FILE__, __LINE__)
160#define trace trace_(__FILE__, __LINE__)
161#define wait_child_process wait_child_process_(__FILE__, __LINE__)
163#define flaky_if(is_flaky) for (winetest_start_flaky(is_flaky); \
164 winetest_loop_flaky(); \
165 winetest_end_flaky())
166#define flaky flaky_if(TRUE)
167#define flaky_wine flaky_if(winetest_platform_is_wine)
168#define flaky_wine_if(is_flaky) flaky_if((is_flaky) && winetest_platform_is_wine)
170#define todo_if(is_todo) for (winetest_start_todo(is_todo); \
171 winetest_loop_todo(); \
174#define todo_ros todo_if(!strcmp(winetest_platform, "reactos"))
175#define todo_ros_if(is_todo) todo_if((is_todo) && !strcmp(winetest_platform, "reactos"))
177#define todo_wine todo_ros
178#define todo_wine_if todo_ros_if
180#define todo_wine todo_if(!strcmp(winetest_platform, "wine"))
181#define todo_wine_if(is_todo) todo_if((is_todo) && !strcmp(winetest_platform, "wine"))
185# define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
198#if defined(WINETEST_MSVC_IDE_FORMATTING)
207 data->current_file++;
223#if defined(WINETEST_MSVC_IDE_FORMATTING)
224# define __winetest_file_line_prefix "%s(%d)"
226# define __winetest_file_line_prefix "%s:%d"
272 for (
i = 0;
i <
data->context_count; ++
i)
291#ifndef USE_WINE_TODOS
300 static LONG line_counters[16384];
336 if (
data->todo_level)
342 if ((
data->nocount_level & 2) == 0)
354 if ((
data->nocount_level & 1) == 0)
365 if ((
data->nocount_level & 2) == 0)
375 if ((
data->nocount_level & 1) == 0)
442#
if !defined(USE_WINE_TODOS) || defined(USE_WIN_SKIP)
467 data->flaky_level = (
data->flaky_level << 1) | (is_flaky != 0);
468 data->flaky_do_loop = 1;
474 int do_flaky =
data->flaky_do_loop;
475 data->flaky_do_loop = 0;
482 data->flaky_level >>= 1;
495 data->todo_level = (
data->todo_level << 1) | (is_todo != 0);
496 data->todo_do_loop=1;
503 data->todo_do_loop=0;
510 data->todo_level >>= 1;
549 data->context[
data->context_count][
sizeof(
data->context[
data->context_count]) - 1] = 0;
551 ++
data->context_count;
558 if (
data->context_count)
559 --
data->context_count;
595extern const struct test winetest_testlist_start[];
627static HANDLE winetest_mutex;
630static int winetest_argc;
631static char** winetest_argv;
633static const struct test *current_test;
645static DWORD tls_index;
664static void exit_process(
int code )
674 if (!winetest_mutex)
return;
703 *pargv = winetest_argv;
704 return winetest_argc;
734static const struct test *find_test(
const char *
name )
754static void list_tests(
void)
765#pragma warning(disable:28182)
787 fprintf(
stdout,
"\n%s: %d tests executed (%d marked as todo, %d %s), %d skipped.\n",
816 if (
data->current_file)
817 printf(
"%s:%d: this is the last test seen before the exception\n",
818 data->current_file,
data->current_line );
820 printf(
"%04x:%s:%s unhandled exception %08x at %p\n",
845 winetest_argc =
argc;
846 winetest_argv =
argv;
874#ifdef NONAMELESSUNION
896#ifdef NONAMELESSSTRUCT
913#ifndef __WINE_DEBUG_H
920#ifdef WINETEST_USE_DBGSTR_LONGLONG
930#if defined(__oaidl_h__) && defined(V_VT)
931extern const char *wine_dbgstr_variant(
const VARIANT *
var);
935extern const char *
__cdecl __wine_dbg_strdup(
const char *
str );
957#define ros_skip_flaky for (winetest_start_nocount(3); \
958 winetest_loop_nocount(); \
959 winetest_end_nocount())
961#define disable_success_count for (winetest_start_nocount(1); \
962 winetest_loop_nocount(); \
963 winetest_end_nocount())
965#define skip_2k3_crash if (_winver < 0x600) skip("Test skipped, because it crashes on win 2003\n"); else
966#define skip_2k3_fail if (_winver < 0x600) skip("Test skipped, because it fails on win 2003\n"); else
968#define ok_hex_(file, line, expression, result) \
970 int _value = (expression); \
971 int _result = (result); \
972 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (0x%x), got: 0x%x\n", \
973 #expression, _result, _value); \
975#define ok_hex(expression, result) ok_hex_(__FILE__, __LINE__, expression, result)
977#define ok_dec_(file, line, expression, result) \
979 int _value = (expression); \
980 int _result = (result); \
981 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (%d), got: %d\n", \
982 #expression, _result, _value); \
984#define ok_dec(expression, result) ok_dec_(__FILE__, __LINE__, expression, result)
986#define ok_ptr_(file, line, expression, result) \
988 const void *_value = (expression); \
989 const void *_result = (result); \
990 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (%p), got: %p\n", \
991 #expression, _result, _value); \
993#define ok_ptr(expression, result) ok_ptr_(__FILE__, __LINE__, expression, result)
995#define ok_size_t_(file, line, expression, result) \
997 size_t _value = (expression); \
998 size_t _result = (result); \
999 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (%Ix), got: %Ix\n", \
1000 #expression, _result, _value); \
1002#define ok_size_t(expression, result) ok_size_t_(__FILE__, __LINE__, expression, result)
1004#define ok_char(expression, result) ok_hex(expression, result)
1006#define ok_err_(file, line, error) \
1007 ok_(file, line)(GetLastError() == (error), "Wrong last error. Expected " #error ", got 0x%lx\n", GetLastError())
1008#define ok_err(error) ok_err_(__FILE__, __LINE__, error)
1010#define ok_str_(file, line, x, y) \
1011 ok_(file, line)(strcmp(x, y) == 0, "Wrong string. Expected '%s', got '%s'\n", y, x)
1012#define ok_str(x, y) ok_str_(__FILE__, __LINE__, x, y)
1014#define ok_wstr_(file, line, x, y) \
1015 ok_(file, line)(wcscmp(x, y) == 0, "Wrong string. Expected '%S', got '%S'\n", y, x)
1016#define ok_wstr(x, y) ok_wstr_(__FILE__, __LINE__, x, y)
1018#define ok_long(expression, result) ok_hex(expression, result)
1019#define ok_int(expression, result) ok_dec(expression, result)
1020#define ok_int_(file, line, expression, result) ok_dec_(file, line, expression, result)
1021#define ok_ntstatus(status, expected) ok_hex(status, expected)
1022#define ok_hdl ok_ptr
1024#define is_reactos() \
1025 (*(unsigned*)((size_t)0x7FFE0FFC) == 0x8EAC705)
1028#define KUSER_SHARED_DATA_UMPTR 0x7FFE0000
1029#define GetMajorNTVersion() (*(ULONG*)(KUSER_SHARED_DATA_UMPTR + 0x026C))
1030#define GetMinorNTVersion() (*(ULONG*)(KUSER_SHARED_DATA_UMPTR + 0x0270))
1031#define GetNTVersion() ((GetMajorNTVersion() << 8) | GetMinorNTVersion())
1032#define __REACTOS__WinVer_lt(Ver) ((GetNTVersion() < (Ver)))
1043#if defined(_MSC_VER)
1044 #pragma section(".test$A",long,read)
1045 #define _TESTALLOC(x) __declspec(allocate(x))
1046 #define _PRAGMA_SECTION(x, y, z) __pragma(section(x, y, z))
1047 #define _TESTKEEP(x) const void* keep_##x = &x;
1048#elif defined(__GNUC__)
1049 #define _TESTALLOC(x) __attribute__((used, section(x)))
1050 #define _PRAGMA_SECTION(x, y, z)
1051 #define _TESTKEEP(x)
1053 #error Your compiler is not supported.
1057#define START_TEST(name) \
1058 EXTERN_C void func_##name(void); \
1059 _PRAGMA_SECTION(_CRT_STRINGIZE(.test$B##name), long, read); \
1060 _TESTALLOC(_CRT_STRINGIZE(.test$B##name)) const struct test winetest_testentry_##name = { #name, func_##name }; \
1061 _TESTKEEP(winetest_testentry_##name) \
1062 EXTERN_C void func_##name(void)
1066_TESTALLOC(
".test$A")
const struct test winetest_testlist_start[] = { {
"", 0 } };
1067#define winetest_testlist winetest_testlist_dummy
1074void winetest_print(
const char*
msg, ...)
1096 data->todo_do_loop = 1;
1103 data->todo_do_loop = 0;
1110 data->nocount_level >>= 2;
1138 if (!
str)
return "(null)";
1158 case '\n': *
dst++ =
'\\'; *
dst++ =
'n';
break;
1159 case '\r': *
dst++ =
'\\'; *
dst++ =
'r';
break;
1160 case '\t': *
dst++ =
'\\'; *
dst++ =
't';
break;
1161 case '"': *
dst++ =
'\\'; *
dst++ =
'"';
break;
1162 case '\\': *
dst++ =
'\\'; *
dst++ =
'\\';
break;
1164 if (
c >=
' ' &&
c <= 126)
1189 static const char hex[16] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'a',
'b',
'c',
'd',
'e',
'f'};
1192 if (!
str)
return "(null)";
1200 if (
n == -1)
for (
n = 0;
str[
n];
n++) ;
1208 case '\n': *
dst++ =
'\\'; *
dst++ =
'n';
break;
1209 case '\r': *
dst++ =
'\\'; *
dst++ =
'r';
break;
1210 case '\t': *
dst++ =
'\\'; *
dst++ =
't';
break;
1211 case '"': *
dst++ =
'\\'; *
dst++ =
'"';
break;
1212 case '\\': *
dst++ =
'\\'; *
dst++ =
'\\';
break;
1214 if (
c <
' ' ||
c >= 127)
1217 *
dst++ =
hex[(
c >> 12) & 0x0f];
1218 *
dst++ =
hex[(
c >> 8) & 0x0f];
1219 *
dst++ =
hex[(
c >> 4) & 0x0f];
1243 if (!
guid)
return "(null)";
1245 sprintf(
res,
"{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
1256 if (!
point)
return "(null)";
1258#ifdef __ROS_LONG64__
1271 if (!
size)
return "(null)";
1273#ifdef __ROS_LONG64__
1286 if (!
rect)
return "(null)";
1288#ifdef __ROS_LONG64__
1297#ifdef WINETEST_WINE_DBG_STUBS
1341#ifdef WINETEST_USE_DBGSTR_LONGLONG
1348 sprintf(
res,
"%lx%08lx", (
unsigned long)(
ll >> 32), (
unsigned long)
ll );
1356#if defined(__oaidl_h__) && defined(V_VT)
1357const char *wine_dbgstr_variant(
const VARIANT *
var)
1359 static char buf[400];
1367 return "{VT_EMPTY}";
1387const char *
__cdecl __wine_dbg_strdup(
const char *
str )
1389 static char *
list[32];
1406#pragma GCC diagnostic pop
ios_base &_STLP_CALL hex(ios_base &__s)
#define InterlockedIncrement
static const char * wine_dbgstr_point(const POINT *ppt)
static const char * wine_dbgstr_size(const SIZE *psize)
static const char * wine_dbgstr_rect(const RECT *prc)
static INT do_loop(const PropSheetInfo *psInfo)
const char * wine_dbg_sprintf(const char *format,...)
const char * wine_dbgstr_an(const char *str, int n)
#define GetProcAddress(x, y)
static __inline const char * debugstr_an(const char *s, int n)
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)
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
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)
ULONG WINAPI DECLSPEC_HOTPATCH GetTickCount(void)
DWORD WINAPI DECLSPEC_HOTPATCH TlsAlloc(void)
int WINAPIV fprintf(FILE *file, const char *format,...)
int CDECL vfprintf(FILE *file, const char *format, va_list valist)
int CDECL fflush(FILE *file)
int CDECL setvbuf(FILE *file, char *buf, int mode, size_t size)
_ACRTIMP int __cdecl atoi(const char *)
_ACRTIMP size_t __cdecl strlen(const char *)
_ACRTIMP int __cdecl strcmp(const char *, const char *)
_ACRTIMP int __cdecl strncmp(const char *, const char *, size_t)
_ACRTIMP char *__cdecl strrchr(const char *, int)
static const char * debugstr_variant(const VARIANT *var)
static LPSTR get_temp_buffer(void)
#define InterlockedExchangePointer(Target, Value)
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLsizei const GLchar *const * strings
GLenum GLuint GLenum GLsizei const GLchar * buf
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
#define EXCEPTION_EXECUTE_HANDLER
LONG winetest_get_successes(void)
void winetest_end_nocount(void)
void winetest_start_nocount(unsigned int flags)
int winetest_loop_nocount(void)
static int running_under_wine(void)
#define SEM_FAILCRITICALERRORS
#define SEM_NOGPFAULTERRORBOX
const struct test winetest_testlist[]
int int ros_dbg_log(enum __wine_debug_class cls, struct __wine_debug_channel *ch, const char *file, const char *func, const int line, const char *format,...) __WINE_PRINTF_ATTR(6
int int static __inline const char * wine_dbgstr_a(const char *s)
static __inline const char * wine_dbgstr_guid(const GUID *id)
static const char winetest_color_dark_purple[]
static void winetest_end_todo(void)
void void winetest_trace(const char *msg,...) __WINE_PRINTF_ATTR(1
#define __winetest_file_line_prefix
const char * winetest_platform
LONG winetest_flaky_failures
static void winetest_start_todo(int is_todo)
static void winetest_subtest(const char *name)
static void winetest_print_location(const char *msg,...) __WINE_PRINTF_ATTR(1
static LONG winetest_get_failures(void)
static const char winetest_color_reset[]
static void winetest_push_context(const char *fmt,...) __WINE_PRINTF_ATTR(1
static void winetest_print_context(const char *msgtype)
void winetest_print_lock(void)
static int winetest_vok(int condition, const char *msg, va_list args)
static void winetest_pop_context(void)
LONG winetest_todo_failures
LONG winetest_muted_todo_successes
int winetest_vprintf(const char *msg, va_list args)
static void winetest_add_failures(LONG new_failures)
static int winetest_loop_flaky(void)
static const char winetest_color_blue[]
void winetest_skip(const char *msg,...) __WINE_PRINTF_ATTR(1
static const char winetest_color_green[]
static int winetest_printf(const char *msg,...) __WINE_PRINTF_ATTR(1
static const char * winetest_elapsed(char *buffer)
void winetest_ok(int condition, const char *msg,...) __WINE_PRINTF_ATTR(2
static LONG winetest_add_line(void)
static void winetest_start_flaky(int is_flaky)
static int winetest_loop_todo(void)
void static void winetest_win_skip(const char *msg,...) __WINE_PRINTF_ATTR(1
#define __WINE_PRINTF_ATTR(fmt, args)
LONG winetest_todo_successes
void winetest_print_unlock(void)
void void static void winetest_vskip(const char *msg, va_list args)
static const char winetest_color_dark_red[]
int winetest_get_mainargs(char ***pargv)
void winetest_wait_child_process(HANDLE process)
LONG winetest_muted_traces
int winetest_mute_threshold
int winetest_platform_is_wine
static const char winetest_color_bright_purple[]
LONG winetest_muted_skipped
static void winetest_ignore_exceptions(BOOL ignore)
static const char winetest_color_bright_red[]
int winetest_report_success
static void winetest_end_flaky(void)
static void winetest_set_location(const char *file, int line)
int winetest_report_flaky
static const char winetest_color_yellow[]
struct winetest_thread_data * winetest_get_thread_data(void)
int winetest_get_time(void)
static void release_temp_buffer(char *buffer, size_t size)
XML_HIDDEN void xmlParserErrors const char const xmlChar const xmlChar * str2
XML_HIDDEN void xmlParserErrors const char const xmlChar * str1
static char argv0[MAX_PATH]
PEXCEPTION_RECORD ExceptionRecord
unsigned int context_count
unsigned int nocount_level
const char * current_file
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseMutex(IN HANDLE hMutex)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateMutexA(IN LPSECURITY_ATTRIBUTES lpMutexAttributes OPTIONAL, IN BOOL bInitialOwner, IN LPCSTR lpName OPTIONAL)
DWORD WINAPI GetLastError(void)
DWORD WINAPI GetCurrentProcessId(void)
#define __wine_dbg_get_channel_flags(channel)