-
Notifications
You must be signed in to change notification settings - Fork 1
/
proper.ex
42 lines (37 loc) · 1.01 KB
/
proper.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
defmodule Mix.Tasks.Proper do
use Mix.Task
def run([]) do
"test/**/*_prop.exs"
|> Path.wildcard
|> run
end
def run(files) do
files
|> Kernel.ParallelRequire.files
|> run_properties_for_modules
|> finish
end
def run_properties_for_modules([]) do
IO.puts "There are no properties to run"
end
def run_properties_for_modules(modules) do
Enum.reduce(modules, true, fn(module, current_status) ->
module.__info__(:functions)
|> Enum.filter(&property?/1)
|> Enum.map(fn({name, 0}) ->
:proper.quickcheck(apply(module, name, []))
end)
|> determine_status(current_status)
end)
end
defp property?({name, 0}) do
name
|> Atom.to_string
|> String.starts_with?("prop_")
end
defp property?({_name, _arity}), do: false
defp determine_status(results, true), do: Enum.all?(results)
defp determine_status(_, _), do: false
defp finish(false), do: System.at_exit(fn(_) -> exit({:shutdown, 1}) end)
defp finish(_), do: :ok
end