Extract display for formatting purposes
This commit is contained in:
40
lib/display.ex
Normal file
40
lib/display.ex
Normal 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
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user