feat(engine): resolveExpression is the reference locator semantics, and a scripted engine drives the runner through every matcher
Merged
OK
1mo ago+2381+2381+0123456789012345678901234567890123456789-260-260-012345678901234567890123456789
Stacked on oskar/web-closed-roots.
e2e/engineexportsresolveExpression(expression, nodes, { selector? }), the reference locator semantics over a semantic tree: query kinds, states, level, the visible flag, scopes as strict descendants,hasTextandhas,first/last/nth, withtextandlabelanswering the innermost match when a container echoes a descendant's text. An engine whose tree is the whole truth calls it instead of carrying a copy (the device engine adopts it next). Changesete2eminor.- The scripted in-memory engine (
tests/helpers/scripted-engine.ts) is a configuration of the instrumentedfake-engine.tsover that resolver: a mutable scene, per-attempt timers, every action and pointer kind, keyboard, session hooks, stale and failing actions, typed call records. - Five suites drive the real runner through it in seconds:
scripted-matchers(every matcher,.not, list forms, failure codes and messages),scripted-reads(every read, strictness, the secure-field refusal),scripted-actions(every dispatch payload, pointer actions, key grammar),scripted-polling(late nodes, growing counts, the negation grace, stale relocation,scrollUntilVisible),scripted-capabilities(everyUNSUPPORTED_CAPABILITYpath). - One
screenOverbuilds every unit-test screen (press-sequentially,filter-has,scroll-until-visible, the screen fixture preset);engineConfigreplaces theas E2EConfigcasts. Unit tests forisChecked,isEnabled,filter({ has }), and the cache listing's truncated row.