regsvr32/tests: Add initial tests

Francois Gouget fgouget at free.fr
Wed Jan 13 04:18:07 CST 2016


On Wed, 13 Jan 2016, Hugh McMaster wrote:

> On Tue, 12 Jan 2016 12:58:59 +0100, Francois Gouget wrote:
> > On Tue, 12 Jan 2016, Hugh McMaster wrote:
> > [...]
> >> diff --git a/programs/regsvr32/tests/Makefile.in b/programs/regsvr32/tests/Makefile.in
> >> new file mode 100644
> >> index 0000000..61d25fe
> >> --- /dev/null
> >> +++ b/programs/regsvr32/tests/Makefile.in
> > [...]
> >> +ifneq (,$(filter crosstest mingw,$(MAKECMDGOALS) $(findstring mingw,$(CC))))
> >> +  TARGET_DLLS = $(addsuffix .dll, $(DLL_BASENAMES))
> > 
> > I believe the syntax on these last two lines is specific to GNU make 
> > which is something that Wine has tried to avoid so far.
> 
> The GNU make manual doesn't list 'filter', 'findstring' or 'addsuffix' in its comparison with BSD's (p)make,
> so I'm not sure about those functions being specific or not.

I believe a more common way to do what addsuffix does is:

TARGET_DLLS = $(DLL_BASENAMES:%=%.dll)

But there is also ifneq, it seems the syntax is different between GNU 
make and BSD make: 
https://stackoverflow.com/questions/9096018/make-gmake-compatible-if-else-statment


[...]
> My preference would be to only use mingw32, but I don't think the mingw32 package is a
> build-dependency for Wine. How likely is it that users building from source will have
> mingw32-w64 (or equivalent) installed?

MinGW is not used to compile Wine or the conformance tests. It is only 
used for cross-compiling the tests for Windows so very few Wine 
developpers will have it. More importantly Wine should not depend on it.


[...]
> The existing code embeds the test DLLs in a resource file. The difficulty is whether to build two
> resource files (one for Wine, the other for Windows), or add the resource to .PHONY and have it
> rebuilt for each target.

dlls/kernel32/tests uses the same .res file for both cases but it 
probably does not apply to your case.

Your case is probably more similar to programs/winetest and there is no 
cross-building there. Instead to build the Windows executable one has to 
have a separate tree and cross-build all of it (iirc).


[...]
> >> +#define run_test(...) run_test_(output, &r, __VA_ARGS__)
> > 
> > A macro with a variable argument list? That does not seem portable (or 
> > maybe is a> C99 feature).
> 
> It is a C99 feature. We already use it in comctl32/tests, 
> xaudio2_7/tests, the Mac driver and wine/debug.h.

I'd say the one trustworthy reference of those is wine/debug.h. Ok, so 
that's probably acceptable.

However, as far as I can tell its only purpose is to hide which 
variables are being modified by run_test_(). Furthermore it only works 
if the function using it has defined local variables with the right 
names. So all it does is obfuscate the source code making it a net 
negative. So it should go.


[...]
> >> +#define CMP(s) !strcmp(output, s)
> > 
> > This macro is totally unnecessary.
> 
> Yes, you're right. I'll define a new macro re-using the string in the ok() test.

Macros have big drawbacks: they obscure what is really happening, have 
no type checking, can have side-effects, may execute expressions in 
their parameters more than once. They should only be used when really 
needed. The case at hand can simply be done with no macro at all:

    ok(strcmp(s, "Register") == 0, "got '%s', expected 'Register'\n", output);

Now if there was really a lot of these string checks, one could argue 
for a macro of the form:

#define okString(s, e) ok(strcmp((s), (e)) == 0, "got '%s', expected '%s'\n", (s), (e))

Then you'd write:
   okString(s, "Register");

At least you could then argue that the resulting code really is shorter 
and that it does not hide which variable is compared to the expected 
value.


-- 
Francois Gouget <fgouget at free.fr>              http://fgouget.free.fr/
     The software said it requires Win95 or better, so I installed Linux.



More information about the wine-devel mailing list