Skip to content

Commit 696bad8

Browse files
committed
Emit warnings for unused match vars in assertions, closes #9787
1 parent 96c8e31 commit 696bad8

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

lib/ex_unit/lib/ex_unit/assertions.ex

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ defmodule ExUnit.Assertions do
352352
case right do
353353
unquote(left) ->
354354
unquote(check)
355-
unquote(vars)
355+
unquote(mark_as_generated(vars))
356356

357357
_ ->
358358
left = unquote(Macro.escape(left))
@@ -477,7 +477,7 @@ defmodule ExUnit.Assertions do
477477
quote do
478478
case message do
479479
unquote(pattern) ->
480-
_ = unquote(vars)
480+
_ = unquote(mark_as_generated(vars))
481481
true
482482

483483
_ ->
@@ -516,7 +516,7 @@ defmodule ExUnit.Assertions do
516516

517517
{received, unquote(vars)} =
518518
receive do
519-
unquote(pattern) -> {received, unquote(vars)}
519+
unquote(pattern) -> {received, unquote(mark_as_generated(vars))}
520520
after
521521
timeout -> flunk(unquote(failure_message))
522522
end
@@ -651,14 +651,18 @@ defmodule ExUnit.Assertions do
651651
{[expanded], acc}
652652

653653
{name, meta, context}, acc when is_atom(name) and is_atom(context) ->
654-
{:ok, [{name, [generated: true] ++ meta, context} | acc]}
654+
{:ok, [{name, meta, context} | acc]}
655655

656656
node, acc ->
657657
{node, acc}
658658
end)
659659
|> elem(1)
660660
end
661661

662+
defp mark_as_generated(vars) do
663+
for {name, meta, context} <- vars, do: {name, [generated: true] ++ meta, context }
664+
end
665+
662666
@doc false
663667
def __expand_pattern__({:when, meta, [left, right]}, caller) do
664668
left = prewalk_expand_pattern(left, Macro.Env.to_match(caller))

lib/ex_unit/test/ex_unit/assertions_test.exs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,23 @@ defmodule ExUnit.AssertionsTest do
155155
{2, 1} = assert {2, 1} = Value.tuple()
156156
end
157157

158+
test "assert match with unused var" do
159+
assert ExUnit.CaptureIO.capture_io(:stderr, fn ->
160+
Code.eval_string("""
161+
defmodule ExSample do
162+
import ExUnit.Assertions
163+
164+
def run do
165+
{2, 1} = assert {2, var} = ExUnit.AssertionsTest.Value.tuple()
166+
end
167+
end
168+
""")
169+
end) =~ "variable \"var\" is unused"
170+
after
171+
:code.delete(ExSample)
172+
:code.purge(ExSample)
173+
end
174+
158175
test "assert match expands argument in match context" do
159176
{x, y, z} = {1, 2, 3}
160177
assert vec(x: ^x, y: ^y) = vec(x: x, y: y, z: z)
@@ -308,7 +325,7 @@ defmodule ExUnit.AssertionsTest do
308325
timeout = ok(1)
309326

310327
try do
311-
assert_receive {~l(a)}, timeout
328+
assert_receive {~l(_a)}, timeout
312329
rescue
313330
error in [ArgumentError] ->
314331
"timeout must be a non-negative integer, got: {:ok, 1}" = error.message

0 commit comments

Comments
 (0)