Unittesting libraries

Jonathan M Davis jmdavisProg at gmx.com
Wed Aug 10 03:11:59 PDT 2011


On Wednesday, August 10, 2011 12:01:00 simendsjo wrote:
> On 10.08.2011 09:29, Jonathan M Davis wrote:
> > On Wednesday, August 10, 2011 09:11:53 simendsjo wrote:
> >> On 08.08.2011 14:11, simendsjo wrote:
> >>> Is it possible to run unittests in libraries?
> >>> The following doesn't work:
> >>> 
> >>> l.d
> >>> ===
> >>> module l;
> >>> import std.stdio;
> >>> int f() { return 1; } // just to make sure it's actually compiled in
> >>> unittest {
> >>> writeln("Unittest from lib");
> >>> assert(false);
> >>> }
> >>> 
> >>> 
> >>> t.d
> >>> ===
> >>> import l;
> >>> import std.stdio;
> >>> void main() {
> >>> writeln(f());
> >>> }
> >>> 
> >>>   >  dmd -unittest -lib l
> >>>   >  dmd -unittest t l.lib
> >>>   >  t.exe
> >>> 
> >>> 1
> >> 
> >> Anyone? Now I have to compile every source file from the library into
> >> t.d instead of compiling in the library.
> > 
> > I don't know exactly what the deal with unit tests and libraries is, but
> > it wouldn't surprise me at all if you have to compile a module into a
> > binary to run its unit tests. Phobos (on Linux at least) is set up to
> > build each module separately to run its unit tests. I can see why you'd
> > want to do this, so it may be worth creating a bug report or
> > enhancement request for it, but I have no idea whether it's supposed to
> > work or not.
> > 
> > - Jonathan M Davis
> 
> I haven't tested, but does this mean invariants and contracts is not run
> too? In that case I think it should be fixed (if I'm not doing anything
> wrong).

They definitely should be. There's a big difference between running the unit 
tests and compiling in invariants and contracts. It could be that having built 
your library with -unittest, all of the unit tests are compiled in. They're 
just not run, because that requires some instrumenting from the runtime to run 
them before main. If it doesn't put the unit tests from the library in the 
list, then they won't be run. However, invariants and contracts should be 
compiled directly into the code such that there should be no need for separate 
code to call them like there is with the unit tests.

Regardless, not running the unit tests from a library may be by design, but it 
is _definitely_ a bug if the invariants or contracts aren't run. But since 
people have hit invariants in Phobos when running their own programs (though 
that requires Phobos to have been compiled without -release), I'd be very 
surprised if it invariants or contracts were broken with regard to libraries.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list