Include pinned variables from all contexts for diffing

This commit is contained in:
José Valim
2019-09-09 19:55:28 +02:00
parent 89d1c7fe3f
commit 884e93391e
4 changed files with 56 additions and 38 deletions
+21 -12
View File
@@ -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
+12 -6
View File
@@ -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
+7 -20
View File
@@ -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