Skip to content

Commit 80f24b2

Browse files
committed
Do not expand or collect vars from quote in ExUnit assertions
See #12209.
1 parent f983b9c commit 80f24b2

File tree

2 files changed

+40
-18
lines changed

2 files changed

+40
-18
lines changed

lib/ex_unit/lib/ex_unit/assertions.ex

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,12 @@ defmodule ExUnit.Assertions do
595595
defp collect_pins_from_pattern(expr, vars) do
596596
{_, pins} =
597597
Macro.prewalk(expr, %{}, fn
598+
{:quote, _, [_]}, acc ->
599+
{:ok, acc}
600+
601+
{:quote, _, [_, _]}, acc ->
602+
{:ok, acc}
603+
598604
{:^, _, [var]}, acc ->
599605
identifier = var_context(var)
600606

@@ -631,7 +637,10 @@ defmodule ExUnit.Assertions do
631637
{:"::", _, [left, right]}, acc ->
632638
{[left], collect_vars_from_binary(right, acc)}
633639

634-
{skip, _, [_]}, acc when skip in [:^, :@] ->
640+
{skip, _, [_]}, acc when skip in [:^, :@, :quote] ->
641+
{:ok, acc}
642+
643+
{skip, _, [_, _]}, acc when skip in [:quote] ->
635644
{:ok, acc}
636645

637646
{:_, _, context}, acc when is_atom(context) ->
@@ -673,34 +682,43 @@ defmodule ExUnit.Assertions do
673682

674683
@doc false
675684
def __expand_pattern__({:when, meta, [left, right]}, caller) do
676-
left = prewalk_expand_pattern(left, Macro.Env.to_match(caller))
677-
right = prewalk_expand_pattern(right, %{caller | context: :guard})
685+
left = expand_pattern(left, Macro.Env.to_match(caller))
686+
right = expand_pattern(right, %{caller | context: :guard})
678687
{:when, meta, [left, right]}
679688
end
680689

681690
def __expand_pattern__(expr, caller) do
682-
prewalk_expand_pattern(expr, Macro.Env.to_match(caller))
691+
expand_pattern(expr, Macro.Env.to_match(caller))
683692
end
684693

685-
defp prewalk_expand_pattern(expr, caller) do
686-
Macro.prewalk(expr, fn
687-
{:__aliases__, _, _} = expr ->
688-
Macro.expand(expr, caller)
694+
defp expand_pattern({:quote, _, [_]} = expr, _caller), do: expr
695+
defp expand_pattern({:quote, _, [_, _]} = expr, _caller), do: expr
696+
defp expand_pattern({:__aliases__, _, _} = expr, caller), do: Macro.expand(expr, caller)
689697

690-
{:@, _, [{attribute, _, _}]} ->
691-
caller.module |> Module.get_attribute(attribute) |> Macro.escape()
698+
defp expand_pattern({:@, _, [{attribute, _, _}]}, caller) do
699+
caller.module |> Module.get_attribute(attribute) |> Macro.escape()
700+
end
692701

693-
{left, meta, right} = expr ->
694-
case Macro.expand(expr, caller) do
695-
^expr -> expr
696-
other -> {left, [expanded: other] ++ meta, right}
697-
end
702+
defp expand_pattern({left, meta, right} = expr, caller) do
703+
meta =
704+
case Macro.expand(expr, caller) do
705+
^expr -> meta
706+
other -> [expanded: other] ++ meta
707+
end
698708

699-
other ->
700-
Macro.expand(other, caller)
701-
end)
709+
{expand_pattern(left, caller), meta, expand_pattern(right, caller)}
710+
end
711+
712+
defp expand_pattern({left, right}, caller) do
713+
{expand_pattern(left, caller), expand_pattern(right, caller)}
714+
end
715+
716+
defp expand_pattern([_ | _] = list, caller) do
717+
Enum.map(list, &expand_pattern(&1, caller))
702718
end
703719

720+
defp expand_pattern(other, _caller), do: other
721+
704722
defp suppress_warning({name, meta, [expr, [do: clauses]]}) do
705723
clauses =
706724
Enum.map(clauses, fn {:->, meta, args} ->

lib/ex_unit/test/ex_unit/assertions_test.exs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,10 @@ defmodule ExUnit.AssertionsTest do
203203
:code.purge(ExSample)
204204
end
205205

206+
test "assert match with quote on left-side" do
207+
assert quote(do: x in Alias) = quote(do: x in Alias)
208+
end
209+
206210
test "assert match expands argument in match context" do
207211
{x, y, z} = {1, 2, 3}
208212
assert vec(x: ^x, y: ^y) = vec(x: x, y: y, z: z)

0 commit comments

Comments
 (0)