@@ -1507,10 +1507,10 @@ test.describe("Workspace Manager V2 bootstrap", () => {
15071507 "Game Controller",
15081508 "Touch",
15091509 "Pen",
1510- "Wheel",
15111510 "Flight Stick",
15121511 "VR Controller"
15131512 ]);
1513+ await expect(page.locator(".input-mapping-v2__device-card[data-input-mapping-device-id='wheel']")).toHaveCount(0);
15141514 await expect(page.locator("#inputMappingV2DeviceList")).toContainText("InputService + KeyboardState");
15151515 await expect(page.locator("#inputMappingV2DeviceList")).toContainText("InputService + MouseState + PointerDragState");
15161516 await expect(page.locator("#inputMappingV2DeviceList")).toContainText("InputService + GamepadState + GamepadInputAdapter");
@@ -1523,6 +1523,9 @@ test.describe("Workspace Manager V2 bootstrap", () => {
15231523 await expect(page.locator("#inputMappingV2GestureList")).not.toContainText("Drag Rectangle");
15241524 await expect(page.locator("#inputMappingV2GestureList")).not.toContainText(/Mouse Move [XY]/);
15251525 await expect(page.locator("#inputMappingV2GestureList")).toContainText("Button");
1526+ await expect(page.locator(".input-mapping-v2__gesture-group", { hasText: "Mouse" })).toContainText("Wheel Up");
1527+ const gestureGroupTitles = await page.locator(".input-mapping-v2__gesture-group strong").allTextContents();
1528+ expect(gestureGroupTitles).not.toContain("Wheel");
15261529 const compactAccordionSpacing = await page.locator("#gestureSetupContent, #captureInputContent").evaluateAll((contents) => (
15271530 contents.map((content) => ({
15281531 columnGap: getComputedStyle(content).columnGap,
@@ -1564,22 +1567,31 @@ test.describe("Workspace Manager V2 bootstrap", () => {
15641567 const keyboardGestureButtons = gestureFlowLayout.groupLayouts.find((entry) => entry.label === "Keyboard").buttons;
15651568 expect(new Set(keyboardGestureButtons.map((entry) => entry.left)).size).toBeGreaterThan(1);
15661569 expect(new Set(keyboardGestureButtons.map((entry) => entry.top)).size).toBeGreaterThan(1);
1567- await page.locator(".input-mapping-v2__device-card[data-input-mapping-device-id='wheel '] input").uncheck();
1570+ await page.locator(".input-mapping-v2__device-card[data-input-mapping-device-id='mouse '] input").uncheck();
15681571 await expect(page.locator(".input-mapping-v2__gesture-button", { hasText: "Wheel Up" })).toHaveCount(0);
1569- await page.locator(".input-mapping-v2__device-card[data-input-mapping-device-id='wheel '] input").check();
1572+ await page.locator(".input-mapping-v2__device-card[data-input-mapping-device-id='mouse '] input").check();
15701573 await expect(page.locator(".input-mapping-v2__gesture-button", { hasText: "Wheel Up" })).toHaveCount(1);
15711574 const actionOptions = await page.locator("#inputMappingV2ActionSelect option").allTextContents();
15721575 expect(actionOptions).toEqual([...actionOptions].sort((left, right) => left.localeCompare(right)));
15731576 expect(actionOptions).toEqual(expect.arrayContaining(["Move Left", "Confirm", "Cancel", "Fire", "Thrust", "Rotate Left", "Rotate Right", "Pause", "Select", "Start"]));
15741577 await expect(page.locator("#inputMappingV2ResetActionsButton")).toHaveCount(0);
1575- await expect(page.locator("#inputMappingV2ClearActionButton")).toHaveText("Delete");
1576- await expect(page.locator("#actionSetupContent .input-mapping-v2__button-row button")).toHaveText(["Add", "Delete", "Delete"]);
1577- await expect(page.locator("#inputMappingV2RumbleFeedbackCheckbox")).toBeVisible();
1578+ await expect(page.locator("#inputMappingV2ClearActionButton")).toHaveText("Delete All");
1579+ await expect(page.locator("#actionSetupContent .input-mapping-v2__button-row button")).toHaveText(["Add", "Delete"]);
1580+ await expect(page.locator("#mappingPanelContent #inputMappingV2ClearActionButton")).toBeVisible();
1581+ await expect(page.locator(".input-mapping-v2__device-card[data-input-mapping-device-id='gameController'] #inputMappingV2RumbleFeedbackCheckbox")).toBeVisible();
15781582 await page.locator("#inputMappingV2RumbleFeedbackCheckbox").check();
15791583 await expect(page.locator("#statusLog")).toHaveValue(/WARN Gamepad rumble unavailable:/);
15801584 await expect(page.locator("#previewOutput")).toContainText("No inputs captured yet.");
15811585 await expect(page.locator(".input-mapping-v2__mapping-card")).toHaveCount(0);
15821586 expect(await page.locator("#previewOutput").evaluate((node) => getComputedStyle(node).overflowY)).toBe("auto");
1587+ const capturedMappingsActionPlacement = await page.locator("#mappingPanelContent").evaluate((content) => ({
1588+ lastElementClass: content.lastElementChild?.className,
1589+ lastButtonText: content.lastElementChild?.querySelector("button")?.textContent
1590+ }));
1591+ expect(capturedMappingsActionPlacement).toEqual({
1592+ lastElementClass: "input-mapping-v2__mapping-actions",
1593+ lastButtonText: "Delete All"
1594+ });
15831595 const captureFlowLayout = await page.locator("#captureInputContent").evaluate((content) => {
15841596 const rectFor = (selector) => {
15851597 const box = content.querySelector(selector).getBoundingClientRect();
@@ -1760,12 +1772,17 @@ test.describe("Workspace Manager V2 bootstrap", () => {
17601772 expect(Math.round(mappingTileBox.width)).toBe(225);
17611773 expect(Math.round(mappingTileBox.height)).toBe(225);
17621774 await expect(page.locator("#previewOutput")).toContainText("Move Left");
1763- await expect(page.locator("#previewOutput")).toContainText("Keyboard KeyA");
1764- await expect(page.locator("#previewOutput")).toContainText("Keyboard KeyD");
1765- await expect(page.locator("#previewOutput")).toContainText("Mouse Middle Button");
1766- await expect(page.locator("#previewOutput")).toContainText("Mouse Drag Release");
1775+ await expect(page.locator("#previewOutput")).toContainText("Keyboard KeyA Press ");
1776+ await expect(page.locator("#previewOutput")).toContainText("Keyboard KeyD Press ");
1777+ await expect(page.locator("#previewOutput")).toContainText("Mouse Middle Button Click ");
1778+ await expect(page.locator("#previewOutput")).toContainText("Mouse Left Button Drag Release");
17671779 await expect(page.locator("#previewOutput")).not.toContainText("Mouse Drag Rectangle");
1768- await expect(page.locator(".input-mapping-v2__input-token", { hasText: "Mouse Drag Release" })).toHaveAttribute("title", /Bounds: x 12, y 16, width 60, height 80/);
1780+ await expect(page.locator(".input-mapping-v2__input-token", { hasText: "Mouse Left Button" }).filter({ hasText: "Drag Release" })).toHaveAttribute("title", /Bounds: x 12, y 16, width 60, height 80/);
1781+ await expect(page.locator("#inputMappingV2CaptureKeyboardButton")).toHaveClass(/has-used-input/);
1782+ await expect(page.locator("#inputMappingV2CaptureMouseButton")).toHaveClass(/has-used-input/);
1783+ await expect(page.locator("#inputMappingV2UsedInputHighlights")).toContainText("Keyboard KeyA Press");
1784+ await expect(page.locator("#inputMappingV2UsedInputHighlights")).toContainText("Mouse Middle Button Click");
1785+ await expect(page.locator("#inputMappingV2UsedInputHighlights")).toContainText("Mouse Left Button Drag Release");
17691786 await expect(page.locator("#inspectorOutput")).toContainText('"action": "moveLeft"');
17701787 await expect(page.locator("#inspectorOutput")).toContainText('"binding": "KeyA"');
17711788 await expect(page.locator("#inspectorOutput")).toContainText('"binding": "KeyD"');
@@ -1789,7 +1806,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
17891806 await page.keyboard.press("KeyB");
17901807 await expect(page.locator("#statusLog")).toHaveValue(/OK Keyboard KeyB mapped to Confirm\./);
17911808 await expect(page.locator("#captureInputContent")).not.toContainText("Keyboard KeyB mapped to Confirm.");
1792- await page.locator("#inputMappingV2ClearActionButton ").click();
1809+ await page.locator("#inputMappingV2DeleteActionButton ").click();
17931810 await expect(page.locator(".input-mapping-v2__mapping-card", { hasText: "Confirm" })).toHaveCount(0);
17941811 await expect(page.locator(".input-mapping-v2__mapping-card", { hasText: "Move Left" })).toHaveCount(1);
17951812 await expect(page.locator("#inputMappingV2ActionSelect option[value='confirm']")).toHaveJSProperty("disabled", false);
@@ -1872,8 +1889,10 @@ test.describe("Workspace Manager V2 bootstrap", () => {
18721889 });
18731890 await expect(page.locator(".input-mapping-v2__gamepad-capture-button[data-input-mapping-gamepad-index='1']")).not.toHaveClass(/is-capturing/);
18741891 await expect(page.locator("#previewOutput")).toContainText("Keyboard KeyD");
1875- await expect(page.locator("#previewOutput")).toContainText("Game Controller X");
1892+ await expect(page.locator("#previewOutput")).toContainText("Game Controller X Button ");
18761893 await expect(page.locator("#previewOutput")).not.toContainText("(Gamepad 1)");
1894+ await expect(page.locator(".input-mapping-v2__gamepad-capture-button[data-input-mapping-gamepad-index='1']")).toHaveClass(/has-used-input/);
1895+ await expect(page.locator("#inputMappingV2UsedInputHighlights")).toContainText("Game Controller X Button");
18771896 await expect(page.locator(".input-mapping-v2__input-token", { hasText: "Game Controller" }).filter({ hasText: "X" })).toHaveAttribute("title", "Logitech RumblePad 2 USB\nSTANDARD GAMEPAD\nVendor: 046d Product: c218\nX");
18781897 await expect(page.locator("#inspectorOutput")).toContainText('"source": "gamepad"');
18791898 await expect(page.locator("#inspectorOutput")).toContainText('"binding": "Pad1:Button2"');
@@ -1929,6 +1948,10 @@ test.describe("Workspace Manager V2 bootstrap", () => {
19291948 await page.locator("#toolCopyJsonButton").click();
19301949 expect(await page.evaluate(() => window.__inputMappingV2Clipboard)).toContain('"toolId": "input-mapping-v2"');
19311950 await expect(page.locator("#statusLog")).toHaveValue(/OK Mapping JSON copied\./);
1951+ await page.locator("#inputMappingV2ClearActionButton").click();
1952+ await expect(page.locator(".input-mapping-v2__mapping-card")).toHaveCount(0);
1953+ await expect(page.locator("#previewOutput")).toContainText("No inputs captured yet.");
1954+ await expect(page.locator("#statusLog")).toHaveValue(/OK Deleted \d+ captured mappings\./);
19321955 expect(pageErrors).toEqual([]);
19331956 } finally {
19341957 await workspaceV2CoverageReporter.stop(page);
0 commit comments