Use Cases¶
AmiPilot exists because Amiga automation has historically meant one of two things: coordinate-level input injection (works on anything, breaks on any layout change, verifies nothing) or ARexx (semantic, but only reaches what an application chose to export). Everything below is a real, grounded use of the verbs and tools this project actually ships — not aspirational marketing copy — with a pointer to the feature that makes it possible.
Automated regression testing¶
The core use case: drive a real GUI application the way a user would
(click()/type()/get_text()), assert on its state, and run that as
part of a normal test suite. The pytest plugin
boots a configured emulator, hands your test a connected client, and tears
down after — pytest sees it as an ordinary fixture. wait_for()/
click(expect=...) (the "Async by design" wait/expectation primitives)
eliminate the classic act-then-check race a naive click() followed
immediately by an assertion has against anything that opens a window,
changes a label, or closes asynchronously.
Catching UI regressions before they ship¶
Golden-tree fixtures (amipilot dump --golden,
Amipilot.assert_tree_matches()) snapshot a window's whole structural
shape — every gadget's role, label, position — as a checked-in fixture.
A later build that accidentally moves a gadget, drops a label, or changes
a control's type fails the comparison immediately, the same value a
snapshot test gives a web/mobile team, but for a real AmigaOS window
walked structurally rather than screenshotted pixel-for-pixel (see
Locator Tiers and Limits for what "walked
structurally" can and can't see).
Layout and resize testing¶
WINDOWMOVE/WINDOWSIZE (see
Wire Protocol) drive a real
title-bar drag or sizing-gadget drag, the same way a user would
reposition or resize a window — useful for asserting an application's
layout actually adapts correctly (a GadTools/ReAction layout
re-flowing gadgets, a scrollable view updating its visible extent)
instead of only ever being tested at its default opening size, or for
moving a window out of the way of another one mid-test without
guessing screen coordinates by hand.
CI for Amiga software¶
Because the whole stack is scriptable (Copperline's own --control JSON-RPC
server, headless, frame-accurate run_until waits) a build pipeline can
boot a real AmigaOS environment, launch the software under test
(LAUNCH/WBLAUNCH), drive it, and assert on the outcome — gating a merge
on real, observed behavior, not just "it compiled." No physical
machine, no human clicking through a manual test plan before every
release.
Cross-version and cross-configuration compatibility matrices¶
The same test suite can run unmodified against different Copperline/
Amiberry configs — AmigaOS 2.04 through 3.2, 68000 through 68020+, plain
chip RAM through an expanded fast-RAM setup — surfacing "works on 3.1,
breaks on 2.04" or "needs more than the default stack" long before a user
does. This project's own make test-target does exactly this against its
own fixtures already.
Automated screenshots for documentation¶
SCREENSHOT (raw capture, host-side amipilot.screenshot turning it into
real .png/.iff files — see Wire Protocol)
means a scripted walkthrough — open this window, fill in this field, click
this button — can capture a real, correctly-rendered image at every step
without a human running a screen-grab tool by hand. A documentation build
can regenerate every manual screenshot from a real running application
whenever the UI changes, instead of manually re-capturing and re-cropping
each one.
Bug reproduction and triage¶
A scripted repro (click()/type() sequence plus a SCREENSHOT at the
point of failure) turns "I can't reproduce this" into an attachable,
re-runnable artifact — the exact sequence of actions plus a real captured
image of the broken state, not a verbal description of what someone saw.
Exploratory GUI inspection¶
AmiInspect/amipilot dump are usable standing at the machine itself,
with no host session at all — the platform's first UIA-Inspect/browser-
devtools-element-picker equivalent for classic Intuition. Useful on its
own for understanding an unfamiliar application's structure before writing
any automation against it, or just to answer "what is this control,
actually" when working on a foreign codebase.
AmiInspect PICK (or Amipilot.pick() from the host) goes one step
further — the genuinely interactive element-picker experience, not
just a batch dump: point at a gadget on the real screen and its exact
locator (role/label/GA_ID) appears live, no reading through a whole
tree to find the one control you care about. See the AmiInspect
Reference.
Localization and catalog testing¶
Because golden-tree comparisons and get_text() both read live label
text, a suite can run once per locale (wherever the target
locale.library catalog is switched) and confirm translated strings
actually appear where expected — catching a missing catalog entry or a
truncated translation the same way a screenshot-diff localization test
would, without needing pixel comparison at all (see
tests/copperline/README.md's own note on locale variance in golden
trees for the real caveat this surfaced).
Workbench-launch and tooltype behavior testing¶
WBLAUNCH (a genuine WBStartup/WBArg message, not a Shell start) lets
a test verify an application's own icon/tooltype handling — does it
respect a PORT= override, does a project-icon launch pick the right
default tool — without a human double-clicking an icon by hand for every
test run.
Self-contained test runs on bare hardware¶
The file API (FSPUT/FSGET/FSLIST/FSMKDIR/FSDELETE) means a test
against real hardware with no shared drive or host-mounted filesystem can
still be entirely self-contained: connect, stage input fixtures, launch,
drive, harvest output/log files, clean up, disconnect — the wire is the
only road in, and it's enough.
Remote and real-hardware test farms¶
Since the wire protocol is transport-agnostic (serial.device or TCP, listen-mode today) and carries the exact same verb grammar either way, a CI runner can drive an actual physical Amiga over a real serial cable or network link — not just an emulator. The same test suite that runs against Copperline in CI can run against a real A1200 on a shelf somewhere, unchanged.
Long-running reliability (soak) testing¶
Because actions compose with wait_for()/expect= rather than fixed
sleeps, a repeated interaction loop (open, interact, close, repeat
hundreds of times) can run unattended for hours, surfacing a slow memory
leak, a resource exhaustion crash, or a rare race that a single manual
test pass would never catch.
Teaching and onboarding¶
A scripted, reproducible walkthrough of an application's UI — driven the same way a real user would use it, with real screenshots captured along the way — makes a much better onboarding artifact than a static manual: it's runnable, it stays accurate as long as the test suite does, and it can be regenerated on demand.
Preservation and archival documentation¶
For software whose original hardware or media is degrading, a scripted
session that drives the real application and captures real screenshots
(SCREENSHOT, saved as both PNG for modern viewing and IFF ILBM for
archival fidelity to the original platform) produces a documented,
reproducible record of exactly how the software actually behaved — done
systematically, once, rather than by hand and only when someone happens
to remember to do it before the hardware fails entirely.
MUI application testing¶
MUIREXX bridges to a MUI application's own built-in ARexx port (quit/
hide/show/activate/deactivate/info/help) — enough to script a
MUI app's lifecycle (start it, confirm it's alive via info, quit it
cleanly) as part of a larger automated flow, without pretending to a
generic widget-value accessor MUI's built-in ARexx support doesn't
actually provide (see server/README.md's own section for the honest
limits here).