From 40379e7285c29d490e79fdb43f0f05f4db542de6 Mon Sep 17 00:00:00 2001 From: Daniel Kukula Date: Mon, 17 Feb 2025 23:25:49 +0100 Subject: [PATCH 1/7] remove length on right list --- lib/ex_unit/lib/ex_unit/diff.ex | 10 +++++----- lib/ex_unit/test/ex_unit/diff_test.exs | 6 ++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/ex_unit/lib/ex_unit/diff.ex b/lib/ex_unit/lib/ex_unit/diff.ex index be15c7ef703..5de193697e2 100644 --- a/lib/ex_unit/lib/ex_unit/diff.ex +++ b/lib/ex_unit/lib/ex_unit/diff.ex @@ -374,10 +374,10 @@ defmodule ExUnit.Diff do # are handled as quoted expressions. Improper lists on the right side are # handled as runtime improper lists. defp diff_maybe_improper_list(left, right, env) do - {parsed_left, improper_left, operators_left, length_left} = + {parsed_left, improper_left, operators_left, _length_left} = split_left_list(left, 0, env.context) - {parsed_right, improper_right} = split_right_list(right, length_left, []) + {parsed_right, improper_right} = split_right_list(right, []) {parsed_diff, parsed_post_env} = myers_difference_list(parsed_left, parsed_right, env) {improper_diff, improper_post_env} = @@ -410,10 +410,10 @@ defmodule ExUnit.Diff do diff(left, right, env) end - defp split_right_list([head | tail], length, acc) when length > 0, - do: split_right_list(tail, length - 1, [head | acc]) + defp split_right_list([head | tail], acc), + do: split_right_list(tail, [head | acc]) - defp split_right_list(rest, _length, acc), + defp split_right_list(rest, acc), do: {Enum.reverse(acc), rest} defp rebuild_right_list(left, right) do diff --git a/lib/ex_unit/test/ex_unit/diff_test.exs b/lib/ex_unit/test/ex_unit/diff_test.exs index 02e11a15918..32701921e72 100644 --- a/lib/ex_unit/test/ex_unit/diff_test.exs +++ b/lib/ex_unit/test/ex_unit/diff_test.exs @@ -117,6 +117,7 @@ defmodule ExUnit.DiffTest do defp refute_diff(left, right, expected_left, expected_right, context) do {diff, _env} = Diff.compute(left, right, context) + assert diff.equivalent? == false diff_left = to_diff(diff.left, "-") @@ -237,6 +238,7 @@ defmodule ExUnit.DiffTest do refute_diff([:a, :b, :c] = [:a, :b, :x], "[:a, :b, -:c-]", "[:a, :b, +:x+]") refute_diff([:a, :x, :c] = [:a, :b, :c], "[:a, -:x-, :c]", "[:a, +:b+, :c]") refute_diff([:a, :d, :b, :c] = [:a, :b, :c, :d], "[:a, -:d-, :b, :c]", "[:a, :b, :c, +:d+]") + refute_diff([:b, :c] = [:a, :b, :c], "[:b, :c]", "[+:a+, :b, :c]") refute_diff([:a, :b, :c] = [:a, :b, []], "[:a, :b, -:c-]", "[:a, :b, +[]+]") refute_diff([:a, :b, []] = [:a, :b, :c], "[:a, :b, -[]-]", "[:a, :b, +:c+]") @@ -318,7 +320,7 @@ defmodule ExUnit.DiffTest do "[:a, +:b+, :c | +:d+]" ) - refute_diff([:a | :d] = [:a, :b, :c | :d], "[:a | -:d-]", "[:a, +:b+, +:c+ | +:d+]") + refute_diff([:a | :d] = [:a, :b, :c | :d], "[:a | :d]", "[:a, +:b+, +:c+ | :d]") refute_diff( [[:a | :x], :x | :d] = [[:a | :b], :c | :d], @@ -354,7 +356,7 @@ defmodule ExUnit.DiffTest do ) refute_diff([:a, :b | [:c]] = [:a, :b], "[:a, :b | [-:c-]]", "[:a, :b]") - refute_diff([:a, :b | []] = [:a, :b, :c], "[:a, :b | -[]-]", "[:a, :b, +:c+]") + refute_diff([:a, :b | []] = [:a, :b, :c], "[:a, :b | []]", "[:a, :b, +:c+]") refute_diff([:a, :b | [:c, :d]] = [:a, :b, :c], "[:a, :b | [:c, -:d-]]", "[:a, :b, :c]") refute_diff([:a, :b | [:c, :d]] = [:a], "[:a, -:b- | [-:c-, -:d-]]", "[:a]") From 7e96c05a7f7a2fd1303e9add0bca6e158d8e4f7e Mon Sep 17 00:00:00 2001 From: Daniel Kukula Date: Tue, 18 Feb 2025 17:38:41 +0100 Subject: [PATCH 2/7] conditional logic depending on left is proper list --- lib/ex_unit/lib/ex_unit/diff.ex | 20 ++++++++++++++++++-- lib/ex_unit/test/ex_unit/diff_test.exs | 3 ++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/ex_unit/lib/ex_unit/diff.ex b/lib/ex_unit/lib/ex_unit/diff.ex index 5de193697e2..19744cfaf0e 100644 --- a/lib/ex_unit/lib/ex_unit/diff.ex +++ b/lib/ex_unit/lib/ex_unit/diff.ex @@ -374,10 +374,18 @@ defmodule ExUnit.Diff do # are handled as quoted expressions. Improper lists on the right side are # handled as runtime improper lists. defp diff_maybe_improper_list(left, right, env) do - {parsed_left, improper_left, operators_left, _length_left} = + {parsed_left, improper_left, operators_left, length_left} = split_left_list(left, 0, env.context) - {parsed_right, improper_right} = split_right_list(right, []) + # For improper lists, we split based on the left side's structure + # For proper lists, we process the entire right side + {parsed_right, improper_right} = + if improper_left != [] do + split_right_list(right, length_left, []) + else + split_right_list(right, []) + end + {parsed_diff, parsed_post_env} = myers_difference_list(parsed_left, parsed_right, env) {improper_diff, improper_post_env} = @@ -410,6 +418,14 @@ defmodule ExUnit.Diff do diff(left, right, env) end + # When matching improper lists, split right list up to the length of left list's proper part + defp split_right_list([head | tail], length, acc) when length > 0, + do: split_right_list(tail, length - 1, [head | acc]) + + defp split_right_list(rest, length, acc) when is_integer(length), + do: {Enum.reverse(acc), rest} + + # For proper lists, process the entire list defp split_right_list([head | tail], acc), do: split_right_list(tail, [head | acc]) diff --git a/lib/ex_unit/test/ex_unit/diff_test.exs b/lib/ex_unit/test/ex_unit/diff_test.exs index 32701921e72..edfa11ad165 100644 --- a/lib/ex_unit/test/ex_unit/diff_test.exs +++ b/lib/ex_unit/test/ex_unit/diff_test.exs @@ -320,7 +320,7 @@ defmodule ExUnit.DiffTest do "[:a, +:b+, :c | +:d+]" ) - refute_diff([:a | :d] = [:a, :b, :c | :d], "[:a | :d]", "[:a, +:b+, +:c+ | :d]") + refute_diff([:a | :d] = [:a, :b, :c | :d], "[:a | -:d-]", "[:a, +:b+, +:c+ | +:d+]") refute_diff( [[:a | :x], :x | :d] = [[:a | :b], :c | :d], @@ -339,6 +339,7 @@ defmodule ExUnit.DiffTest do end test "proper lists" do + assert [:a | _x] = [:a, :b | :c] assert_diff([:a | [:b]] = [:a, :b], []) assert_diff([:a | [:b, :c]] = [:a, :b, :c], []) From 2fe5d574cb05109598b5924d85bc3f98079cfc7a Mon Sep 17 00:00:00 2001 From: Daniel Kukula Date: Tue, 18 Feb 2025 17:41:23 +0100 Subject: [PATCH 3/7] remove comments --- lib/ex_unit/lib/ex_unit/diff.ex | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/ex_unit/lib/ex_unit/diff.ex b/lib/ex_unit/lib/ex_unit/diff.ex index 19744cfaf0e..973eccf2b99 100644 --- a/lib/ex_unit/lib/ex_unit/diff.ex +++ b/lib/ex_unit/lib/ex_unit/diff.ex @@ -418,14 +418,12 @@ defmodule ExUnit.Diff do diff(left, right, env) end - # When matching improper lists, split right list up to the length of left list's proper part defp split_right_list([head | tail], length, acc) when length > 0, do: split_right_list(tail, length - 1, [head | acc]) defp split_right_list(rest, length, acc) when is_integer(length), do: {Enum.reverse(acc), rest} - # For proper lists, process the entire list defp split_right_list([head | tail], acc), do: split_right_list(tail, [head | acc]) From 72069565a04a1f97be82c06fe02d0862f8241837 Mon Sep 17 00:00:00 2001 From: Daniel Kukula Date: Tue, 18 Feb 2025 17:43:55 +0100 Subject: [PATCH 4/7] more clenaup --- lib/ex_unit/lib/ex_unit/diff.ex | 2 -- lib/ex_unit/test/ex_unit/diff_test.exs | 1 - 2 files changed, 3 deletions(-) diff --git a/lib/ex_unit/lib/ex_unit/diff.ex b/lib/ex_unit/lib/ex_unit/diff.ex index 973eccf2b99..d5adf8c5273 100644 --- a/lib/ex_unit/lib/ex_unit/diff.ex +++ b/lib/ex_unit/lib/ex_unit/diff.ex @@ -377,8 +377,6 @@ defmodule ExUnit.Diff do {parsed_left, improper_left, operators_left, length_left} = split_left_list(left, 0, env.context) - # For improper lists, we split based on the left side's structure - # For proper lists, we process the entire right side {parsed_right, improper_right} = if improper_left != [] do split_right_list(right, length_left, []) diff --git a/lib/ex_unit/test/ex_unit/diff_test.exs b/lib/ex_unit/test/ex_unit/diff_test.exs index edfa11ad165..3b078c8cccb 100644 --- a/lib/ex_unit/test/ex_unit/diff_test.exs +++ b/lib/ex_unit/test/ex_unit/diff_test.exs @@ -339,7 +339,6 @@ defmodule ExUnit.DiffTest do end test "proper lists" do - assert [:a | _x] = [:a, :b | :c] assert_diff([:a | [:b]] = [:a, :b], []) assert_diff([:a | [:b, :c]] = [:a, :b, :c], []) From 8caddc75866e9497ce128b729a073d3df99ccfab Mon Sep 17 00:00:00 2001 From: Daniel Kukula Date: Tue, 18 Feb 2025 17:44:25 +0100 Subject: [PATCH 5/7] remove newline --- lib/ex_unit/test/ex_unit/diff_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ex_unit/test/ex_unit/diff_test.exs b/lib/ex_unit/test/ex_unit/diff_test.exs index 3b078c8cccb..39e69c143e7 100644 --- a/lib/ex_unit/test/ex_unit/diff_test.exs +++ b/lib/ex_unit/test/ex_unit/diff_test.exs @@ -117,7 +117,6 @@ defmodule ExUnit.DiffTest do defp refute_diff(left, right, expected_left, expected_right, context) do {diff, _env} = Diff.compute(left, right, context) - assert diff.equivalent? == false diff_left = to_diff(diff.left, "-") From 6c5c083228fb94daee7439011ca4f14048cb3a3a Mon Sep 17 00:00:00 2001 From: Daniel Kukula Date: Tue, 18 Feb 2025 22:21:33 +0100 Subject: [PATCH 6/7] use -1 to skip early return --- lib/ex_unit/lib/ex_unit/diff.ex | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/lib/ex_unit/lib/ex_unit/diff.ex b/lib/ex_unit/lib/ex_unit/diff.ex index d5adf8c5273..c25552527fe 100644 --- a/lib/ex_unit/lib/ex_unit/diff.ex +++ b/lib/ex_unit/lib/ex_unit/diff.ex @@ -381,7 +381,7 @@ defmodule ExUnit.Diff do if improper_left != [] do split_right_list(right, length_left, []) else - split_right_list(right, []) + split_right_list(right, -1, []) end {parsed_diff, parsed_post_env} = myers_difference_list(parsed_left, parsed_right, env) @@ -416,16 +416,10 @@ defmodule ExUnit.Diff do diff(left, right, env) end - defp split_right_list([head | tail], length, acc) when length > 0, + defp split_right_list([head | tail], length, acc) when length != 0, do: split_right_list(tail, length - 1, [head | acc]) - defp split_right_list(rest, length, acc) when is_integer(length), - do: {Enum.reverse(acc), rest} - - defp split_right_list([head | tail], acc), - do: split_right_list(tail, [head | acc]) - - defp split_right_list(rest, acc), + defp split_right_list(rest, _length, acc), do: {Enum.reverse(acc), rest} defp rebuild_right_list(left, right) do From 8f72ea8918e305539a8358c3a8d897a26d95fbbc Mon Sep 17 00:00:00 2001 From: Daniel Kukula Date: Tue, 18 Feb 2025 22:38:09 +0100 Subject: [PATCH 7/7] use new variable --- lib/ex_unit/lib/ex_unit/diff.ex | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/ex_unit/lib/ex_unit/diff.ex b/lib/ex_unit/lib/ex_unit/diff.ex index c25552527fe..c5ffcd8b301 100644 --- a/lib/ex_unit/lib/ex_unit/diff.ex +++ b/lib/ex_unit/lib/ex_unit/diff.ex @@ -377,12 +377,8 @@ defmodule ExUnit.Diff do {parsed_left, improper_left, operators_left, length_left} = split_left_list(left, 0, env.context) - {parsed_right, improper_right} = - if improper_left != [] do - split_right_list(right, length_left, []) - else - split_right_list(right, -1, []) - end + element_limit = if improper_left == [], do: -1, else: length_left + {parsed_right, improper_right} = split_right_list(right, element_limit, []) {parsed_diff, parsed_post_env} = myers_difference_list(parsed_left, parsed_right, env)