On Friday, 31 July 2015 at 00:07:43 UTC, Idan Arye wrote:
Thoughts?
Some unit test helpers for this sort of thing might be nice, but
I don't think that it really buys us much with this particular
case. You could just as easily do
unittest
{
foreach(T; TypeTuple!(ubyte, byte, ushort, short, uint, int,
ulong, long))
static assert(is(typeof(foo(T.init)));
}
and the code is basically as long as is with assertCompilesWith -
shorter even. The above example is longer due to not using an
alias for the integral types like you did, but if that same alias
were used, then it becomes
unittest
{
foreach(T; IntegerTypes)
static assert(is(typeof(foo(T.init)));
}
which isn't all that different than
unittest
{
assertCompilesWith!(IntegerTypes, (x) {
foo(x);
});
}
but it doesn't require a lambda or creating any helpers, and it
cuts down on the number of unit testing functions that are
templated (it can cost a lot in terms of compilation time and
memory, if you use a lot of templates as helpers for unit tests).
In addition, in most cases, I don't see much point in simply
testing that the templated function or type compiles with various
types. It's generally far better to do something like
foreach(T; IntegerTypes)
{
// Tests which actually test foo with T rather than just that
it compiles
}
And in that case, explicitly testing compilation is unnecessary.
You're already testing far more than that.
So, I applaud the attitude and motivation behind your suggestion,
but this particular helper doesn't really help IMHO.
- Jonathan M Davis