Generate test methods depending on the number of arguments.

This commit is contained in:
Felipe Sere
2016-03-18 12:46:13 +00:00
parent 4897527dab
commit 023bb62e01

View File

@@ -1,10 +1,12 @@
defmodule Koans do
defmacro koan(name, body) do
compiled_name = String.to_atom(name)
expanded_answers = expand(ASTMangler.count(body))
mangled_body = ASTMangler.expand(body, expanded_answers)
number_of_args = ASTMangler.count(body)
quote do
@koans unquote(compiled_name)
generate_test_method(unquote(compiled_name), unquote(number_of_args), unquote(body))
def unquote(compiled_name)() do
try do
unquote(body)
@@ -13,17 +15,34 @@ defmodule Koans do
e in _ -> e
end
end
end
end
def unquote(compiled_name)(answer) when is_list(answer) do
converted = List.to_tuple(answer)
unquote(mangled_body)
defmacro generate_test_method(_name, 0, _body), do: false
defmacro generate_test_method(name, 1, body) do
single_var = ASTMangler.expand(body, Macro.var(:answer, Koans))
quote do
def unquote(name)(answer) do
converted = {answer}
unquote(single_var)
:ok
end
end
end
defmacro generate_test_method(name, number_of_args, body) do
answer_placeholders = expand(number_of_args)
multi_var = ASTMangler.expand(body, answer_placeholders)
quote do
def unquote(name)({:multiple, answers}) do
converted = List.to_tuple(answers)
unquote(multi_var)
:ok
end
end
end
def expand(amount) do
Enum.map(0..amount, fn (idx) -> {:elem, [context: Koans, import: Kernel], [{:converted, [], Koans}, idx]} end)
Enum.map(0..amount, fn (idx) -> quote do: elem(converted, unquote(idx)) end)
end
defmacro __using__(_opts) do