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

40
lib/display.ex Normal file
View File

@@ -0,0 +1,40 @@
defmodule Display do
alias IO.ANSI
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 considering(module) do
IO.puts("Considering #{display_module(module)}...")
end
def before_run do
IO.puts("")
IO.puts("")
end
defp line_number({_, [line: line], _}) do
line
end
defp format_red(str) do
Enum.join([ANSI.red, str, ANSI.reset], "")
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

View File

@@ -1,6 +1,4 @@
defmodule Runner do defmodule Runner do
alias IO.ANSI
@modules [ @modules [
Equalities, Equalities,
Lists Lists
@@ -11,31 +9,24 @@ defmodule Runner do
end end
def run(start_module) do def run(start_module) do
IO.puts("") Display.before_run
IO.puts("")
start_idx = Enum.find_index(@modules, &(&1 == start_module)) start_idx = Enum.find_index(@modules, &(&1 == start_module))
Enum.drop(@modules, start_idx) Enum.drop(@modules, start_idx)
|> Enum.take_while(fn(mod) -> |> Enum.take_while(fn(mod) ->
run_module(mod) == :passed run_module(mod) == :passed
end) end)
IO.puts("")
end end
def run_module(module) do def run_module(module) do
IO.puts("Considering #{display_module(module)}...") Display.considering(module)
functions = module.__info__(:functions) koans = extract_koans_from(module)
koans = Enum.map(functions, fn({name, _arity}) -> name end)
|> Enum.filter(&koan?/1)
passed = Enum.take_while(koans, fn(name) -> passed = Enum.take_while(koans, fn(name) ->
run_koan(module, name) == :passed run_koan(module, name) == :passed
end) end)
if Enum.count(koans) == Enum.count(passed) do if Enum.count(koans) == Enum.count(passed) do
:passed :passed
else else
@@ -47,40 +38,18 @@ defmodule Runner do
case apply(module, name, []) do case apply(module, name, []) do
:ok -> :passed :ok -> :passed
error -> error ->
show_failure(error, module, name) Display.show_failure(error, module, name)
:failed :failed
end end
end end
def show_failure(%{expr: expr}, module, name) do defp extract_koans_from(module) do
source = module.__info__(:compile) module.__info__(:functions)
|> Dict.get(:source) |> Enum.map(fn({name, _arity}) -> name end)
|> Path.relative_to(File.cwd!) |> Enum.filter(&koan?/1)
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], "")
end end
defp koan?(fun_name) do defp koan?(fun_name) do
String.starts_with?(to_string(fun_name), "koan: ") String.starts_with?(to_string(fun_name), "koan: ")
end 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 end