On Friday, 31 July 2015 at 00:30:23 UTC, Jonathan M Davis wrote:
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);
    });
}

The resulting compilation errors are extremely different. With your method we get:

/d391/f994.d(31): Error: static assert (is(typeof(__error))) is false

which doesn't tell us what the problem is. With my method we get:

/d433/f500.d(25): Error: cannot implicitly convert expression (x) of type ulong to int /d433/f500.d(31): Error: template instance f500.foo!ulong error instantiating

And yes, a lot of "static stack trace" after that, but these too lines tells us what the problem is and which template parameters caused it.

Of course, if you just ran the function inside the foreach loop you'd get nice error messages as well - but then you'd have to write tests that actually run. Which is easy for numbers, because they are all the same type of data with different sizes, but can get tricky when you have more complex types, that differ more in their behavior.

Reply via email to