Include pinned variables from all contexts for diffing
This commit is contained in:
@@ -558,15 +558,18 @@ defmodule ExUnit.Assertions do
|
||||
end
|
||||
|
||||
@doc false
|
||||
def __pins__([]), do: ""
|
||||
|
||||
def __pins__(pins) do
|
||||
content =
|
||||
pins
|
||||
|> Enum.reverse()
|
||||
|> Enum.map_join(@indent, fn {name, var} -> "#{name} = #{inspect(var)}" end)
|
||||
pins
|
||||
|> Enum.filter(fn {{_, ctx}, _} -> ctx == nil end)
|
||||
|> Enum.reverse()
|
||||
|> Enum.map_join(@indent, fn {{name, _}, var} -> "#{name} = #{inspect(var)}" end)
|
||||
|> case do
|
||||
"" ->
|
||||
""
|
||||
|
||||
"\nThe following variables were pinned:" <> @indent <> content
|
||||
pinned ->
|
||||
"\nThe following variables were pinned:" <> @indent <> pinned
|
||||
end
|
||||
end
|
||||
|
||||
defp format_mailbox(messages) do
|
||||
@@ -592,10 +595,12 @@ defmodule ExUnit.Assertions do
|
||||
|
||||
defp collect_pins_from_pattern(expr, vars) do
|
||||
{_, pins} =
|
||||
Macro.prewalk(expr, [], fn
|
||||
{:^, _, [{name, _, nil} = var]}, acc ->
|
||||
if {name, nil} in vars do
|
||||
{:ok, [{name, var} | acc]}
|
||||
Macro.prewalk(expr, %{}, fn
|
||||
{:^, _, [var]}, acc ->
|
||||
identifier = var_context(var)
|
||||
|
||||
if identifier in vars do
|
||||
{:ok, Map.put(acc, var_context(var), var)}
|
||||
else
|
||||
{:ok, acc}
|
||||
end
|
||||
@@ -604,7 +609,11 @@ defmodule ExUnit.Assertions do
|
||||
{form, acc}
|
||||
end)
|
||||
|
||||
Enum.uniq_by(pins, &elem(&1, 0))
|
||||
Enum.to_list(pins)
|
||||
end
|
||||
|
||||
defp var_context({name, meta, context}) do
|
||||
{name, meta[:counter] || context}
|
||||
end
|
||||
|
||||
defp collect_vars_from_pattern({:when, _, [left, right]}) do
|
||||
|
||||
@@ -234,11 +234,12 @@ defmodule ExUnit.Diff do
|
||||
|
||||
# Pins
|
||||
|
||||
defp diff_pin({:^, _, [{name, _, _}]} = pin, right, %{pins: pins} = env) do
|
||||
%{^name => pin_value} = pins
|
||||
defp diff_pin({:^, _, [var]} = pin, right, %{pins: pins} = env) do
|
||||
identifier = var_context(var)
|
||||
%{^identifier => pin_value} = pins
|
||||
{diff, post_env} = diff(pin_value, right, env)
|
||||
|
||||
diff_left = update_diff_meta(pin, !diff.equivalent?)
|
||||
diff_left = update_diff_meta(pin, not diff.equivalent?)
|
||||
{%{diff | left: diff_left}, post_env}
|
||||
end
|
||||
|
||||
@@ -654,8 +655,9 @@ defmodule ExUnit.Diff do
|
||||
{equivalent?, left, right, env}
|
||||
end
|
||||
|
||||
defp literal_key({:^, _, [{name, _, _}]}, %{pins: pins}) do
|
||||
%{^name => pin_value} = pins
|
||||
defp literal_key({:^, _, [var]}, %{pins: pins}) do
|
||||
identifier = var_context(var)
|
||||
%{^identifier => pin_value} = pins
|
||||
pin_value
|
||||
end
|
||||
|
||||
@@ -1075,8 +1077,12 @@ defmodule ExUnit.Diff do
|
||||
defp safe_keyword?({:{}, _meta, [key, _value]}), do: key_is_atom?(key)
|
||||
defp safe_keyword?(_other), do: false
|
||||
|
||||
def key_is_atom?(quoted) do
|
||||
defp key_is_atom?(quoted) do
|
||||
{key, _} = extract_diff_meta(quoted)
|
||||
is_atom(key)
|
||||
end
|
||||
|
||||
defp var_context({name, meta, context}) do
|
||||
{name, meta[:counter] || context}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -29,6 +29,13 @@ defmodule ExUnit.AssertionsTest do
|
||||
end
|
||||
end
|
||||
|
||||
defmacrop assert_ok_with_pin_from_quoted_var(arg) do
|
||||
quote do
|
||||
kind = :ok
|
||||
assert {^kind, value} = unquote(arg)
|
||||
end
|
||||
end
|
||||
|
||||
require Record
|
||||
Record.defrecordp(:vec, x: 0, y: 0, z: 0)
|
||||
|
||||
@@ -38,6 +45,15 @@ defmodule ExUnit.AssertionsTest do
|
||||
assert_ok(42)
|
||||
end
|
||||
|
||||
test "assert inside macro with pins" do
|
||||
try do
|
||||
assert_ok_with_pin_from_quoted_var({:error, :oops})
|
||||
rescue
|
||||
error in [ExUnit.AssertionError] ->
|
||||
"match (=) failed" = error.message
|
||||
end
|
||||
end
|
||||
|
||||
test "assert with truthy value" do
|
||||
:truthy = assert Value.truthy()
|
||||
end
|
||||
|
||||
@@ -100,8 +100,7 @@ defmodule ExUnit.DiffTest do
|
||||
refute_diff(:bar = 42, "-:bar-", "+42+")
|
||||
refute_diff(42 = :bar, "-42-", "+:bar+")
|
||||
|
||||
pins = [a: :a, b: :b]
|
||||
|
||||
pins = %{{:a, nil} => :a, {:b, nil} => :b}
|
||||
assert_diff(x = :a, [x: :a], pins)
|
||||
assert_diff(^a = :a, [], pins)
|
||||
assert_diff(^b = :b, [], pins)
|
||||
@@ -117,22 +116,16 @@ defmodule ExUnit.DiffTest do
|
||||
assert_diff(+123 = 123, [])
|
||||
|
||||
refute_diff(12 = 13, "1-2-", "1+3+")
|
||||
|
||||
refute_diff(12345 = 123, "123-45-", "123")
|
||||
refute_diff(123 = 12345, "123", "123+45+")
|
||||
|
||||
refute_diff(12345 = 345, "-12-345", "345")
|
||||
refute_diff(345 = 12345, "345", "+12+345")
|
||||
|
||||
refute_diff(123 = -123, "123", "+-+123")
|
||||
refute_diff(-123 = 123, "---123", "123")
|
||||
|
||||
refute_diff(491_512_235 = 490_512_035, "49-1-512-2-35", "49+0+512+0+35")
|
||||
|
||||
assert_diff(0xF = 15, [])
|
||||
|
||||
refute_diff(0xF = 16, "1-5-", "1+6+")
|
||||
|
||||
refute_diff(123 = :a, "-123-", "+:a+")
|
||||
end
|
||||
|
||||
@@ -143,16 +136,12 @@ defmodule ExUnit.DiffTest do
|
||||
assert_diff(+123.0 = 123.0, [])
|
||||
|
||||
refute_diff(1.2 = 1.3, "1.-2-", "1.+3+")
|
||||
|
||||
refute_diff(12.345 = 12.3, "12.3-45-", "12.3")
|
||||
refute_diff(12.3 = 12.345, "12.3", "12.3+45+")
|
||||
|
||||
refute_diff(123.45 = 3.45, "-12-3.45", "3.45")
|
||||
refute_diff(3.45 = 123.45, "3.45", "+12+3.45")
|
||||
|
||||
refute_diff(1.23 = -1.23, "1.23", "+-+1.23")
|
||||
refute_diff(-1.23 = 1.23, "---1.23", "1.23")
|
||||
|
||||
refute_diff(123.0 = :a, "-123.0-", "+:a+")
|
||||
refute_diff(123.0 = 123_512_235, "-123.0-", "+123512235+")
|
||||
end
|
||||
@@ -192,7 +181,7 @@ defmodule ExUnit.DiffTest do
|
||||
refute_diff([:a, [:c, :b]] = [:a, [:b, :c]], "[:a, [-:c-, :b]]", "[:a, [:b, +:c+]]")
|
||||
refute_diff(:a = [:a, [:b, :c]], "-:a-", "+[:a, [:b, :c]]+")
|
||||
|
||||
pins = [a: :a, b: :b, list_ab: [:a, :b]]
|
||||
pins = %{{:a, nil} => :a, {:b, nil} => :b, {:list_ab, nil} => [:a, :b]}
|
||||
|
||||
assert_diff(x = [], [x: []], pins)
|
||||
assert_diff(x = [:a, :b], [x: [:a, :b]], pins)
|
||||
@@ -286,8 +275,7 @@ defmodule ExUnit.DiffTest do
|
||||
"[:a, [+:x+, :c], :d, :e]"
|
||||
)
|
||||
|
||||
pins = [list_bc: [:b, :c]]
|
||||
|
||||
pins = %{{:list_bc, nil} => [:b, :c]}
|
||||
assert_diff([:a | x] = [:a, :b], [x: [:b]], pins)
|
||||
assert_diff([:a | x] = [:a, :b, :c], [x: [:b, :c]], pins)
|
||||
assert_diff([:a | ^list_bc] = [:a, :b, :c], [], pins)
|
||||
@@ -420,8 +408,7 @@ defmodule ExUnit.DiffTest do
|
||||
"%{1 => :a, :b => 2}"
|
||||
)
|
||||
|
||||
pins = [a: :a, b: :b]
|
||||
|
||||
pins = %{{:a, nil} => :a, {:b, nil} => :b}
|
||||
assert_diff(%{^a => 1} = %{a: 1}, [], pins)
|
||||
assert_diff(%{^a => x} = %{a: 1}, [x: 1], pins)
|
||||
|
||||
@@ -491,7 +478,7 @@ defmodule ExUnit.DiffTest do
|
||||
"%+ExUnit.DiffTest.User+{age: 16, name: nil}"
|
||||
)
|
||||
|
||||
pins = [twenty_one: 21]
|
||||
pins = %{{:twenty_one, nil} => 21}
|
||||
assert_diff(%User{age: ^twenty_one} = %User{age: 21}, [], pins)
|
||||
assert_diff(%User{age: age} = %User{age: 21}, [age: 21], pins)
|
||||
|
||||
@@ -631,7 +618,7 @@ defmodule ExUnit.DiffTest do
|
||||
~s/"fox hops over the dog"/
|
||||
)
|
||||
|
||||
pins = [x: " over the dog"]
|
||||
pins = %{{:x, nil} => " over the dog"}
|
||||
|
||||
assert_diff("fox hops" <> x = "fox hops over the dog", x: " over the dog")
|
||||
assert_diff("fox hops " <> "over " <> x = "fox hops over the dog", x: "the dog")
|
||||
@@ -667,7 +654,7 @@ defmodule ExUnit.DiffTest do
|
||||
refute_diff(one() = 2, "-one()-", "+2+")
|
||||
refute_diff(tuple(x, x) = {1, 2}, "-tuple(x, x)-", "{1, +2+}")
|
||||
|
||||
pins = [x: 1]
|
||||
pins = %{{:x, nil} => 1}
|
||||
assert_diff(pin_x() = 1, [], pins)
|
||||
refute_diff(pin_x() = 2, "-pin_x()-", "+2+", pins)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user