From c7c2fbcdff0dc3f1e91c12b5ef19b3efb7f45a46 Mon Sep 17 00:00:00 2001 From: Jay Hayes Date: Mon, 2 May 2016 20:45:03 -0500 Subject: [PATCH] Auto-pin variables when replacing blanks in assert_receive --- lib/blanks.ex | 15 +++++++++++++++ lib/koans/10_processes.ex | 12 ++++++------ test/blanks_test.exs | 10 ++++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/lib/blanks.ex b/lib/blanks.ex index 3ce4569..8838652 100644 --- a/lib/blanks.ex +++ b/lib/blanks.ex @@ -7,10 +7,25 @@ defmodule Blanks do |> elem(0) end + defp pre({:assert_receive, _, args} = node, replacements) do + {args, replacements} = Macro.prewalk(args, replacements, &pre_pin/2) + {put_elem(node, 2, args), replacements} + end defp pre(:___, [first | remainder]), do: {first, remainder} defp pre({:___, _, _}, [first | remainder]), do: {first, remainder} defp pre(node, acc), do: {node, acc} + defp pre_pin(:___, [first | remainder]), do: {pin(first), remainder} + defp pre_pin({:___, _, _}, [first | remainder]), do: {pin(first), remainder} + defp pre_pin(node, acc), do: {node, acc} + + defp pin(var) when is_tuple(var) do + quote do + ^unquote(var) + end + end + defp pin(var), do: var + def count(ast) do ast |> Macro.prewalk(0, &count/2) diff --git a/lib/koans/10_processes.ex b/lib/koans/10_processes.ex index 6084ece..321979b 100644 --- a/lib/koans/10_processes.ex +++ b/lib/koans/10_processes.ex @@ -13,7 +13,7 @@ defmodule Processes do koan "You can send messages to any process you want" do send self(), "hola!" - assert_receive ^___ + assert_receive ___ end koan "A common pattern is to include the sender in the message" do @@ -24,7 +24,7 @@ defmodule Processes do end) send pid, {:hello, self()} - assert_receive ^___ + assert_receive ___ end koan "Waiting for a message can get boring" do @@ -35,7 +35,7 @@ defmodule Processes do end end) - assert_receive ^___ + assert_receive ___ end koan "Killing a process will terminate it" do @@ -64,7 +64,7 @@ defmodule Processes do wait() Process.exit(pid, :random_reason) - assert_receive ^___ + assert_receive ___ end koan "Trying to quit normally has no effect" do @@ -96,7 +96,7 @@ defmodule Processes do end end) - assert_receive ^___ + assert_receive ___ end koan "If you monitor your children, you'll be automatically informed for their depature" do @@ -108,7 +108,7 @@ defmodule Processes do end end) - assert_receive ^___ + assert_receive ___ end def wait do diff --git a/test/blanks_test.exs b/test/blanks_test.exs index 4449a93..e615f17 100644 --- a/test/blanks_test.exs +++ b/test/blanks_test.exs @@ -24,6 +24,16 @@ defmodule BlanksTest do assert Blanks.replace(ast, [true, false]) == quote(do: assert true == false) end + test "pins variables in assert_receive replacement" do + ast = quote do: assert_receive ___ + assert Blanks.replace(ast, Macro.var(:answer, __MODULE__)) == quote(do: assert_receive ^answer) + end + + test "does not pin values in assert_receive replacement" do + ast = quote do: assert_receive ___ + assert Blanks.replace(ast, :lolwat) == quote(do: assert_receive :lolwat) + end + test "counts simple blanks" do ast = quote do: 1 + ___