53 lines
1.5 KiB
Elixir
53 lines
1.5 KiB
Elixir
|
defmodule MessageImplPredicateTestHelper do
|
||
|
defmacro test_message_impl_predicates(message, defaults \\ []) do
|
||
|
:functions
|
||
|
|> MidiProto.Message.__protocol__()
|
||
|
|> Enum.filter(fn
|
||
|
{name, 1} ->
|
||
|
name
|
||
|
|> Atom.to_string()
|
||
|
|> String.ends_with?("?")
|
||
|
|
||
|
_ ->
|
||
|
false
|
||
|
end)
|
||
|
|> Enum.map(fn {function_name, _} ->
|
||
|
predicate_name =
|
||
|
function_name
|
||
|
|> Atom.to_string()
|
||
|
|> String.trim_trailing("?")
|
||
|
|> String.to_atom()
|
||
|
|
||
|
should_be_true = Keyword.get(defaults, predicate_name, false)
|
||
|
|
||
|
if should_be_true do
|
||
|
quote do
|
||
|
try do
|
||
|
describe "Message.#{unquote(function_name)}/1" do
|
||
|
test "it is true" do
|
||
|
assert apply(MidiProto.Message, unquote(function_name), [unquote(message)]),
|
||
|
"Expected `Message.#{unquote(function_name)}/1` to be true"
|
||
|
end
|
||
|
end
|
||
|
rescue
|
||
|
ExUnit.DuplicateDescribeError -> nil
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
quote do
|
||
|
try do
|
||
|
describe "Message.#{unquote(function_name)}/1" do
|
||
|
test "it is false" do
|
||
|
refute apply(MidiProto.Message, unquote(function_name), [unquote(message)]),
|
||
|
"Expected `Message.#{unquote(function_name)}/1` to be false"
|
||
|
end
|
||
|
end
|
||
|
rescue
|
||
|
ExUnit.DuplicateDescribeError -> nil
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
end
|