From 6f5c00d7195111e13bdec9a95fb94b14ae04b0ff Mon Sep 17 00:00:00 2001 From: Uku Taht Date: Fri, 8 Jan 2016 16:28:45 +0000 Subject: [PATCH] Add support for blanks in assertions --- lib/blank_assertions.ex | 48 +++++++++++++++++++++++++++++++++++++++++ lib/koans.ex | 3 ++- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 lib/blank_assertions.ex diff --git a/lib/blank_assertions.ex b/lib/blank_assertions.ex new file mode 100644 index 0000000..1e1e42f --- /dev/null +++ b/lib/blank_assertions.ex @@ -0,0 +1,48 @@ +defmodule BlankAssertions do + defmacro assert(expr) do + if contains_blank?(expr) do + code = Macro.escape(expr) + quote do + raise ExUnit.AssertionError, expr: unquote(code) + end + else + quote do + ExUnit.Assertions.assert(unquote(expr)) + end + end + end + + defmacro refute(expr) do + if contains_blank?(expr) do + code = Macro.escape(expr) + quote do + raise ExUnit.AssertionError, expr: unquote(code) + end + else + quote do + ExUnit.Assertions.refute(unquote(expr)) + end + end + end + + def assert(value, opts) do + ExUnit.Assertions.assert(value, opts) + end + + defp contains_blank?(expr) do + {_, blank} = Macro.prewalk(expr, false, &blank?/2) + blank + end + + defp blank?(node, true) do + {node, true} + end + + defp blank?({expr, _, _} = node, _acc) do + {node, expr == :__} + end + + defp blank?(expr, _acc) do + {expr, expr == :__} + end +end diff --git a/lib/koans.ex b/lib/koans.ex index dad845a..674cdee 100644 --- a/lib/koans.ex +++ b/lib/koans.ex @@ -18,7 +18,8 @@ defmodule Koans do defmacro __using__(_) do quote do import Koans - import ExUnit.Assertions + require ExUnit.Assertions + import BlankAssertions end end