diff options
author | José Valim <jose.valim@plataformatec.com.br> | 2019-09-23 16:15:02 +0200 |
---|---|---|
committer | José Valim <jose.valim@plataformatec.com.br> | 2019-09-23 16:15:02 +0200 |
commit | 8d3586814bb3f0bf3629198d2ef576feb91d434d (patch) | |
tree | 23c482c9d25f4915a214131ad3dce859972bea9f | |
parent | afb2cc01fbd6369abae6c27e8750583cf0379adf (diff) | |
download | elixir-8d3586814bb3f0bf3629198d2ef576feb91d434d.tar.gz |
Improve coverage and fix new diff implementation
-rw-r--r-- | lib/ex_unit/lib/ex_unit/diff.ex | 24 | ||||
-rw-r--r-- | lib/ex_unit/test/ex_unit/diff_test.exs | 30 |
2 files changed, 38 insertions, 16 deletions
diff --git a/lib/ex_unit/lib/ex_unit/diff.ex b/lib/ex_unit/lib/ex_unit/diff.ex index 838442748..ee4ae52e5 100644 --- a/lib/ex_unit/lib/ex_unit/diff.ex +++ b/lib/ex_unit/lib/ex_unit/diff.ex @@ -669,6 +669,7 @@ defmodule ExUnit.Diff do defp diff_quoted_struct(kw, struct1, %struct2{} = right, env) do if Macro.quoted_literal?(kw) do + {kw, []} = Code.eval_quoted(kw, []) diff_struct(struct(struct1, kw), Map.new(kw), right, struct1, struct2, env) else diff_map(Map.new(kw), Map.delete(right, :__struct__), struct1, struct2, env) @@ -685,7 +686,7 @@ defmodule ExUnit.Diff do inspect_right = inspect(right) if inspect_left != inspect_right do - diff_string(inspect_left, inspect_right, ?\", env) + diff_string(inspect_left, inspect_right, :none, env) else diff_map(left, Map.delete(right, :__struct__), struct1, struct2, env) end @@ -846,9 +847,15 @@ defmodule ExUnit.Diff do end end + defp block_diff_container(contents, :none), + do: {:__block__, [], contents} + + defp block_diff_container(contents, container), + do: {:__block__, [diff_container: container], contents} + defp string_script_to_diff([], delimiter, equivalent?, left, right) do - left = {:__block__, [diff_container: delimiter], Enum.reverse(left)} - right = {:__block__, [diff_container: delimiter], Enum.reverse(right)} + left = block_diff_container(Enum.reverse(left), delimiter) + right = block_diff_container(Enum.reverse(right), delimiter) %__MODULE__{equivalent?: equivalent?, left: left, right: right} end @@ -867,14 +874,7 @@ defmodule ExUnit.Diff do # Numbers defp diff_number(left, right, env) do - {diff, post_env} = diff_string(inspect(left), inspect(right), ?\", env) - diff_left = remove_diff_container_meta(diff.left) - diff_right = remove_diff_container_meta(diff.right) - {%{diff | left: diff_left, right: diff_right}, post_env} - end - - defp remove_diff_container_meta({:__block__, meta, list}) do - {:__block__, Keyword.delete(meta, :diff_container), list} + diff_string(inspect(left), inspect(right), :none, env) end # Algebra @@ -1056,7 +1056,7 @@ defmodule ExUnit.Diff do do: {left, Keyword.delete(meta, :diff), right} defp update_diff_meta({left, meta, right}, true), - do: {left, [{:diff, true} | Keyword.delete(meta, :diff)], right} + do: {left, Keyword.put(meta, :diff, true), right} defp update_diff_meta(literal, false), do: literal diff --git a/lib/ex_unit/test/ex_unit/diff_test.exs b/lib/ex_unit/test/ex_unit/diff_test.exs index f1446fcf9..ec08a2182 100644 --- a/lib/ex_unit/test/ex_unit/diff_test.exs +++ b/lib/ex_unit/test/ex_unit/diff_test.exs @@ -18,9 +18,11 @@ defmodule ExUnit.DiffTest do defstruct [:data] defimpl Inspect do - def inspect(_, _) do - "#Opaque<???>" - end + def inspect(%{data: data}, _) when is_tuple(data) or is_map(data), + do: "#Opaque<data: #{inspect(data)}>" + + def inspect(_, _), + do: "#Opaque<???>" end end @@ -555,12 +557,32 @@ defmodule ExUnit.DiffTest do ) end - test "structs without inspect difference" do + test "structs with inspect difference" do + refute_diff( + %Opaque{data: 1} = %Opaque{data: 2}, + "%ExUnit.DiffTest.Opaque{data: -1-}", + "%ExUnit.DiffTest.Opaque{data: +2+}" + ) + + refute_diff( + %Opaque{data: %{hello: :world}} = %Opaque{data: %{hello: "world"}}, + "#Opaque<data: %{hello: -:-world}>", + "#Opaque<data: %{hello: +\"+world+\"+}>" + ) + end + + test "structs without inspect difference outside match" do refute_diff( %Opaque{data: 1} == %Opaque{data: 2}, "%ExUnit.DiffTest.Opaque{data: -1-}", "%ExUnit.DiffTest.Opaque{data: +2+}" ) + + refute_diff( + %Opaque{data: %{hello: :world}} == %Opaque{data: %{hello: "world"}}, + "#Opaque<data: %{hello: -:-world}>", + "#Opaque<data: %{hello: +\"+world+\"+}>" + ) end test "strings" do |