Force koan order using macros and attributes

This commit is contained in:
Felipe Sere
2016-03-08 19:58:37 +00:00
parent 9a217b47ed
commit a85e760e54
2 changed files with 17 additions and 2 deletions

View File

@@ -3,7 +3,9 @@ defmodule Koans do
defmacro koan(name, body) do
compiled_name = :"#{prefix}#{name}"
quote do
@koans unquote(compiled_name)
def unquote(compiled_name)() do
try do
unquote(body)
@@ -17,9 +19,12 @@ defmodule Koans do
defmacro __using__(opts) do
quote do
Module.register_attribute(__MODULE__, :koans, accumulate: true)
require ExUnit.Assertions
import Koans
import BlankAssertions
@before_compile KoansBuilder
end
end
@@ -27,3 +32,14 @@ defmodule Koans do
@prefix
end
end
defmodule KoansBuilder do
defmacro __before_compile__(env) do
koans = Module.get_attribute(env.module, :koans) |> Enum.reverse
quote do
def all_koans do
unquote(koans)
end
end
end
end

View File

@@ -51,8 +51,7 @@ defmodule Runner do
end
defp extract_koans_from(module) do
module.__info__(:functions)
|> Enum.map(fn({name, _arity}) -> name end)
module.all_koans
|> Enum.filter(&koan?/1)
end