diff options
author | Wojtek Mach <wojtekmach@users.noreply.github.com> | 2017-11-19 10:23:02 +0100 |
---|---|---|
committer | José Valim <jose.valim@gmail.com> | 2017-11-19 07:23:02 -0200 |
commit | b1785761a71db7793583334bb32ae73d789c66aa (patch) | |
tree | bf52179a4458c9586ae8e5d48c6e5bbfb18a1186 | |
parent | 882c2bdb24ea1539dc0639116692378e18dbc4ac (diff) | |
download | elixir-b1785761a71db7793583334bb32ae73d789c66aa.tar.gz |
Use inspect in assertion diff for structs if possible (#7043)
-rw-r--r-- | lib/ex_unit/lib/ex_unit/diff.ex | 21 | ||||
-rw-r--r-- | lib/ex_unit/test/ex_unit/diff_test.exs | 28 |
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>> |