Boot-screen capture results

Generated 2026-09-29T05:59:29+00:00.

Steppytest codeEmulator output (stderr)Screen
PASS
0. Boot preamble (common to every fresh-booted scenario below)
(no test action here -- every fresh-booted scenario below starts from this same state)

16 lines, common to all 3 fresh-booted scenarios

[2026-09-29 05:59:22.896] [lisa_rom] [info] input-server: connection accepted
[2026-09-29 05:59:22.900] [lisa_rom] [debug] bus: boot ROM overlay dropped (CLR SETUP) — low addresses are RAM from here
[2026-09-29 05:59:22.904] [lisa_rom] [warning] SCC: unimplemented register SCCBCTL at offset 0x40 (read)
[2026-09-29 05:59:22.904] [lisa_rom] [warning] SCC: unimplemented register SCCBCTL at offset 0x40 (write)
[2026-09-29 05:59:22.905] [lisa_rom] [warning] VIA1: unimplemented register DDRA at offset 0x18 (write)
[2026-09-29 05:59:22.915] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_appears0/frame-000000.png (720x364)
[2026-09-29 05:59:22.936] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_appears0/frame-000001.png (720x364)
[2026-09-29 05:59:22.947] [lisa_rom] [warning] VIA2: unimplemented register PCR at offset 0x18 (read)
[2026-09-29 05:59:22.947] [lisa_rom] [warning] VIA2: unimplemented register PCR at offset 0x18 (write)
[2026-09-29 05:59:22.951] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_appears0/frame-000002.png (720x364)
[2026-09-29 05:59:22.968] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_appears0/frame-000003.png (720x364)
[2026-09-29 05:59:23.005] [lisa_rom] [warning] VIA2: unimplemented register SR at offset 0x14 (write)
[2026-09-29 05:59:23.007] [lisa_rom] [warning] SYSCTRL: read from write-only register VERT_RETRACE at offset 0xffc
[2026-09-29 05:59:23.007] [lisa_rom] [warning] SYSCTRL: no register at offset 0xffe (read)
[2026-09-29 05:59:23.007] [lisa_rom] [warning] SYSCTRL: no register at offset 0x27e5 (read)
[2026-09-29 05:59:23.031] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_appears0/frame-000004.png (720x364)
0. Boot preamble (common to every fresh-booted scenario below)
PASS
1. Boot menu appears
@pytest.mark.fresh_boot
def test_boot_menu_appears(lisa_rom_proc: LisaEmuProcess, record_step):
    """The ROM's boot-device-selection screen renders and settles without
    any input -- the baseline capture the other scenarios diff against.
    Explicitly fresh_boot (not just relying on being first) so this test's
    intent is clear even if tests are reordered or run individually."""
    out = RESULTS_DIR / "01_boot_menu.png"
    with InputClient(str(lisa_rom_proc.uds_path)) as client:
        stable = client.wait_stable(timeout_ms=10000, quiet_ms=500)
        _capture_and_sync(client, str(out))

    record_step("1. Boot menu appears", lisa_rom_proc.current_test_output(), out, stable,
                lisa_rom_proc.was_fresh_boot)
    assert stable, f"display never settled; stderr:\n{lisa_rom_proc.stderr_text()}"
    assert out.exists() and out.stat().st_size > 0

3 lines after the common preamble (19 total)

[2026-09-29 05:59:23.048] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_appears0/frame-000005.png (720x364)
[2026-09-29 05:59:23.081] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_appears0/frame-000006.png (720x364)
[2026-09-29 05:59:23.588] [lisa_rom] [info] display: captured /home/runner/work/lisa-source-project/lisa-source-project/tests/system/results/boot_screens/01_boot_menu.png (720x364)
1. Boot menu appears
PASS
2. After reset selected (Cmd/1)
def test_boot_menu_after_reset_selected(lisa_rom_proc: LisaEmuProcess, record_step):
    """Cmd/1: RESTART (see module docstring). Continues
    test_boot_menu_appears's instance rather than rebooting -- safe since
    that test never sends input, so its ending state is the pristine menu."""
    out = RESULTS_DIR / "02_after_reset_cmd1.png"
    with InputClient(str(lisa_rom_proc.uds_path)) as client:
        client.wait_stable(timeout_ms=10000, quiet_ms=500)  # let the menu settle first
        _cmd_digit(client, KEY_1)
        stable = client.wait_stable(timeout_ms=10000, quiet_ms=500)
        _capture_and_sync(client, str(out))

    record_step("2. After reset selected (Cmd/1)", lisa_rom_proc.current_test_output(), out, stable,
                lisa_rom_proc.was_fresh_boot)
    assert stable, f"display never settled after Cmd/1; stderr:\n{lisa_rom_proc.stderr_text()}"
    assert out.exists() and out.stat().st_size > 0

5 lines during this test (continuing the previous instance)

[2026-09-29 05:59:23.643] [lisa_rom] [info] input-server: connection closed
[2026-09-29 05:59:23.643] [lisa_rom] [info] input-server: connection accepted
[2026-09-29 05:59:24.164] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_appears0/frame-000007.png (720x364)
[2026-09-29 05:59:24.197] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_appears0/frame-000008.png (720x364)
[2026-09-29 05:59:24.702] [lisa_rom] [info] display: captured /home/runner/work/lisa-source-project/lisa-source-project/tests/system/results/boot_screens/02_after_reset_cmd1.png (720x364)
2. After reset selected (Cmd/1)
PASS
3. After disk selected (Cmd/3)
@pytest.mark.fresh_boot
def test_boot_menu_after_disk_selected(lisa_rom_proc: LisaEmuProcess, record_step):
    """Cmd/3: STARTUP FROM... (opens a startup-device submenu; see module
    docstring). Two images: before (the pristine menu, same baseline as
    test_boot_menu_appears's own capture but taken independently within
    this test so the row is self-contained) and after Cmd/3. fresh_boot:
    this needs the original pristine menu, not whatever state Cmd/1 (the
    previous test) left behind."""
    out_before = RESULTS_DIR / "03a_before_disk_select.png"
    out_after = RESULTS_DIR / "03b_after_disk_cmd3.png"

    with InputClient(str(lisa_rom_proc.uds_path)) as client:
        stable_before = client.wait_stable(timeout_ms=10000, quiet_ms=500)
        _capture_and_sync(client, str(out_before))

        _cmd_digit(client, KEY_3)
        stable_after = client.wait_stable(timeout_ms=10000, quiet_ms=500)
        _capture_and_sync(client, str(out_after))

    all_stable = stable_before and stable_after
    record_step("3. After disk selected (Cmd/3)", lisa_rom_proc.current_test_output(),
                [out_before, out_after], all_stable, lisa_rom_proc.was_fresh_boot)
    assert all_stable, f"display never settled after Cmd/3; stderr:\n{lisa_rom_proc.stderr_text()}"
    assert out_before.exists() and out_before.stat().st_size > 0
    assert out_after.exists() and out_after.stat().st_size > 0

8 lines after the common preamble (24 total)

[2026-09-29 05:59:24.913] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_after_disk_sele0/frame-000005.png (720x364)
[2026-09-29 05:59:24.930] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_after_disk_sele0/frame-000006.png (720x364)
[2026-09-29 05:59:24.963] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_after_disk_sele0/frame-000007.png (720x364)
[2026-09-29 05:59:25.467] [lisa_rom] [info] display: captured /home/runner/work/lisa-source-project/lisa-source-project/tests/system/results/boot_screens/03a_before_disk_select.png (720x364)
[2026-09-29 05:59:25.523] [lisa_rom] [warning] VIA1: unimplemented register PCR at offset 0x60 (read)
[2026-09-29 05:59:25.523] [lisa_rom] [warning] VIA1: unimplemented register PCR at offset 0x60 (write)
[2026-09-29 05:59:25.546] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_boot_menu_after_disk_sele0/frame-000008.png (720x364)
[2026-09-29 05:59:26.052] [lisa_rom] [info] display: captured /home/runner/work/lisa-source-project/lisa-source-project/tests/system/results/boot_screens/03b_after_disk_cmd3.png (720x364)
3. After disk selected (Cmd/3)3. After disk selected (Cmd/3)
PASS
4. Selection via mouse
@pytest.mark.fresh_boot
def test_mouse_selection(lisa_rom_proc: LisaEmuProcess, record_step):
    """Selection via mouse instead of keyboard: move to the "STARTUP
    FROM..." button, press and hold (captured after a short settle -- the
    button should be visibly highlighted while held, same as clicking it
    for real), then release (captured after a full settle -- same result
    Cmd/3 produces in test_boot_menu_after_disk_selected). Three images:
    before any mouse action, mid-press, and after release. fresh_boot:
    needs the original pristine menu's button layout, not whatever the
    previous test's submenu left on screen.

    KNOWN BUG, not yet fixed: mouse_move currently makes the cursor
    disappear entirely instead of moving it to the target position --
    confirmed by sending mouse_move alone (no click) and comparing
    before/after captures; root cause not yet isolated (candidates:
    cops.hpp's mouse-delta encoding, entry_cli.cpp's delta-splitting, or a
    COPS protocol desync). So today: image 2 shows a missing cursor, not a
    highlighted button, and image 3 shows the unchanged original menu, not
    a disk-selection submenu. The 3-image structure and both settle points
    are already correct for when that's fixed -- only the assertions below
    (currently just wait_stable()+files-written) would need tightening
    then, to actually check the click landed."""
    out_before = RESULTS_DIR / "04a_before_click.png"
    out_pressed = RESULTS_DIR / "04b_button_highlighted.png"
    out_after = RESULTS_DIR / "04c_after_disk_selection.png"

    with InputClient(str(lisa_rom_proc.uds_path)) as client:
        stable_before = client.wait_stable(timeout_ms=10000, quiet_ms=500)
        _capture_and_sync(client, str(out_before))

        client.mouse_move(455, 178)  # "STARTUP FROM..." button center
        client.wait_stable(timeout_ms=2000, quiet_ms=200)  # let the move itself settle first
        client.mouse_button(0, True)
        # Short settle, not the usual 500ms: a highlighted-while-held state
        # is exactly the kind of thing a longer quiet window could blow
        # past if something else were still animating.
        stable_pressed = client.wait_stable(timeout_ms=2000, quiet_ms=150)
        _capture_and_sync(client, str(out_pressed))

        client.mouse_button(0, False)
        stable_after = client.wait_stable(timeout_ms=10000, quiet_ms=500)
        _capture_and_sync(client, str(out_after))

    all_stable = stable_before and stable_pressed and stable_after
    record_step("4. Selection via mouse", lisa_rom_proc.current_test_output(),
                [out_before, out_pressed, out_after], all_stable, lisa_rom_proc.was_fresh_boot)
    assert all_stable, f"display never settled; stderr:\n{lisa_rom_proc.stderr_text()}"
    assert all(p.exists() and p.stat().st_size > 0 for p in (out_before, out_pressed, out_after))

4 lines after the common preamble (20 total)

[2026-09-29 05:59:26.806] [lisa_rom] [info] display: captured /home/runner/work/lisa-source-project/lisa-source-project/tests/system/results/boot_screens/04a_before_click.png (720x364)
[2026-09-29 05:59:26.880] [lisa_rom] [info] display(png): wrote /tmp/pytest-of-runner/pytest-0/test_mouse_selection0/frame-000005.png (720x364)
[2026-09-29 05:59:27.231] [lisa_rom] [info] display: captured /home/runner/work/lisa-source-project/lisa-source-project/tests/system/results/boot_screens/04b_button_highlighted.png (720x364)
[2026-09-29 05:59:27.796] [lisa_rom] [info] display: captured /home/runner/work/lisa-source-project/lisa-source-project/tests/system/results/boot_screens/04c_after_disk_selection.png (720x364)
4. Selection via mouse4. Selection via mouse4. Selection via mouse