diff options
| author | blasty <blasty@local> | 2026-07-09 12:25:49 +0200 |
|---|---|---|
| committer | blasty <blasty@local> | 2026-07-09 12:25:49 +0200 |
| commit | 51b7cc5a1e4fbb861909946b2feb842294d412e8 (patch) | |
| tree | f1f8b6de3dc9fb039d619f656b5e35e3694c2b75 /tests | |
| parent | tui: --open PATH to create/attach a session for an arbitrary binary (diff) | |
| download | ida-tui-51b7cc5a1e4fbb861909946b2feb842294d412e8.tar.gz ida-tui-51b7cc5a1e4fbb861909946b2feb842294d412e8.tar.xz ida-tui-51b7cc5a1e4fbb861909946b2feb842294d412e8.zip | |
decompiler view: Tab/Shift+Tab toggle disasm<->pseudocode, full bodies
- domain.decompile now fetches the FULL body: server caps responses at 50KB and
clips strings to 1KB, but caches the full output and exposes it at
_meta.ida_mcp.download_url -> we GET that so pseudocode is complete
(main: 43257 chars, not a 1KB stub). include_addresses gives per-line /*0xEA*/.
- DecompView (read-only TextArea, cpp highlighting best-effort, line numbers)
- Tab and Shift+Tab toggle the code pane; lazy decompile in a worker, cached;
hard-failures ('decompilation failed') shown gracefully with disasm fallback
- pilot suite 14/14 (adds tab->pseudocode, full-body, shift+tab->disasm)
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test_tui.py | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/tests/test_tui.py b/tests/test_tui.py index 8769321..683f896 100644 --- a/tests/test_tui.py +++ b/tests/test_tui.py @@ -12,7 +12,7 @@ import os import sys sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from idatui.app import DisasmView, FunctionsPanel, IdaTui # noqa: E402 +from idatui.app import DecompView, DisasmView, FunctionsPanel, IdaTui # noqa: E402 from textual.widgets import DataTable, Static # noqa: E402 PASS = FAIL = 0 @@ -124,6 +124,25 @@ async def run(db): left.display and isinstance(app.focused, DataTable), f"display={left.display} focus={type(app.focused).__name__}") + # Decompiler toggle: open a function, Tab -> pseudocode, Shift+Tab -> back. + table.focus() + table.move_cursor(row=biggest_i) + await pilot.press("enter") + dis = app.query_one(DisasmView) + dec = app.query_one(DecompView) + await wait_until(pilot, lambda: dis.total > 0, timeout=20) + await pilot.press("tab") + pc = await wait_until(pilot, lambda: dec.display and dec.loaded_ea is not None, 25) + check("tab shows pseudocode", pc and app._active == "decomp", + f"active={app._active} disp={dec.display}") + check("pseudocode has real body (not 1KB stub)", len(dec.text) > 1200, + f"len={len(dec.text)}") + await pilot.press("shift+tab") + await pilot.pause(0.2) + check("shift+tab returns to disassembly", + app._active == "disasm" and dis.display and not dec.display, + f"active={app._active}") + def main(argv): db = None |
