Extract display for formatting purposes

This commit is contained in:
Uku Taht
2015-12-17 01:50:14 +00:00
parent 4b542c584b
commit f76aee3672
2 changed files with 48 additions and 39 deletions

View File

@@ -1,6 +1,4 @@
defmodule Runner do
alias IO.ANSI
@modules [
Equalities,
Lists
@@ -11,31 +9,24 @@ defmodule Runner do
end
def run(start_module) do
IO.puts("")
IO.puts("")
Display.before_run
start_idx = Enum.find_index(@modules, &(&1 == start_module))
Enum.drop(@modules, start_idx)
|> Enum.take_while(fn(mod) ->
run_module(mod) == :passed
end)
IO.puts("")
end
def run_module(module) do
IO.puts("Considering #{display_module(module)}...")
Display.considering(module)
functions = module.__info__(:functions)
koans = Enum.map(functions, fn({name, _arity}) -> name end)
|> Enum.filter(&koan?/1)
koans = extract_koans_from(module)
passed = Enum.take_while(koans, fn(name) ->
run_koan(module, name) == :passed
end)
if Enum.count(koans) == Enum.count(passed) do
:passed
else
@@ -47,40 +38,18 @@ defmodule Runner do
case apply(module, name, []) do
:ok -> :passed
error ->
show_failure(error, module, name)
Display.show_failure(error, module, name)
:failed
end
end
def show_failure(%{expr: expr}, module, name) do
source = module.__info__(:compile)
|> Dict.get(:source)
|> Path.relative_to(File.cwd!)
IO.puts("")
IO.puts("Now meditate upon #{display_module(module)}")
IO.puts("---------------------------------------")
IO.puts("Assertion failed in #{source}:#{line_number(expr)}")
IO.puts(display_koan(name))
IO.puts(format_red(Macro.to_string(expr)))
end
def line_number({_, [line: line], _}) do
line
end
def format_red(str) do
Enum.join([ANSI.red, str, ANSI.reset], "")
defp extract_koans_from(module) do
module.__info__(:functions)
|> Enum.map(fn({name, _arity}) -> name end)
|> Enum.filter(&koan?/1)
end
defp koan?(fun_name) do
String.starts_with?(to_string(fun_name), "koan: ")
end
defp display_module(module) do
Module.split(module) |> List.last
end
defp display_koan(name) do
String.replace(to_string(name), "koan: ", "")
end
end