This is a variation on a patch I sent a long time ago... The problem is that ok() systematically prints a '\n' which goes against the convention established by all other functions such as printf, TRACE, ERR and even the test framework's own trace function. None of these appends a '\n'. Because of this, some tests call ok() with a '\n' at the end of the message which results in two '\n's being printed. But Alexandre did not want to fix all the tests at once as it would make a big patch (well, it's just 11567 lines<g.) for a relatively minor issue. So this patch modifies the 'winetest_ok()' to only append a '\n' if the format message does not end with one already. This way new tests can be written with a '\n', and we can fix the old ones progressively (on a schedule yet to be determined). I also attached a script that will fix all tests in the Wine tree so that people can play with this if they want. Finally, this patch also fixes a couple of tests that define macros around 'ok' and thus cannot be handled by the script. Changelog: * include/wine/test.h, dlls/kernel/tests/locale.c, dlls/oleaut32/tests/vartest.c, dlls/user/tests/sysparams.c Modify winetest_ok to only add a trailing '\n' if there is none. Modify macros in the kernel, oleaut32 and user tests to print a '\n'. Index: include/wine/test.h =================================================================== RCS file: /home/wine/wine/include/wine/test.h,v retrieving revision 1.11 diff -u -r1.11 test.h --- include/wine/test.h 28 Aug 2003 21:43:34 -0000 1.11 +++ include/wine/test.h 10 Sep 2003 10:47:56 -0000 @@ -156,6 +156,7 @@ int winetest_ok( int condition, const char *msg, ... ) { va_list valist; + int len; tls_data* data=get_tls_data(); if (data->todo_level) @@ -171,7 +172,9 @@ vfprintf(stdout, msg, valist); va_end(valist); } - fputc( '\n', stdout ); + len=strlen(msg); + if (len==0 || msg[len-1]!='\n') + fputc( '\n', stdout ); InterlockedIncrement(&todo_failures); return 0; } @@ -190,7 +193,9 @@ vfprintf(stdout, msg, valist); va_end(valist); } - fputc( '\n', stdout ); + len=strlen(msg); + if (len==0 || msg[len-1]!='\n') + fputc( '\n', stdout ); InterlockedIncrement(&failures); return 0; } Index: dlls/kernel/tests/locale.c =================================================================== RCS file: /home/wine/wine/dlls/kernel/tests/locale.c,v retrieving revision 1.16 diff -u -r1.16 locale.c --- dlls/kernel/tests/locale.c 5 Sep 2003 23:08:36 -0000 1.16 +++ dlls/kernel/tests/locale.c 10 Sep 2003 11:28:17 -0000 @@ -29,7 +29,7 @@ #include "winnls.h" #define eq(received, expected, label, type) \ - ok((received) == (expected), "%s: got " type " instead of " type, (label),(received),(expected)) + ok((received) == (expected), "%s: got " type " instead of " type "\n", (label),(received),(expected)) #define BUFFER_SIZE 128 /* Buffer used by callback function */ Index: dlls/oleaut32/tests/vartest.c =================================================================== RCS file: /home/wine/wine/dlls/oleaut32/tests/vartest.c,v retrieving revision 1.10 diff -u -r1.10 vartest.c --- dlls/oleaut32/tests/vartest.c 5 Sep 2003 23:08:33 -0000 1.10 +++ dlls/oleaut32/tests/vartest.c 10 Sep 2003 11:28:23 -0000 @@ -1761,8 +1761,8 @@ */ trace( "======== Testing VarUI1FromXXX ========\n"); -#define XOK "should return S_OK" -#define XOV "should return DISP_E_OVERFLOW" +#define XOK "should return S_OK\n" +#define XOV "should return DISP_E_OVERFLOW\n" /* Crashes on Win95: VarUI1FromI2( 0, NULL ) */ ok(VarUI1FromStr(NULL, lcid, 0, pByte) == DISP_E_TYPEMISMATCH,"should return DISP_E_TYPEMISMATCH"); Index: dlls/user/tests/sysparams.c =================================================================== RCS file: /home/wine/wine/dlls/user/tests/sysparams.c,v retrieving revision 1.16 diff -u -r1.16 sysparams.c --- dlls/user/tests/sysparams.c 5 Sep 2003 23:08:29 -0000 1.16 +++ dlls/user/tests/sysparams.c 10 Sep 2003 11:28:28 -0000 @@ -42,7 +42,7 @@ static int strict; #define eq(received, expected, label, type) \ - ok((received) == (expected), "%s: got " type " instead of " type, (label),(received),(expected)) + ok((received) == (expected), "%s: got " type " instead of " type "\n", (label),(received),(expected)) #define SPI_SETBEEP_REGKEY "Control Panel\\Sound" -- Francois Gouget fgouget@free.fr http://fgouget.free.fr/ $live{free} || die "";
#!/usr/bin/perl -w use strict; my $verbose; my @file; my $l; my @chars; my $len; my $c; sub skip_bracket(); sub skip_parent(); sub skip_string(); sub setup_line($) { return 0 if ($l >= @file); $c=$_[0]; $len=length($file[$l]); @chars=split //,$file[$l]; print "$l,$c: $file[$l]" if ($verbose); return 1; } sub skip_bracket() { while (1) { while ($c<$len) { print "skip_bracket: $c -> '$chars[$c]'\n" if ($verbose); if ($chars[$c] eq "]") { print "skip_bracket returns 1\n" if ($verbose); return 1; } elsif ($chars[$c] eq "\"") { $c++; skip_string(); } elsif ($chars[$c] eq "(") { $c++; skip_parent(); } elsif ($chars[$c] eq "[") { $c++; skip_bracket(); } $c++; } $l++; return 0 if (!setup_line(0)); } return 0; } sub skip_parent() { while (1) { while ($c<$len) { print "skip_parent: $c -> '$chars[$c]'\n" if ($verbose); if ($chars[$c] eq ")") { print "skip_parent returns 1\n" if ($verbose); return 1; } elsif ($chars[$c] eq "\"") { $c++; skip_string(); } elsif ($chars[$c] eq "(") { $c++; skip_parent(); } elsif ($chars[$c] eq "[") { $c++; skip_bracket(); } $c++; } $l++; return 0 if (!setup_line(0)); } return 0; } sub skip_string() { my $backslash; while (1) { while ($c<$len) { print "skip_string: $c -> '$chars[$c]'\n" if ($verbose); if ($chars[$c] eq "\"") { if (!$backslash) { print "skip_string returns 1\n" if ($verbose); return 1; } $backslash=undef; } elsif ($chars[$c] eq "\\") { $backslash=($backslash?undef:1); } else { $backslash=undef; } $c++; } $l++; return 0 if (!setup_line(0)); } return 0; } sub skip_arg1() { while (1) { while ($c<$len) { print "skip_arg1: $c -> '$chars[$c]'\n" if ($verbose); if ($chars[$c] eq ",") { print "skip_arg1 returns 1\n" if ($verbose); return 1; } elsif ($chars[$c] eq "\"") { $c++; skip_string(); } elsif ($chars[$c] eq "(") { $c++; skip_parent(); } elsif ($chars[$c] eq "[") { $c++; skip_bracket(); } $c++; } $l++; return 0 if (!setup_line(0)); } return 0; } sub get_quote() { while (1) { while ($c<$len) { print "get_quote: $c -> '$chars[$c]'\n" if ($verbose); if ($chars[$c] eq "\"") { print "get_quote returns 1\n" if ($verbose); return 1; } elsif ($chars[$c] !~ /(\s|\n)/) { return 0; } $c++; } $l++; return 0 if (!setup_line(0)); } return 0; } sub fix_ok($) { # Setup setup_line($_[0]); # Locate the format string return undef if (!skip_arg1()); $c++; return undef if (!get_quote()); $c++; return undef if (!skip_string()); # Check and modify if ($c>=2 and ($chars[$c-2] ne "\\" or $chars[$c-1] ne "n")) { return substr($file[$l],0,$c) . "\\n" . substr($file[$l],$c); } return undef; } sub fix_file { my $c_file = $_[0]; open(FILE_HANDLE, "<$c_file") or die("Error opening file $c_file\n"); @file = <FILE_HANDLE>; close(FILE_HANDLE); #add a new line to the end of any ok calls we find my $modified; $l=0; while ($l<@file) { if ($file[$l] =~ /^(.*\bok\s*\()/) { my $res=fix_ok(length($1)); if (defined $res and $res ne $file[$l]) { print "\n$file[$l]$res" if ($verbose); $file[$l]=$res; $modified=1; } } $l++; } if ($modified) { open(FILE_HANDLE, ">$c_file"); print FILE_HANDLE @file; close(FILE_HANDLE); } } sub do_current_dir { my $i = 0; #get the current directory's listing opendir(DIR_HANDLE, ".") or die("Error opening .\n"); my @dir_listing = grep { !/^\.\.?/ } readdir(DIR_HANDLE); closedir(DIR_HANDLE); #for each file in the directory while($dir_listing[$i]) { #if a directory is found then do that one too if(-d $dir_listing[$i]) { chdir $dir_listing[$i]; do_current_dir(); chdir ".."; } #if it's a c file then fix the calls to ok if ($dir_listing[$i] =~ /\.c$/) { fix_file($dir_listing[$i]); } $i++; } } do_current_dir();