You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A living test catalog for dcu (Desktop Computer Use), plus the harness that runs
the automatable subset. Goal: every claim dcu makes — focus-free control, input
fidelity, capture correctness, clean lifecycle — is provable on demand.
Harness: bench/bench.py (drives publish/dcu.exe over stdio MCP).
Test page: bench/page.html (self-contained: click grid, mouse recorder,
textarea, scroll tracker, drag-drop, canvas, duplicate buttons, DOM mutator).
Evidence: C:/tmp/dcu-bench/*.png.
python bench/bench.py # full suite
python bench/bench.py t7 t32 # filter by test function name
bench page mirrors scrollY into window title; 3 pages down
scrollY > 300 (was failing at 300 → fixed, see Bug #2)
10
HTML5 drag-drop
message-based drag from source to drop zone
drop event fires — documented platform limit: HTML5 DnD expects the real input pipeline; plain message drags still work (file drag in Explorer class)
Tier 3 — Element identity & snapshots
#
Test
Pass criteria
11
Stable ids
element id from snapshot fires the intended control (verified via page log, not just "something changed")
12
Stale id after DOM mutation
re-resolution to correct control OR clean structured error (Unknown element id … Call get_app_state for fresh ids) — never a silent wrong-click (Bug #4 → fixed)
13
Duplicate-name buttons
5 identical "Add" buttons; frame-ordered pick hits the third, verified via dup:2 event
14
Tree scale
full snapshot of a busy page
15
Revision sanity
every mutating call returns a fresh, changed revision
Tier 4 — Capture
#
Test
Pass criteria
16
Occluded window
Chrome positioned exactly over Notepad; PrintWindow still returns Notepad's content (evidence PNG saved)
17
Minimized window
clean null/blank, no garbage, server unaffected
18
Hardware-accelerated content
real PrintWindow pixels or a clean null result — never pixels from an unrelated occluding app
19
Coordinate alignment (DPI)
frame-derived coordinates hit intended button at current monitor DPI
20
Multi-monitor
requires multi-monitor rig — manual
Tier 5 — Hostile edge cases
#
Test
Pass criteria
29
Canvas (no a11y)
zero phantom child elements + coordinate click still lands (canvas:x,y event)
31
Hung app
all Notepad threads suspended; action returns in bounded time; server healthy after
32
Rapid-fire stress
100 clicks + 30 types back-to-back
34
Window closed mid-action
clean target window no longer exists, server survives
35
Window moved mid-action
bounds-guard ON → refusal; OFF → honest report
36
Lock screen during action
❌ not automated (won't lock your screen on you)
37
Multi-instance app
3 Notepads; resolution by pid hits the right one
Tier 6 — Overlay & lifecycle
#
Test
Pass criteria
38
Ghost flags
overlay window has WS_EX_LAYERED|TRANSPARENT|NOACTIVATE|TOOLWINDOW and display affinity WDA_EXCLUDEFROMCAPTURE (0x11)
39
Ghost capture-exclusion
visual/screen-record check — manual (flag verified by #38)
40
Ghost cleanup
server killed mid-action → zero orphan overlay windows
41
Shutdown regression
bare EOF and init-then-EOF both exit 0 (the shutdown-cleanup bug, canonized)
42
Schema conformance
≥10 tools advertised; bad enum args → structured error, not exception
43
execute_sequence
failure at step 7 of 10 halts with stopped_at=7, partial results accurate
44
Settings resilience
corrupt settings.json → defaults, healthy server
Bugs found by this suite
#
Severity
Bug
Fix
1
high
Chrome typing was hollow — uia_setvalue_append set field text but fired no DOM input events, so web forms never registered input
new tier-2 typing path: WM_KEYDOWN/WM_CHAR/WM_KEYUP stream into the Chrome_RenderWidgetHostHWND child (method render_widget_keys) — real key events, real form state
2
high
Scroll barely moved — wheel fallback posted a single WM_MOUSEWHEEL regardless of pages, and used client coordinates where wheel messages require screen coordinates, and posted to the frame instead of the content window
per-notch loop (3 notches/page), screen-coordinate lParam, routed via ChildWindowFromPoint; direction validated (up/down/left/right only, structured error otherwise)
3
med
Stale element id → raw exception surfaced as unstructured MCP error
unknown ids now return a structured error: Unknown element id 'eN' in snapshot rN. Call get_app_state for fresh ids.
4
med
Ghost capture-exclusion not sticking — SetWindowDisplayAffinity was called before the handle reliably existed; affinity read back 0x0
applied in OnHandleCreated, re-applied on every show; failure logs to debug
5
low
Clicks on dead windows posted silently into the void
IsWindow pre-check → target window no longer exists
6
test
Harness compared window titles for the focus test — foreground terminal has a live spinner, titles never equal
compare HWNDs
7
test
Bench pad/drag divs invisible to UIA (names < 30 chars, no roles)