diff --git a/lib/koans.ex b/lib/koans.ex index 9331728..32fdb4d 100644 --- a/lib/koans.ex +++ b/lib/koans.ex @@ -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