On Friday, 31 July 2015 at 00:54:30 UTC, Idan Arye wrote:
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.

True enough, but you can simply add T.stringof to the static assertion, and you'll know which instantiation is failing. And maybe what you're suggesting is worth having, but you can get pretty much the same thing easily without creating a template to do the test for you.

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.

Yes. It's generally hard to write tests which work with a variety of template instantiations, but the point is that knowing that the template instantiates with a particular type really doesn't tell you much. If you actually want to be testing the template with those types, you should be writing tests with those types whether you can templatize the tests or whether each instantiation needs to be tested separately. That being the case, I don't think that unit tests should normally be testing explicitly that a template instantiates with a type. Doing that is so insufficient that there isn't much point.

- Jonathan M Davis

Reply via email to