v1.6.0: ExUnit assertions edition
That's right, a feature release again so soon!
Improvements
This version of Styler adds many readability improvements around ExUnit assert and refute, specifically when working with 1. negations or 2. some Enum stdlib functions.
Some of these rewrites are not semantically equivalent; for example, refute is_nil(false) will be rewritten to assert false, which will fail.
ExUnit assert/refute rewrites
Styler now inverts negated (!, not) assert/refute (eg assert !x => refute x) statements, and further inverts refute with boolean comparison operators (refute x < y => assert x >= y) because non-trivial refutes are harder to reason about [ citation needed ]. Asserting something is not nil is the same as just asserting that something, so that's gone too now.
These changes are best summarized by the following table:
| before | styled |
|---|---|
assert !x |
refute x |
assert not x |
refute x |
assert !!x |
assert x |
assert x != nil |
assert x |
assert x == nil |
no change |
assert is_nil(x) |
no change |
assert !is_nil(x) |
assert x |
assert x not in y |
refute x in y |
| refute negated | |
refute x |
no change |
refute !x |
assert x |
refute not x |
assert x |
refute x != y |
assert x == y |
refute x !== y |
assert x === y |
refute x != nil |
assert x == nil |
refute x not in y |
assert x in y |
| refute comparison | |
refute x < y |
assert x >= y |
refute x <= y |
assert x > y |
refute x > y |
assert x <= y |
refute x >= y |
assert x < y |
assert Enum.member?(y, x)->assert x in yassert Enum.find(x, y)->assert Enum.any?(x, y)(nb. not semantically equivalent in theory, but equivalent in practice)assert Enum.any?(y, & &1 == x)->assert x in yassert Enum.any?(y, fn var -> var == x end)->assert x in y
Fixes
- alias lifting: fix bug lifting in snippets with a single ast node at the root level (like a credo config file) (#240, h/t @defndaines)