Unit tests in D
bearophile
bearophileHUGS at lycos.com
Wed May 5 02:10:05 PDT 2010
>(it reports only the first failed assert for each unit test).<
I was wrong (or the behaviour on this is mutable).
Michel Fortin:
> Your 'throws' template seems good. Should create std.testing and
> include it there.
> Also, perhaps it'd work to use a double-template for this:
> template throws(Exceptions...) {
> void throws(TCallable, string filename=__FILE__, int line=__LINE__)
Yes, thank you, with this suggestion of yours it works in D2 too:
class FooException : Exception { this(string msg) { super(msg); } }
class OtherException : Exception { this(string msg) { super(msg); } }
int sqr(int x) {
if (x < 0)
throw new FooException("");
return x * 2;
}
template throws(Exceptions...) {
bool throws(TCallable)(lazy TCallable callable) {
try
callable();
catch (Exception e) {
/*static*/ foreach (Exc; Exceptions)
if (cast(Exc)e !is null)
return true;
return false;
}
return !Exceptions.length;
}
}
unittest {
assert(throws!(OtherException)(sqr(-5)));
assert(throws!(OtherException)( sqr(-5) ));
}
void main() {}
But I have to wrap it into another assert like that if I want it to behave as an assert inside the unittests. With a bit more compiler support it can be possible to write that in a library.
While the static throws can require more compiler support.
Bye,
bearophile
More information about the Digitalmars-d
mailing list