Skip to content

Commit 3fff57d

Browse files
committed
Merge pull request #3713 from lexmag/print-pinned-assertion
Display pinned vars in the receive assertions
2 parents 6ca584b + 4062277 commit 3fff57d

File tree

2 files changed

+53
-13
lines changed

2 files changed

+53
-13
lines changed

lib/ex_unit/lib/ex_unit/assertions.ex

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,13 @@ defmodule ExUnit.Assertions do
306306

307307
defp do_assert_receive(expected, timeout, message) do
308308
binary = Macro.to_string(expected)
309+
{_, pins} =
310+
Macro.prewalk(expected, [], fn
311+
{:^, _, [var]} = form, acc ->
312+
{form, [var | acc]}
313+
form, acc ->
314+
{form, acc}
315+
end)
309316

310317
pattern =
311318
case expected do
@@ -322,8 +329,8 @@ defmodule ExUnit.Assertions do
322329
received
323330
after
324331
timeout ->
325-
message = unquote(message) || "No message matching #{unquote(binary)} after #{timeout}ms"
326-
flunk(message <> ExUnit.Assertions.__mailbox__(self()))
332+
message = unquote(message) || "No message matching #{unquote(binary)} after #{timeout}ms."
333+
flunk(message <> unquote(pinned_vars(pins)) <> ExUnit.Assertions.__mailbox__(self()))
327334
end
328335
end
329336

@@ -339,17 +346,32 @@ defmodule ExUnit.Assertions do
339346
def __mailbox__(pid) do
340347
{:messages, messages} = Process.info(pid, :messages)
341348
length = length(messages)
342-
mailbox = Enum.take(messages, @max_mailbox_length) |> Enum.map_join("\n", &inspect/1)
343-
mailbox_message(length, mailbox)
349+
indent = "\n "
350+
mailbox = Enum.take(messages, @max_mailbox_length) |> Enum.map_join(indent, &inspect/1)
351+
mailbox_message(length, indent <> mailbox)
344352
end
345353

346-
defp mailbox_message(0, _mailbox), do: ". The process mailbox is empty."
354+
defp pinned_vars([]), do: ""
355+
defp pinned_vars(pins) do
356+
content = Enum.map(pins, fn(var) ->
357+
binary = Macro.to_string(var)
358+
quote do
359+
"\n " <> unquote(binary) <> " = " <> inspect(unquote(var))
360+
end
361+
end)
362+
363+
quote do
364+
"\nThe following variables were pinned:" <> unquote_splicing(content)
365+
end
366+
end
367+
368+
defp mailbox_message(0, _mailbox), do: "\nThe process mailbox is empty."
347369
defp mailbox_message(length, mailbox) when length > 10 do
348-
". Process mailbox:\n" <> mailbox
370+
"\nProcess mailbox:" <> mailbox
349371
<> "\nShowing only #{@max_mailbox_length} of #{length} messages."
350372
end
351373
defp mailbox_message(_length, mailbox) do
352-
". Process mailbox:\n" <> mailbox
374+
"\nProcess mailbox:" <> mailbox
353375
end
354376

355377
@doc """

lib/ex_unit/test/ex_unit/assertions_test.exs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,27 @@ defmodule ExUnit.AssertionsTest do
112112
:hello = assert_received :hello
113113
end
114114

115+
test "assert received with pinned variable" do
116+
status = :valid
117+
send self(), {:status, :invalid}
118+
try do
119+
"This should never be tested" = assert_received {:status, ^status}
120+
rescue
121+
error in [ExUnit.AssertionError] ->
122+
"No message matching {:status, ^status} after 0ms.\n" <>
123+
"The following variables were pinned:\n" <>
124+
" status = :valid\n" <>
125+
"Process mailbox:\n" <>
126+
" {:status, :invalid}" = error.message
127+
end
128+
end
129+
115130
test "assert received when empty mailbox" do
116131
try do
117132
"This should never be tested" = assert_received :hello
118133
rescue
119134
error in [ExUnit.AssertionError] ->
120-
"No message matching :hello after 0ms. The process mailbox is empty." = error.message
135+
"No message matching :hello after 0ms.\nThe process mailbox is empty." = error.message
121136
end
122137
end
123138

@@ -127,7 +142,9 @@ defmodule ExUnit.AssertionsTest do
127142
"This should never be tested" = assert_received :hello
128143
rescue
129144
error in [ExUnit.AssertionError] ->
130-
"No message matching :hello after 0ms. Process mailbox:\n{:message, :not_expected, :at_all}" = error.message
145+
"No message matching :hello after 0ms.\n" <>
146+
"Process mailbox:\n" <>
147+
" {:message, :not_expected, :at_all}" = error.message
131148
end
132149
end
133150

@@ -137,10 +154,11 @@ defmodule ExUnit.AssertionsTest do
137154
"This should never be tested" = assert_received x when x == :hello
138155
rescue
139156
error in [ExUnit.AssertionError] ->
140-
"No message matching x when x == :hello after 0ms. Process mailbox:\n" <>
141-
"{:message, 1}\n{:message, 2}\n{:message, 3}\n{:message, 4}\n" <>
142-
"{:message, 5}\n{:message, 6}\n{:message, 7}\n{:message, 8}\n" <>
143-
"{:message, 9}\n{:message, 10}\nShowing only 10 of 11 messages." = error.message
157+
"No message matching x when x == :hello after 0ms.\nProcess mailbox:" <>
158+
"\n {:message, 1}\n {:message, 2}\n {:message, 3}" <>
159+
"\n {:message, 4}\n {:message, 5}\n {:message, 6}" <>
160+
"\n {:message, 7}\n {:message, 8}\n {:message, 9}" <>
161+
"\n {:message, 10}\nShowing only 10 of 11 messages." = error.message
144162
end
145163
end
146164

0 commit comments

Comments
 (0)