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