Merge pull request #76 from elixirkoans/remove-blank-assertions

Remove BlankAssertions
This commit is contained in:
Felipe Seré
2016-04-24 15:14:24 +01:00
7 changed files with 70 additions and 71 deletions

View File

@@ -1,63 +0,0 @@
defmodule BlankAssertions do
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
defmacro assert_receive(expr) do
code = Macro.escape(expr)
if contains_blank?(expr) do
quote do
raise ExUnit.AssertionError, expr: {:assert_receive, [], [unquote(code)]}
end
else
quote do
receive do
unquote(expr) -> :ok
after
100 -> {:messages, messages} = Process.info(self(), :messages)
mailbox = Enum.map_join(messages, ", ", &inspect/1)
message = inspect(unquote(expr))
ExUnit.Assertions.flunk("Message #{message} not found in process mailbox. Mailbox contains: [#{mailbox}]")
end
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
Blanks.count(expr) > 0
end
end

View File

@@ -20,4 +20,20 @@ defmodule Blanks do
defp count(:___, acc), do: {node, acc+1}
defp count({:___, _, _}, acc), do: {node, acc+1}
defp count(node, acc), do: {node, acc}
def replace_line([do: ast], replacement_fn), do: [do: replace_line(ast, replacement_fn)]
def replace_line({:__block__, meta, lines}, replacement_fn) do
replaced_lines = Enum.map(lines, fn(line) ->
replace_line(line, replacement_fn)
end)
{:__block__, meta, replaced_lines}
end
def replace_line(line, replacement_fn) do
if Blanks.count(line) > 0 do
replacement_fn.(line)
else
line
end
end
end

View File

@@ -52,13 +52,9 @@ defmodule Display do
end
defp format_failure(%{error: %ExUnit.AssertionError{expr: expr}, file: file, line: line}) do
format_assertion_error(expr, file, line)
end
defp format_assertion_error(error, file, line) do
"""
#{format_cyan("Assertion failed in #{file}:#{line}")}
#{format_red(Macro.to_string(error))}
#{format_red(Macro.to_string(expr))}
"""
end

View File

@@ -7,8 +7,11 @@ defmodule Koans do
if not valid_name(name) do
raise "Name does not start with a capital ltter: #{name}"
end
compiled_name = String.to_atom(name)
number_of_args = Blanks.count(body)
compiled_body = Blanks.replace_line(body, &blank_line_replacement/1)
quote do
@koans unquote(compiled_name)
@@ -16,7 +19,7 @@ defmodule Koans do
def unquote(compiled_name)() do
try do
unquote(body)
unquote(compiled_body)
:ok
rescue
e in _ -> e
@@ -47,6 +50,16 @@ defmodule Koans do
end
end
defp blank_line_replacement({:assert, _meta, [expr]}) do
code = Macro.escape(expr)
quote do: raise ExUnit.AssertionError, expr: unquote(code)
end
defp blank_line_replacement(line) do
code = Macro.escape(line)
quote do: raise ExUnit.AssertionError, expr: unquote(code)
end
defp create_vars(amount) do
for id <- 0..amount, do: quote do: elem(converted, unquote(id))
end
@@ -57,8 +70,8 @@ defmodule Koans do
Module.register_attribute(__MODULE__, :koans, accumulate: true)
require ExUnit.Assertions
import ExUnit.Assertions
import Koans
import BlankAssertions
@before_compile Koans
end