From 87ceffefd485e37cf9b81008fc87dd7371eb9330 Mon Sep 17 00:00:00 2001 From: Raphael Fakhri <153192858+RaphaelFakhri@users.noreply.github.com> Date: Wed, 21 Oct 2026 08:11:54 +0000 Subject: [PATCH] Fix: keep list and tuple element order in assigns TermParser sorted list and tuple elements before building display nodes, so {:ok, 5} rendered as {5, :ok} and list diffs were applied by index to the sorted children. --- lib/live_debugger/app/utils/term_parser.ex | 4 +--- test/app/utils/term_parser_test.exs | 28 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) 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