3 ms·
Elixir’s testing library uses meta programming to show the code that fails and what the values were at both sides of a comparison. IE a = 1; b = 2 ass
by tobyhinloopen 4y ago
Elixir’s testing library uses meta programming to show the code that fails and what the values were at both sides of a comparison.
IE
a = 1; b = 2
assert a == b
Will fail with error like:
Assertion failed,
a == b
Left is 1
Right is 2
So you don’t have a bunch of assert-functions; you just assert anything and it will spit out a decent error.
- elcritch 4y agoYes! That feature is great. I got used to it in Elixir and Nim provides it as well. It's one of those little things that makes programming nicer.
- masklinn 4y agoWith how old pytest is, I assume that's where they got it from. Does it perform recursive value printing, or bespoke comparisons? e.g. in pytest it won't just print out the values of "a" and "b", it will recursively document intermediate values until it's reached the toplevel expression: assert f() == g() assert 42 == 43 where 42 = <function TestFailing.test_simple.<locals>.f at 0xdeadbeef0002>() and 43 = <function TestFailing.test_simple.<locals>.g at 0xdeadbeef0003>() and it's possible to customise the report so you can report as a diff: assert "foo 1 bar" == "foo 2 bar" - foo 2 bar ? ^ + foo 1 bar ? ^
- cpurdy 4y agoThis is one that I like a lot. Years ago (1997 timeframe) I had implemented it in a Java compiler, and a few years later in a Java library (https://github.com/oracle/coherence/blob/4e6e343e1ffd9bbfea3fb48f2e53f2a990be5731/prj/coherence-core/src/main/java/com/oracle/coherence/common/base/StackTrace.java#L337 https://github.com/oracle/coherence/blob/4e6e343e1ffd9bbfea3...) that would create an exception on the assertion failure and parse its stack trace to find the source code file name, and read it to find the text of the assertion that failed, etc. so it could build the error message ... In Ecstasy, we built the support directly into the compiler again: val a = 1; val b = 2; assert a == b; Produces: IllegalState: a == b, a=1, b=2
- still_grokking 4y agoScalaTest does the same.