diff --git a/lib/live_debugger/app/utils/term_parser.ex b/lib/live_debugger/app/utils/term_parser.ex index 490973ee9..51f70b4e7 100644 --- a/lib/live_debugger/app/utils/term_parser.ex +++ b/lib/live_debugger/app/utils/term_parser.ex @@ -441,9 +441,7 @@ defmodule LiveDebugger.App.Utils.TermParser do end defp to_children(items) when is_list(items) do - items - |> Enum.sort() - |> Enum.with_index(fn item, index -> + Enum.with_index(items, fn item, index -> {index, to_node(item)} end) end diff --git a/test/app/utils/term_parser_test.exs b/test/app/utils/term_parser_test.exs index e61d3578e..465c6e96d 100644 --- a/test/app/utils/term_parser_test.exs +++ b/test/app/utils/term_parser_test.exs @@ -190,6 +190,15 @@ defmodule LiveDebugger.App.Utils.TermParserTest do assert TermParser.term_to_display_tree(term) == expected end + test "keeps the order of list and tuple elements" do + term = %{list: [3, 1, 2], tuple: {:ok, 5}} + + term_node = TermParser.term_to_display_tree(term) + + assert term_node |> child!(:list) |> children_texts() == ["3", "1", "2"] + assert term_node |> child!(:tuple) |> children_texts() == [":ok", "5"] + end + test "parses regex term" do term = ~r/hello/ @@ -684,6 +693,21 @@ defmodule LiveDebugger.App.Utils.TermParserTest do }} = Enum.at(updated_node.children, 3) end + test "applies list insertions to elements in their original order" do + old_term = [3, 1, 2] + new_term = [3, 1, 2, 0] + + term_node = TermParser.term_to_display_tree(old_term) + diff = TermDiffer.diff(old_term, new_term) + + assert {:ok, updated_node} = TermParser.update_by_diff(term_node, diff) + + assert children_texts(updated_node) == ["3", "1", "2", "0"] + + assert children_texts(updated_node) == + new_term |> TermParser.term_to_display_tree() |> children_texts() + end + test "properly adds and removes comma suffixes" do term_node1 = %{a: 1, b: 2} term_node2 = %{a: 1, b: 2, c: 3} @@ -899,4 +923,8 @@ defmodule LiveDebugger.App.Utils.TermParserTest do {^key, node} = List.keyfind(children, key, 0) node end + + defp children_texts(%TermNode{children: children}) do + Enum.map(children, fn {_, %TermNode{content: [%DisplayElement{text: text} | _]}} -> text end) + end end