8#ifndef __MINI_WINE_TEST_H
9#define __MINI_WINE_TEST_H
58#define subtest_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_subtest
59#define ok_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_ok
60#define skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_skip
61#define win_skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_win_skip
62#define trace_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_trace
64#define subtest subtest_(__RELFILE__, __LINE__)
65#define ok ok_(__RELFILE__, __LINE__)
66#define skip skip_(__RELFILE__, __LINE__)
67#define win_skip win_skip_(__RELFILE__, __LINE__)
68#define trace trace_(__RELFILE__, __LINE__)
70#define todo_if(is_todo) for (winetest_start_todo(is_todo); \
71 winetest_loop_todo(); \
74#define todo_ros todo_if(!strcmp(winetest_platform, "reactos"))
75#define todo_ros_if(is_todo) todo_if((is_todo) && !strcmp(winetest_platform, "reactos"))
77#define todo_wine todo_ros
78#define todo_wine_if todo_ros_if
80#define todo_wine todo_if(!strcmp(winetest_platform, "wine"))
81#define todo_wine_if(is_todo) todo_if((is_todo) && !strcmp(winetest_platform, "wine"))
84#define ros_skip_flaky for (winetest_start_nocount(3); \
85 winetest_loop_nocount(); \
86 winetest_end_nocount())
88#define disable_success_count for (winetest_start_nocount(1); \
89 winetest_loop_nocount(); \
90 winetest_end_nocount())
92#define skip_2k3_crash if (_winver < 0x600) skip("Test skipped, because it crashes on win 2003\n"); else
93#define skip_2k3_fail if (_winver < 0x600) skip("Test skipped, because it fails on win 2003\n"); else
95#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
111#if defined(WINETEST_MSVC_IDE_FORMATTING)
112# define __winetest_file_line_prefix "%s(%d)"
114# define __winetest_file_line_prefix "%s:%d"
139static int winetest_argc;
140static char** winetest_argv;
143static const struct test *current_test;
145static LONG winetest_successes;
146static LONG winetest_failures;
147static LONG winetest_skipped;
148static LONG winetest_todo_successes;
149static LONG winetest_todo_failures;
152struct winetest_thread_data
154 const char* current_file;
157 unsigned int nocount_level;
164 unsigned int context_count;
169static struct winetest_thread_data *winetest_get_thread_data(
void)
171 struct winetest_thread_data *
data;
199 struct winetest_thread_data *
data = winetest_get_thread_data();
209 data->current_file++;
230 struct winetest_thread_data *
data = winetest_get_thread_data();
235 winetest_printf( __winetest_file_line_prefix
": ",
data->current_file,
data->current_line );
241static void __cdecl winetest_print_context(
const char *msgtype )
243 struct winetest_thread_data *
data = winetest_get_thread_data();
246 winetest_print_location(
"%s", msgtype );
247 for (
i = 0;
i <
data->context_count; ++
i)
248 winetest_printf(
"%s: ",
data->context[
i] );
253 winetest_print_location(
"Subtest %s\n",
name );
259#ifndef USE_WINE_TODOS
277 struct winetest_thread_data *
data = winetest_get_thread_data();
279 if (
data->todo_level)
283 winetest_print_context(
"Test succeeded inside todo block: " );
285 if ((
data->nocount_level & 2) == 0)
294 winetest_print_context(
"Test marked todo: " );
297 if ((
data->nocount_level & 1) == 0)
306 winetest_print_context(
"Test failed: " );
308 if ((
data->nocount_level & 2) == 0)
316 winetest_print_location(
"Test succeeded\n");
318 if ((
data->nocount_level & 1) == 0)
340 winetest_print_context(
"" );
349 winetest_print_context(
"Tests skipped: " );
367#
if !defined(USE_WINE_TODOS) || defined(USE_WIN_SKIP)
379 struct winetest_thread_data *
data = winetest_get_thread_data();
380 data->todo_level = (
data->todo_level << 1) | (is_todo != 0);
381 data->todo_do_loop=1;
386 struct winetest_thread_data *
data = winetest_get_thread_data();
388 data->todo_do_loop=0;
394 struct winetest_thread_data *
data = winetest_get_thread_data();
395 data->todo_level >>= 1;
400 struct winetest_thread_data *
data = winetest_get_thread_data();
409 data->todo_do_loop = 1;
414 struct winetest_thread_data *
data = winetest_get_thread_data();
416 data->todo_do_loop = 0;
422 struct winetest_thread_data *
data = winetest_get_thread_data();
423 data->nocount_level >>= 2;
428 struct winetest_thread_data *
data = winetest_get_thread_data();
436 data->context[
data->context_count][
sizeof(
data->context[
data->context_count]) - 1] = 0;
438 ++
data->context_count;
443 struct winetest_thread_data *
data = winetest_get_thread_data();
445 if (
data->context_count)
446 --
data->context_count;
452 *pargv = winetest_argv;
453 return winetest_argc;
459 return winetest_failures;
464 return winetest_successes;
469 while (new_failures-- > 0)
501 winetest_successes = winetest_failures = winetest_skipped = winetest_todo_successes = winetest_todo_failures = 0;
506static int fini_test(
void)
509 const struct test *
test = current_test;
515 winetest_print_location(
"\n%s: %d tests executed (%d marked as todo, %d %s), %d skipped.\n",
516 test->
name, (
int)(winetest_successes + winetest_failures + winetest_todo_successes + winetest_todo_failures),
517 (
int)winetest_todo_successes, (
int)(winetest_failures + winetest_todo_failures),
518 (winetest_failures + winetest_todo_failures != 1) ?
"failures" :
"failure",
519 (
int)winetest_skipped );
521 status = (winetest_failures + winetest_todo_failures < 255) ? winetest_failures + winetest_todo_failures : 255;
529#define ok_hex_(file, line, expression, result) \
531 int _value = (expression); \
532 int _result = (result); \
533 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (0x%x), got: 0x%x\n", \
534 #expression, _result, _value); \
536#define ok_hex(expression, result) ok_hex_(__RELFILE__, __LINE__, expression, result)
538#define ok_dec_(file, line, expression, result) \
540 int _value = (expression); \
541 int _result = (result); \
542 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (%d), got: %d\n", \
543 #expression, _result, _value); \
545#define ok_dec(expression, result) ok_dec_(__RELFILE__, __LINE__, expression, result)
547#define ok_ptr_(file, line, expression, result) \
549 const void *_value = (expression); \
550 const void *_result = (result); \
551 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (%p), got: %p\n", \
552 #expression, _result, _value); \
554#define ok_ptr(expression, result) ok_ptr_(__RELFILE__, __LINE__, expression, result)
556#define ok_size_t_(file, line, expression, result) \
558 size_t _value = (expression); \
559 size_t _result = (result); \
560 ok_(file, line)(_value == _result, "Wrong value for '%s', expected: " #result " (%Ix), got: %Ix\n", \
561 #expression, _result, _value); \
563#define ok_size_t(expression, result) ok_size_t_(__RELFILE__, __LINE__, expression, result)
565#define ok_char(expression, result) ok_hex(expression, result)
567#define ok_err_(file, line, error) \
568 ok_(file, line)(GetLastError() == (error), "Wrong last error. Expected " #error ", got 0x%lx\n", GetLastError())
569#define ok_err(error) ok_err_(__RELFILE__, __LINE__, error)
571#define ok_str_(file, line, x, y) \
572 ok_(file, line)(strcmp(x, y) == 0, "Wrong string. Expected '%s', got '%s'\n", y, x)
573#define ok_str(x, y) ok_str_(__RELFILE__, __LINE__, x, y)
575#define ok_wstr_(file, line, x, y) \
576 ok_(file, line)(wcscmp(x, y) == 0, "Wrong string. Expected '%S', got '%S'\n", y, x)
577#define ok_wstr(x, y) ok_wstr_(__RELFILE__, __LINE__, x, y)
579#define ok_long(expression, result) ok_hex(expression, result)
580#define ok_int(expression, result) ok_dec(expression, result)
581#define ok_int_(file, line, expression, result) ok_dec_(file, line, expression, result)
582#define ok_ntstatus(status, expected) ok_hex(status, expected)
int strcmp(const char *String1, const char *String2)
ACPI_SIZE strlen(const char *String)
#define InterlockedIncrement
static INT do_loop(const PropSheetInfo *psInfo)
#define GetEnvironmentVariableA(x, y, z)
UINT WINAPI SetErrorMode(IN UINT uMode)
LPVOID WINAPI TlsGetValue(IN DWORD Index)
BOOL WINAPI TlsSetValue(IN DWORD Index, IN LPVOID Value)
DWORD WINAPI DECLSPEC_HOTPATCH TlsAlloc(void)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLsizei const GLchar *const * strings
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
int winetest_vok(int condition, const char *msg, va_list ap)
void winetest_start_todo(int is_todo)
const char * winetest_platform
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl winetest_push_context(const char *fmt,...) __WINE_PRINTF_ATTR(1
void winetest_vskip(const char *msg, va_list ap)
void __cdecl winetest_ok(int condition, const char *msg,...) __WINE_PRINTF_ATTR(2
LONG winetest_get_failures(void)
LONG winetest_get_successes(void)
void __cdecl void __cdecl winetest_skip(const char *msg,...) __WINE_PRINTF_ATTR(1
void winetest_set_location(const char *file, int line)
void winetest_end_nocount(void)
void __cdecl void __cdecl void __cdecl winetest_win_skip(const char *msg,...) __WINE_PRINTF_ATTR(1
void winetest_start_nocount(unsigned int flags)
void winetest_subtest(const char *name)
void winetest_end_todo(void)
int winetest_loop_nocount(void)
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl void winetest_pop_context(void)
void __cdecl void __cdecl void __cdecl void __cdecl winetest_trace(const char *msg,...) __WINE_PRINTF_ATTR(1
int winetest_loop_todo(void)
void winetest_add_failures(LONG new_failures)
#define __WINE_PRINTF_ATTR(fmt, args)
#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 __wine_dbg_set_functions(const struct __wine_debug_functions *new_funcs, struct __wine_debug_functions *old_funcs, size_t size)
int winetest_get_mainargs(char ***pargv)
static void init_test(void)
TCHAR str_pos[MAX_LOADSTRING]
int(* dbg_vprintf)(const char *format, va_list args)
DWORD WINAPI GetLastError(void)
void int int ULONGLONG int va_list * ap