@@ -2515,12 +2515,15 @@ test.describe("Workspace Manager V2 bootstrap", () => {
25152515 await page.locator(".object-vector-studio-v2__object-tile[data-object-id='object.asteroids.object-1'] [data-object-tile-shape-index='0']").click();
25162516 await expect(selectedShapeActions.locator("[data-shape-list-action='group']")).toBeDisabled();
25172517 await expect(selectedShapeActions.locator("[data-shape-list-action='group']")).toHaveAttribute("data-disabled-reason", /Shift-click shapes/);
2518+ await expect(selectedShapeActions.locator("[data-shape-list-action='ungroup']")).toBeDisabled();
2519+ await expect(selectedShapeActions.locator("[data-shape-list-action='ungroup']")).toHaveAttribute("data-disabled-reason", /belongs to a group/);
25182520 await page.locator(".object-vector-studio-v2__object-tile[data-object-id='object.asteroids.object-1'] [data-object-tile-shape-index='1']").click({ modifiers: ["Shift"] });
25192521 await expect(selectedShapeActions.locator("[data-shape-list-action='group']")).toBeEnabled();
25202522 await expect(selectedShapeActions.locator("[data-shape-list-action='group']")).toHaveAttribute("title", /Shift-click shapes to select more than one/);
25212523 await selectedShapeActions.locator("[data-shape-list-action='group']").click();
25222524 await expect(page.locator("#objectVectorStudioV2JsonDetails")).toContainText('"groupId": "group-1"');
25232525 await expect(page.locator("#statusLog")).toHaveValue(/OK Grouped 2 shapes into group-1\./);
2526+ await expect(selectedShapeActions.locator("[data-shape-list-action='ungroup']")).toBeEnabled();
25242527 await expect(page.locator(".object-vector-studio-v2__object-tile[data-object-id='object.asteroids.object-1'] [data-shape-group-id='group-1']")).toHaveCount(2);
25252528 const groupIconColors = await page.locator(".object-vector-studio-v2__object-tile[data-object-id='object.asteroids.object-1'] [data-shape-group-id='group-1']").evaluateAll((icons) => icons.map((icon) => getComputedStyle(icon).color));
25262529 expect(new Set(groupIconColors).size).toBe(1);
@@ -2532,6 +2535,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
25322535 await selectedShapeActions.locator("[data-shape-list-action='ungroup']").click();
25332536 await expect(page.locator("#objectVectorStudioV2JsonDetails")).not.toContainText('"groupId": "group-1"');
25342537 await expect(page.locator(".object-vector-studio-v2__object-tile[data-object-id='object.asteroids.object-1'] [data-shape-group-id='group-1']")).toHaveCount(0);
2538+ await expect(selectedShapeActions.locator("[data-shape-list-action='ungroup']")).toBeDisabled();
25352539 await expect(page.locator("#statusLog")).toHaveValue(/OK Ungrouped 2 selected shapes from group-1\./);
25362540 await page.locator(".object-vector-studio-v2__object-tile[data-object-id='object.asteroids.object-1'] [data-object-tile-shape-index='0']").click();
25372541
@@ -4049,8 +4053,16 @@ test.describe("Workspace Manager V2 bootstrap", () => {
40494053 await expect(page.locator("#objectVectorStudioV2FrameTimeline [data-frame-state-select]")).toHaveCount(0);
40504054 await expect(page.locator("#objectVectorStudioV2FrameTimeline [data-frame-state-help]")).toHaveCount(0);
40514055 const selectedObjectStatePanel = page.locator(".object-vector-studio-v2__object-tile[data-object-id='object.animation.ship-template'] .object-vector-studio-v2__object-state-panel");
4052- await expect(selectedObjectStatePanel.locator(".object-vector-studio-v2__object-state-controls button")).toHaveText(["Add", "Delete", "?"]);
4056+ await expect(selectedObjectStatePanel.locator(".object-vector-studio-v2__object-state-controls button")).toHaveText(["Add", "?"]);
4057+ const stateControlLayout = await selectedObjectStatePanel.locator(".object-vector-studio-v2__object-state-controls").evaluate((controls) => Array.from(controls.children).map((element) => {
4058+ if (element.tagName.toLowerCase() === "select") {
4059+ return `select:${element.dataset.objectStateSelect}`;
4060+ }
4061+ return `${element.dataset.objectStateAction || element.dataset.objectStateHelp}:${element.textContent.trim()}`;
4062+ }));
4063+ expect(stateControlLayout).toEqual(["select:object.animation.ship-template", "add:Add", "all:?"]);
40534064 await expect(selectedObjectStatePanel.locator("[data-object-state-select='object.animation.ship-template']")).toHaveValue("idle");
4065+ await expect(selectedObjectStatePanel.locator("[data-object-state-action='add']")).toBeDisabled();
40544066 await expect(selectedObjectStatePanel.locator("[data-object-state-help='all']")).toHaveAttribute("title", /idle\nDefault stationary state\.\nNo movement or action animation active\.\n\nmove\nMovement\/action state\.\nUsed for thrusting, walking, flying, or active movement visuals\./);
40554067 await expect(selectedObjectStatePanel.locator("[data-object-state-tile]")).toHaveText(["idle", "move"]);
40564068 await expect(selectedObjectStatePanel.locator("[data-object-state-tile='idle']")).toHaveAttribute("aria-pressed", "true");
@@ -4119,6 +4131,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
41194131 await selectedObjectStatePanel.locator("[data-object-state-select='object.animation.ship-template']").selectOption("move");
41204132 await expect(page.locator('[data-object-id="object.animation.ship-template"]')).toHaveAttribute("aria-pressed", "true");
41214133 await expect(selectedObjectStatePanel.locator("[data-object-state-select='object.animation.ship-template']")).toHaveValue("move");
4134+ await expect(selectedObjectStatePanel.locator("[data-object-state-action='add']")).toBeDisabled();
41224135 await expect(selectedObjectStatePanel.locator("[data-object-state-help='all']")).toHaveAttribute("title", /active\nObject is enabled and participating in gameplay\.\nTypically the default active runtime state\./);
41234136 await expect(selectedObjectStatePanel.locator("[data-object-state-tile='move']")).toHaveAttribute("aria-pressed", "true");
41244137 await expect(page.locator("#objectVectorStudioV2FrameTimeline [data-state-id='move']")).toHaveCount(1);
@@ -4285,9 +4298,14 @@ test.describe("Workspace Manager V2 bootstrap", () => {
42854298 const statePanel = objectTile.locator(".object-vector-studio-v2__object-state-panel");
42864299 const addStateButton = statePanel.locator("[data-object-state-action='add']");
42874300 const stateSelect = statePanel.locator("[data-object-state-select='object.test.group-state']");
4288- await expect(addStateButton).toBeEnabled();
4289- await addStateButton.click();
4290- await expect(page.locator("#statusLog")).toHaveValue(/WARN Create state skipped: Idle already exists for Group State\./);
4301+ const stateControlLayout = await statePanel.locator(".object-vector-studio-v2__object-state-controls").evaluate((controls) => Array.from(controls.children).map((element) => {
4302+ if (element.tagName.toLowerCase() === "select") {
4303+ return "select";
4304+ }
4305+ return element.dataset.objectStateAction || element.dataset.objectStateHelp;
4306+ }));
4307+ expect(stateControlLayout).toEqual(["select", "add", "all"]);
4308+ await expect(addStateButton).toBeDisabled();
42914309 await expect(statePanel.locator("[data-object-state-tile]")).toHaveText(["idle"]);
42924310
42934311 await stateSelect.selectOption("move");
@@ -4298,8 +4316,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
42984316 await expect(statePanel.locator("[data-object-state-tile='move']")).toHaveAttribute("aria-pressed", "true");
42994317 await expect(page.locator("#objectVectorStudioV2FrameTimeline [data-state-id='move']")).toHaveCount(1);
43004318 await expect(page.locator("#statusLog")).toHaveValue(/OK Created state Move with frame frame-1\./);
4301- await addStateButton.click();
4302- await expect(page.locator("#statusLog")).toHaveValue(/WARN Create state skipped: Move already exists for Group State\./);
4319+ await expect(addStateButton).toBeDisabled();
43034320 await expect(statePanel.locator("[data-object-state-tile='move']")).toHaveCount(1);
43044321
43054322 await expect(objectTile.locator("[data-shape-group-id='group-1']")).toHaveCount(2);
@@ -4310,9 +4327,11 @@ test.describe("Workspace Manager V2 bootstrap", () => {
43104327 app.renderPayload();
43114328 });
43124329 const selectedShapeActions = objectTile.locator(".object-vector-studio-v2__shape-list-actions");
4330+ await expect(selectedShapeActions.locator("[data-shape-list-action='ungroup']")).toBeEnabled();
43134331 await selectedShapeActions.locator("[data-shape-list-action='ungroup']").click();
43144332 await expect(page.locator("#objectVectorStudioV2JsonDetails")).not.toContainText('"groupId": "group-1"');
43154333 await expect(objectTile.locator("[data-shape-group-id='group-1']")).toHaveCount(0);
4334+ await expect(selectedShapeActions.locator("[data-shape-list-action='ungroup']")).toBeDisabled();
43164335 await expect(page.locator("#statusLog")).toHaveValue(/OK Ungrouped 1 selected shapes from group-1\./);
43174336
43184337 expect(pageErrors).toEqual([]);
0 commit comments