>(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

Reply via email to