aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorblasty <blasty@local>2026-07-09 20:07:26 +0200
committerblasty <blasty@local>2026-07-09 20:07:26 +0200
commitdf028256fd84c654fd83c2b11b51a6a641cd3f62 (patch)
treea043e6ee0cb607d66ee3b63d138024ddcb751b6b
parentfix: disasm follow stepped to the next line on a call (fall-through edge) (diff)
downloadida-tui-df028256fd84c654fd83c2b11b51a6a641cd3f62.tar.gz
ida-tui-df028256fd84c654fd83c2b11b51a6a641cd3f62.tar.xz
ida-tui-df028256fd84c654fd83c2b11b51a6a641cd3f62.zip
test: fix stale row/function reuse across filter + xref-select blocks
Two latent ordering bugs, exposed once the suite actually opened the big function: - the 'sub_1*' filter round-trip left the list filtered, so reusing biggest_i (an unfiltered row index) clamped move_cursor to a tiny stub function (4-line decompile, no calls), cascading into ~7 skipped/failed checks. Clear the filter before reusing biggest_i. - the xref-select sub-test navigates 'dis' to another function; the following column-cursor block assumed the original function was still loaded at call_idx, so h/l ran on an uncached (empty) line and clamped x to 0. Reload the original function and materialize the call line first. pilot suite 59/59.
-rw-r--r--tests/test_tui.py13
1 files changed, 13 insertions, 0 deletions
diff --git a/tests/test_tui.py b/tests/test_tui.py
index d14b525..26ef162 100644
--- a/tests/test_tui.py
+++ b/tests/test_tui.py
@@ -135,6 +135,11 @@ async def run(db):
left.display and isinstance(app.focused, DataTable),
f"display={left.display} focus={type(app.focused).__name__}")
+ # The 'sub_1*' round-trip above left the list filtered; clear it so the
+ # full table is back and biggest_i (an unfiltered row index) is valid.
+ app.clear_filter()
+ await wait_until(pilot, lambda: table.row_count == nfuncs, timeout=15)
+
# Decompiler toggle: open a function, Tab -> pseudocode, Shift+Tab -> back.
table.focus()
table.move_cursor(row=biggest_i)
@@ -280,6 +285,7 @@ async def run(db):
dis.cursor = call_idx
dis.refresh()
orig = app._cur.ea
+ orig_name = app._cur.name
depth = len(app._nav)
await pilot.press("enter")
await wait_until(pilot, lambda: len(app._nav) > depth, timeout=25)
@@ -338,11 +344,18 @@ async def run(db):
f"cur={app._cur.ea:#x} (want {xref.fn_addr:#x}) "
f"cursor={dis.cursor} (want {xexp})")
+ # The xref-select sub-test above navigated 'dis' to another function;
+ # return to the original and materialize the call line so the column
+ # cursor operates on a cached (non-empty) line.
+ app._open_function(orig, orig_name)
+ await wait_until(pilot, lambda: dis.total > 0 and app._cur.ea == orig, 20)
+ dis.model.lines(0, 400, prefetch=False)
# Column cursor: h/l move it; following the symbol under the cursor.
dis.focus()
dis.cursor = call_idx
dis.cursor_x = 5
dis.refresh()
+ await pilot.pause(0.05)
await pilot.press("h")
check("h moves the column cursor left", dis.cursor_x == 4, f"x={dis.cursor_x}")
await pilot.press("l")