Running all unittests in gdc

Lars Ivar Igesund larsivar at igesund.net
Tue Jul 22 10:11:54 PDT 2008


Jim Burnes wrote:

> Hi,
> 
> I'm in the middle of building a mid-size application in D and have been
> conscientious about building unittests in all of my classes.
> 
> The main() module as well as all component modules have been built with
> -funittest.   I know that unittests are run before main() starts, but my
> problem is that gdc is only running the unittests that appear in the
> main() module and not those that are linked in from supporting object
> modules.
> 
> Is there a way to enable the unittests that are linked into main()?
> 
> The crazy thing is that my main module contains no class definitions so no
> unittests are actually being run.  I verified  this in gdc by creating a
> small class definiton with built-in unittest.
> 
> I can, of course, cruft up a dummy "void main()" in each of the component
> modules, but that's pretty ugly.
> 
> (BTW: I've seen some of the utilities that run all unittests, but I'm
> hoping there's a better solution.)
> 
> Any help greatly appreciated.
> 
> Thanks,
> 
> Jim Burnes
> Boulder, CO

If they aren't run it is a bug somewhere. FWIW, the Tango runtime have a
hook to give you more control of the unittests you run. The following is
used to run Tango unittests (all files are built and linked in via
rebuild).

import tango.io.Stdout;
import tango.core.Runtime;

bool tangoUnitTester()
{
    uint countFailed = 0;
    uint countTotal = 1;
    Stdout ("NOTE: This is still fairly rudimentary, and will only report
the").newline;
    Stdout ("    first error per module.").newline;
    foreach ( m; ModuleInfo )  // _moduleinfo_array )
    {
        if ( m.unitTest) {
            Stdout.format ("{}. Executing unittests in '{}' ", countTotal,
m.name);
            countTotal++;
            try {
               m.unitTest();
            }
            catch (Exception e) {
                countFailed++;
                Stdout(" - Unittest failed.").newline;
                Stdout.format("   File '{}', line '{}'.", e.file,
e.line).newline;
                Stdout.format("     Message is : '{}'", e.msg).newline;
                if (e.info)
                    Stdout.format("     TraceInfo: {}",
e.info.toString).newline;
                continue;
            }
            Stdout(" - Success.").newline;
        }
    }

    Stdout.format ("{} out of {} tests failed.", countFailed, countTotal -
1).newline;
    return true;
}

static this() {
    Runtime.moduleUnitTester( &tangoUnitTester );
}

void main() {}


-- 
Lars Ivar Igesund
blog at http://larsivi.net
DSource, #d.tango & #D: larsivi
Dancing the Tango



More information about the Digitalmars-d mailing list