Basically NUnit, xUnit, MbUnit, MsTest and the like have methods similar to the following:
Assert.IsGreater(a,b)
//or, a little more discoverable
Assert.That(a, Is.GreaterThan(b))
However, there are a limited number of such comparison operators built-in; and they duplicate the languages operators needlessly. When I want anything even slightly complex, such as…
Assert.That(a.SequenceEquals(b))
I’m often either left digging through the manual to find the equivalent of the expression in NUnit-speak, or am forced to fall-back to plain boolean assertions with less helpful error messages.
C#, however, integrates well with arbitrary Expressions – so it should be possible to have a method with the following signature:
void That(Expression<Func<bool>> expr);
Such a method could be used to both execute the test (i.e. validate the assertion) and to also provide less-opaque diagnostics in case of test failure; after all, an expression can be rendered to pseudo-code to indicate which expression failed; and with some effort, you could even evaluate failing expressions intelligently to give some clue of the value of subexpressions.
For example:
Assert.That(()=> a == b);//could inspect expression and print a and b
Assert.That(()=> a < b && b < c);
//could mention the values of "a<b" and "b<c" and/or list the values of a, b, and c.
At a minimum, it would make the use of a parallel language for expressions unnecessary, and in some cases it might make failure messages more useful.
Does such a thing exist?
Edit: After trying (and liking!) Power Assert, I ended up reimplementing it to address several limitations. My variant of this is published as ExpressionToCode; see my answer below for a list of improvements.
(Original Poster here)
I love PowerAssert.NET‘s simple syntax and messages, but the C# it produces has many issues. In particular, it doesn’t support several expression features, and it doesn’t add parentheses where required by operator precedence/associativity. After fixing a few bugs (and reporting them to the author) I found it’d be simpler to fix with a different approach, and to reimplement it from scratch.
The usage is similar:
Outputs:
Improvements over PowerAssert.NET:
dict["mykey"]==3)() => x - (a - b) + x * (a + b)is correctly regenerated)1m + (decimal)Math.Sqrt(1.41))Func<int, bool>The resultant project (with unit tests) is hosted in google code under the name ExpressionToCode – I hope it’s useful to others.