From 58ed1f173decb3573c9393f6f72afd393b5d3dfb Mon Sep 17 00:00:00 2001 From: Francois Gouget Date: Fri, 22 Mar 2002 00:58:00 +0000 Subject: [PATCH] Add trace function (same as in the perl framework). Add support for todo tests. Make it possible to specify a printf-style message in ok. Include windef.h in test.h for compiling tests on Windows. --- include/wine/test.h | 20 ++++++++- programs/winetest/wtmain.c | 84 +++++++++++++++++++++++++++++++++++--- 2 files changed, 97 insertions(+), 7 deletions(-) diff --git a/include/wine/test.h b/include/wine/test.h index 184400968c3..dced5c8e225 100644 --- a/include/wine/test.h +++ b/include/wine/test.h @@ -21,16 +21,32 @@ #ifndef __WINE_TEST_H #define __WINE_TEST_H +#include +#include "windef.h" + /* debug level */ extern int winetest_debug; /* current platform */ extern const char *winetest_platform; -extern void winetest_ok( int condition, const char *msg, const char *file, int line ); +typedef int (*winetest_ok_funcptr)( int condition, const char *msg, ...); +typedef void (*winetest_trace_funcptr)( const char *msg, ...); + +extern winetest_ok_funcptr winetest_set_ok_location( const char* file, int line ); +extern winetest_trace_funcptr winetest_set_trace_location( const char* file, int line ); +extern void winetest_start_todo( const char* platform ); +extern int winetest_loop_todo(void); +extern void winetest_end_todo( const char* platform ); #define START_TEST(name) void func_##name(void) -#define ok(test,msg) winetest_ok( (test), (msg), __FILE__, __LINE__ ) +#define ok (*winetest_set_ok_location(__FILE__, __LINE__)) +#define trace (*winetest_set_trace_location(__FILE__, __LINE__)) + +#define todo(platform) for (winetest_start_todo(platform); \ + winetest_loop_todo(); \ + winetest_end_todo(platform)) +#define todo_wine todo("wine") #endif /* __WINE_TEST_H */ diff --git a/programs/winetest/wtmain.c b/programs/winetest/wtmain.c index d105042f0bf..7677d6f23c2 100644 --- a/programs/winetest/wtmain.c +++ b/programs/winetest/wtmain.c @@ -23,6 +23,8 @@ #include #include +#include "wine/test.h" + /* debug level */ int winetest_debug = 1; @@ -37,12 +39,18 @@ struct test extern const struct test winetest_testlist[]; static const struct test *current_test; /* test currently being run */ +/* FIXME: Access to all the following variables must be protected in a + * multithread test. Either via thread local storage or via critical sections + */ +static const char* current_file; /* file of current check */ +static int current_line; /* line of current check */ static int successes; /* number of successful tests */ static int failures; /* number of failures */ static int todo_successes; /* number of successful tests inside todo block */ static int todo_failures; /* number of failures inside todo block */ static int todo_level; /* current todo nesting level */ +static int todo_do_loop; /* * Checks condition. @@ -51,17 +59,29 @@ static int todo_level; /* current todo nesting level */ * - msg test description; * - file - test application source code file name of the check * - line - test application source code file line number of the check + * Return: + * 0 if condition does not have the expected value, 1 otherwise */ -void winetest_ok( int condition, const char *msg, const char *file, int line ) +int winetest_ok( int condition, const char *msg, ... ) { + va_list valist; + if (todo_level) { if (condition) { - fprintf( stderr, "%s:%d: Test succeeded inside todo block", file, line ); - if (msg && msg[0]) fprintf( stderr, ": %s", msg ); + fprintf( stderr, "%s:%d: Test succeeded inside todo block", + current_file, current_line ); + if (msg && msg[0]) + { + va_start(valist, msg); + fprintf(stderr,": "); + vfprintf(stderr, msg, valist); + va_end(valist); + } fputc( '\n', stderr ); todo_failures++; + return 0; } else todo_successes++; } @@ -69,15 +89,69 @@ void winetest_ok( int condition, const char *msg, const char *file, int line ) { if (!condition) { - fprintf( stderr, "%s:%d: Test failed", file, line ); - if (msg && msg[0]) fprintf( stderr, ": %s", msg ); + fprintf( stderr, "%s:%d: Test failed", + current_file, current_line ); + if (msg && msg[0]) + { + va_start(valist, msg); + fprintf( stderr,": "); + vfprintf(stderr, msg, valist); + va_end(valist); + } fputc( '\n', stderr ); failures++; + return 0; } else successes++; } + return 1; } +winetest_ok_funcptr winetest_set_ok_location( const char* file, int line ) +{ + current_file=file; + current_line=line; + return &winetest_ok; +} + +void winetest_trace( const char *msg, ... ) +{ + va_list valist; + + if (winetest_debug > 0) + { + va_start(valist, msg); + vfprintf(stderr, msg, valist); + va_end(valist); + } +} + +winetest_trace_funcptr winetest_set_trace_location( const char* file, int line ) +{ + current_file=file; + current_line=line; + return &winetest_trace; +} + +void winetest_start_todo( const char* platform ) +{ + if (strcmp(winetest_platform,platform)==0) + todo_level++; + todo_do_loop=1; +} + +int winetest_loop_todo(void) +{ + int do_loop=todo_do_loop; + todo_do_loop=0; + return do_loop; +} + +void winetest_end_todo( const char* platform ) +{ + if (strcmp(winetest_platform,platform)==0) + todo_level--; +} /* Find a test by name */ static const struct test *find_test( const char *name )