Files
elixir-koans/lib/blank_assertions.ex
2016-03-17 16:47:15 +00:00

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