On Thursday, 21 April 2016 at 19:38:21 UTC, Nordlöw wrote:
On Thursday, 21 April 2016 at 12:35:42 UTC, Anonymouse wrote:
Then dmd -unittest -version=TestDeps if you want them run.
This doesn't make things easier. I want to disable the builtin
unittests of the modules I've imported. This requires me to add
a
version(test_MODULE) unittest
in each module named MODULE.
This is really inconvenient.
You could anotate your user/top level tests and select only those
with __traits(getUnittest,...) and hasUDA(). Unfortunately it
seems that there's a flaw because in a program all the tests will
be automatically executed once then again those that are anotated.
---
#!runnable-flags: -unittest
module m;
import std.stdio;
enum USERTEST;
@USERTEST unittest // exeuted twice
{
writeln("bang");
}
unittest // executed once
{
writeln("bing");
}
void main(string[] args)
{
import std.traits;
foreach(t; __traits(getUnitTests, m))
{
static if (hasUDA!(t, USERTEST))
t();
}
}
---
But...
A solution that would work for both a library and a program is
this:
---
module m;
import std.stdio;
enum USERTEST;
@USERTEST void test0()
{
writeln("bing");
}
@USERTEST void test1()
{
writeln("bang");
}
unittest
{
// not even compiled
}
void runUserTests(Modules...)()
{
import std.traits;
static if (Modules.length > 1)
runModuleTests!(Modules[1..$]);
else static if (Modules.length == 1)
{
foreach(member; __traits(allMembers, Modules[0]))
foreach(o; __traits(getOverloads, Modules[0], member))
static if (hasUDA!(o, USERTEST) &&
(Parameters!o).length == 0)
o();
}
}
void main()
{
runUserTests!m;
}
---
I think a DMD option should be added to allow the tests to be
compiled but never called, something like -runTests. Because the
first solution is much more attractive.