summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWojtek Mach <wojtekmach@users.noreply.github.com>2017-11-19 10:23:02 +0100
committerJosé Valim <jose.valim@gmail.com>2017-11-19 07:23:02 -0200
commitb1785761a71db7793583334bb32ae73d789c66aa (patch)
treebf52179a4458c9586ae8e5d48c6e5bbfb18a1186
parent882c2bdb24ea1539dc0639116692378e18dbc4ac (diff)
downloadelixir-b1785761a71db7793583334bb32ae73d789c66aa.tar.gz
Use inspect in assertion diff for structs if possible (#7043)
-rw-r--r--lib/ex_unit/lib/ex_unit/diff.ex21
-rw-r--r--lib/ex_unit/test/ex_unit/diff_test.exs28
2 files changed, 46 insertions, 3 deletions
diff --git a/lib/ex_unit/lib/ex_unit/diff.ex b/lib/ex_unit/lib/ex_unit/diff.ex
index 0e8bd2228..833e7273c 100644
--- a/lib/ex_unit/lib/ex_unit/diff.ex
+++ b/lib/ex_unit/lib/ex_unit/diff.ex
@@ -24,9 +24,18 @@ defmodule ExUnit.Diff do
# Structs
def script(%name{} = left, %name{} = right) do
- left = Map.from_struct(left)
- right = Map.from_struct(right)
- script_map(left, right, inspect(name))
+ if Inspect.impl_for(left) != Inspect.Any do
+ inspect_left = inspect(left)
+ inspect_right = inspect(right)
+
+ if inspect_left != inspect_right do
+ script_string(inspect_left, inspect_right)
+ else
+ script_struct(left, right)
+ end
+ else
+ script_struct(left, right)
+ end
end
# Maps
@@ -435,6 +444,12 @@ defmodule ExUnit.Diff do
[{:eq, "%" <> name <> "{"}, [elem_diff | rest], {:eq, "}"}]
end
+ defp script_struct(%name{} = left, %name{} = right) do
+ left = Map.from_struct(left)
+ right = Map.from_struct(right)
+ script_map(left, right, inspect(name))
+ end
+
defp map_difference(map1, map2) do
{surplus, altered, same} =
Enum.reduce(map1, {[], [], []}, fn {key, val1}, {surplus, altered, same} ->
diff --git a/lib/ex_unit/test/ex_unit/diff_test.exs b/lib/ex_unit/test/ex_unit/diff_test.exs
index da8e133a6..25bf01a3a 100644
--- a/lib/ex_unit/test/ex_unit/diff_test.exs
+++ b/lib/ex_unit/test/ex_unit/diff_test.exs
@@ -9,6 +9,16 @@ defmodule ExUnit.DiffTest do
defstruct [:age]
end
+ defmodule Opaque do
+ defstruct [:x]
+
+ defimpl Inspect do
+ def inspect(_, _) do
+ "#Opaque<???>"
+ end
+ end
+ end
+
test "numbers" do
int1 = 491_512_235
int2 = 490_512_035
@@ -424,6 +434,24 @@ defmodule ExUnit.DiffTest do
assert script(%User{}, %ExUnit.Test{}) == nil
end
+ test "structs with inspect" do
+ date1 = ~D[2017-10-01]
+ date2 = ~D[2017-10-02]
+
+ assert script(date1, date2) == [eq: "~D[2017-10-0", del: "1", ins: "2", eq: "]"]
+ end
+
+ test "structs with no inspect difference" do
+ opaque1 = %Opaque{x: 1}
+ opaque2 = %Opaque{x: 2}
+
+ assert script(opaque1, opaque2) == [
+ {:eq, "%ExUnit.DiffTest.Opaque{"},
+ [[{:eq, "x: "}, [del: "1", ins: "2"]]],
+ {:eq, "}"}
+ ]
+ end
+
test "not supported" do
bin1 = <<147, 1, 2, 31>>
bin2 = <<193, 1, 31>>