version(assert) and Phobos release unittest build
Jonathan M Davis
jmdavisProg at gmx.com
Thu Nov 28 11:09:31 PST 2013
On Thursday, November 28, 2013 18:28:55 Gary Willoughby wrote:
> On Thursday, 28 November 2013 at 17:22:20 UTC, Dicebot wrote:
> > I don't know what is the proper way to handle this but current
> > situation is clearly worth a bugzilla entry. It is just weird.
>
> Maybe this is intended behaviour to handle testing AssertErrors
> in unit tests? How else could you test them.
I wouldn't. I honestly don't think that testing contracts is an appropriate
thing to do, much as I can see why you might want to do it. If you're passing
something to a functon which violates that function's contract, then you're
violating its contract, which is technically undefined behavior as far as DbC
is concerned.
I think that testing that the correct exception is being thrown from a
function makes sense, because in that case, it's something that the function
is suppose to handle. But per DbC, a function should never have to deal with
input which violates its contract and it's undefined behavior if it's given
such input. So, you really need to make sure that you never give it incorrect
input. The assertions in an in block are just insurance so that you can catch
bugs when you screw it up.
But if you're absolutely determined to validate your contracts, I'd suggest
simply creating another function which does the validation and then calling
that from within the in block. e.g.
bool validateFoo(int i, int j)
{
return i <= j;
}
auto foo(int i, int j)
in
{
asser(validateFoo(i, j));
}
body
{
...
}
And using a validator function has the advantage that you can make it
available to callers of your function if you want to so that they can validate
the input.
Or if you want to, validateFoo could be purely for the contract and just
assert rather than putting the assertion in the in block (though that's a
_lot_ less efficient when unit testing, as thrown exceptions are very, very
slow). But either way, by putting the actual validation code outside of the in
block, you can test the validation code.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list