71 lines
1.4 KiB
Elixir
71 lines
1.4 KiB
Elixir
defmodule BlankAssertions do
|
|
require ExUnit.Assertions
|
|
|
|
defmacro assert(expr) do
|
|
if contains_blank?(expr) do
|
|
code = Macro.escape(expr)
|
|
quote do
|
|
raise ExUnit.AssertionError, expr: unquote(code)
|
|
end
|
|
else
|
|
quote do
|
|
ExUnit.Assertions.assert(unquote(expr))
|
|
end
|
|
end
|
|
end
|
|
|
|
defmacro refute(expr) do
|
|
if contains_blank?(expr) do
|
|
code = Macro.escape(expr)
|
|
quote do
|
|
raise ExUnit.AssertionError, expr: unquote(code)
|
|
end
|
|
else
|
|
quote do
|
|
ExUnit.Assertions.refute(unquote(expr))
|
|
end
|
|
end
|
|
end
|
|
|
|
def assert_receive(expr) do
|
|
if expr == :__ do
|
|
raise ExUnit.AssertionError, expr: expr
|
|
else
|
|
receive do
|
|
^expr -> true
|
|
after
|
|
100 -> flunk("No message matching #{expr} found in mailbox")
|
|
end
|
|
end
|
|
end
|
|
|
|
def assert(value, opts) do
|
|
ExUnit.Assertions.assert(value, opts)
|
|
end
|
|
|
|
def refute(value, opts) do
|
|
ExUnit.Assertions.refute(value, opts)
|
|
end
|
|
|
|
def flunk(message \\ "Flunked!") do
|
|
ExUnit.Assertions.flunk(message)
|
|
end
|
|
|
|
defp contains_blank?(expr) do
|
|
{_, blank} = Macro.prewalk(expr, false, &blank?/2)
|
|
blank
|
|
end
|
|
|
|
defp blank?(node, true) do
|
|
{node, true}
|
|
end
|
|
|
|
defp blank?({expr, _, _} = node, _acc) do
|
|
{node, expr == :__}
|
|
end
|
|
|
|
defp blank?(expr, _acc) do
|
|
{expr, expr == :__}
|
|
end
|
|
end
|