36 lines
1.7 KiB
TypeScript
36 lines
1.7 KiB
TypeScript
|
|
import { test, expect, tryLoadApp } from './utils/fixtures';
|
||
|
|
|
||
|
|
// Red-green reproduction for the wxWindow::WarpPointer no-op (src/wasm/window.cpp).
|
||
|
|
//
|
||
|
|
// WarpPointer() was a no-op because the browser cannot move the OS pointer. But
|
||
|
|
// KiCad's arrow-key cursor nudge warps the pointer and then reads it back via
|
||
|
|
// wxGetMousePosition() (SetCursorPosition -> WarpMouseCursor -> WarpPointer, then
|
||
|
|
// the interactive-move loop reads GetMousePosition()). With the warp dead the
|
||
|
|
// read is stale, so a moved item never follows the arrow keys and snaps to the
|
||
|
|
// cursor on grab (pcbnew issue #9). The standalone app warps to known points and
|
||
|
|
// self-reports whether wxGetMousePosition() tracked them.
|
||
|
|
//
|
||
|
|
// RED (bug present): wxGetMousePosition() unchanged by the warp.
|
||
|
|
// GREEN (fixed): wxGetMousePosition() == ClientToScreen({x, y}).
|
||
|
|
|
||
|
|
function reproLine(logs: string[], name: string): string | undefined {
|
||
|
|
return logs.find((l) => l.includes(`[REPRO] ${name}:`));
|
||
|
|
}
|
||
|
|
|
||
|
|
test.describe('wxWindow::WarpPointer cached mouse position', () => {
|
||
|
|
test('WarpPointer updates wxGetMousePosition()', async ({ page, testLogger }) => {
|
||
|
|
const name = 'warppointer_updates_position';
|
||
|
|
await page.goto('/standalone/warp-pointer/warp-pointer_test.html');
|
||
|
|
expect(await tryLoadApp(page, 30000), 'repro app should load').toBe(true);
|
||
|
|
|
||
|
|
await expect
|
||
|
|
.poll(() => reproLine(testLogger.consoleLogs, name) ?? null, {
|
||
|
|
timeout: 30000,
|
||
|
|
message: `repro app should emit its [REPRO] ${name} result line`,
|
||
|
|
})
|
||
|
|
.not.toBeNull();
|
||
|
|
|
||
|
|
const line = reproLine(testLogger.consoleLogs, name)!;
|
||
|
|
expect(line, `repro line was: ${line}`).toContain(`[REPRO] ${name}: PASS`);
|
||
|
|
});
|
||
|
|
});
|