Skip to content

Commit 438d739

Browse files
author
DavidQ
committed
Fix Object Preview default zoom normalization and update zoom range constants - PR_26133_007-object-preview-zoom-default-and-range-fix
1 parent 033c71d commit 438d739

4 files changed

Lines changed: 50 additions & 44 deletions

File tree

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# PR_26133_006 Playwright V8 Coverage Report
1+
# PR_26133_007 Playwright V8 Coverage Report
22

33
Coverage source: `docs/dev/reports/playwright_v8_coverage_report.txt`, refreshed by the final `npm run test:workspace-v2` run.
44

@@ -7,7 +7,7 @@ Coverage source: `docs/dev/reports/playwright_v8_coverage_report.txt`, refreshed
77
- Coverage is advisory only; no thresholds are enforced.
88
- Workspace Manager V2 entry point: 91%.
99
- Object Vector Studio V2 runtime coverage entries from the generated report:
10-
- `tools/object-vector-studio-v2/js/ToolStarterApp.js`: 91%, executed lines 3313/3313, executed functions 349/384.
10+
- `tools/object-vector-studio-v2/js/ToolStarterApp.js`: 91%, executed lines 3313/3313, executed functions 348/384.
1111
- `tools/object-vector-studio-v2/js/bootstrap.js`: 80%, executed lines 99/99, executed functions 4/5.
1212
- The generated report lists `tools/object-vector-studio-v2/js/ToolStarterApp.js` as a changed JS file with browser V8 coverage.
1313

@@ -16,4 +16,4 @@ Coverage source: `docs/dev/reports/playwright_v8_coverage_report.txt`, refreshed
1616
- Main command: `npm run test:workspace-v2`.
1717
- Result: 46 passed.
1818
- Focused Object Vector Studio V2 layout and preview-coordinate scenarios also passed.
19-
- Manual Object Preview probe confirmed normalized zoom display, unchanged visual scale, and no console/runtime errors.
19+
- Manual Object Preview probe confirmed default zoom display, 1% control steps, min/max range, unchanged visual scale, and no console/runtime errors.
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
1-
# PR_26133_006 Workspace V2 Results
1+
# PR_26133_007 Workspace V2 Results
22

33
## Command Results
44

55
- `node --check tools/object-vector-studio-v2/js/ToolStarterApp.js`: passed.
66
- `node --check tests/playwright/tools/WorkspaceManagerV2.spec.mjs`: passed.
77
- `npx playwright test tests/playwright/tools/WorkspaceManagerV2.spec.mjs --grep "Object Vector Studio V2 (layout shell|preview coordinates)"`: 2 passed.
8-
- `npm run test:workspace-v2`: 46 passed.
8+
- `npx playwright test tests/playwright/tools/WorkspaceManagerV2.spec.mjs --grep "blocks Workspace Manager V2 Save when the toolState file fails schema validation"`: 1 passed after the test setup waited for the Asset Manager V2 session before corrupting it.
9+
- Final `npm run test:workspace-v2`: 46 passed.
910
- `git diff --check`: passed with the existing LF-to-CRLF working-copy warning for `tests/playwright/tools/WorkspaceManagerV2.spec.mjs`.
1011

1112
## Targeted Object Preview Verification
1213

1314
- Standalone Playwright manual probe reported `consoleErrors: []` and `pageErrors: []`.
14-
- Object Preview visuals remained unchanged: grid step `10`, viewBox `-640 -440 1280 880` at internal 25%, and Asteroids ship drawn points `0,-180`, `140,160`, `0,80`, `-140,160`.
15-
- Internal zoom `0.1` displayed as `Zoom 100%`.
16-
- Internal zoom `0.095` displayed as `Zoom 95%`.
17-
- Zoom buttons continued changing the internal zoom/viewBox the same way: one zoom out from reset displayed `Zoom 900%`, one zoom in back to reset displayed `Zoom 1000%`, and internal 25% displayed `Zoom 250%`.
18-
- Pointer and origin coordinate normalization from PR_26133_005 remains intact.
15+
- Startup/default Object Preview display is `Origin: 0, 0 | Canvas 0,0 centered | Zoom 100%`.
16+
- Zoom controls increment/decrement by 1%: zoom in displays `Zoom 101%`, then zoom out returns to `Zoom 100%`.
17+
- Zoom range clamps to the updated constants: max displays `Zoom 200%` with viewBox `-80 -55 160 110`; min displays `Zoom 1%` with viewBox `-16000 -11000 32000 22000`.
18+
- Visual scale remains unchanged at default: viewBox `-160 -110 320 220`, grid step `10`, and Asteroids ship drawn points `0,-180`, `140,160`, `0,80`, `-140,160`.
19+
- Pointer/origin coordinate normalization from PR_26133_005 remains intact.
1920

2021
## Contract Checks
2122

22-
- Visual rendering was not changed.
23+
- `const MAX_ZOOM = 2;`, `const MIN_ZOOM = 0.01;`, and `const ZOOM_STEP = 0.01;` are applied.
2324
- Canvas size was not changed.
2425
- Grid size was not changed.
2526
- Object drawing scale was not changed.
26-
- Pointer/origin coordinate normalization was not changed.
27+
- Coordinate normalization logic was not changed.
2728
- No unrelated tool/runtime files were changed.
28-
- No fallback behavior was added.

tests/playwright/tools/WorkspaceManagerV2.spec.mjs

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1838,32 +1838,35 @@ test.describe("Workspace Manager V2 bootstrap", () => {
18381838
await expect(page.locator("#statusLog")).toHaveValue(/OK Shape\/Tools mode selected from keyboard: select\./);
18391839

18401840
await page.locator("#objectVectorStudioV2ZoomInButton").click();
1841-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 1100%");
1842-
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-145.455 -100 290.909 200");
1841+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 101%");
1842+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-158.416 -108.911 316.832 217.822");
18431843
await page.locator("#objectVectorStudioV2PanRightButton").click();
1844-
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-125.455 -100 290.909 200");
1845-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 2, 0 | Canvas 0,0 centered | Zoom 1100%");
1844+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-138.416 -108.911 316.832 217.822");
1845+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 2, 0 | Canvas 0,0 centered | Zoom 101%");
18461846
await page.locator("#objectVectorStudioV2ResetViewButton").click();
18471847
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-160 -110 320 220");
1848-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 1000%");
1849-
await expect(page.locator("#statusLog")).toHaveValue(/OK Viewport reset to 1000% at origin 0,0\./);
1850-
await page.evaluate(() => {
1851-
window.__objectVectorStudioV2App.viewport.zoom = 0.1;
1852-
window.__objectVectorStudioV2App.updateViewport();
1853-
});
18541848
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 100%");
1849+
await expect(page.locator("#statusLog")).toHaveValue(/OK Viewport reset to 100% at origin 0,0\./);
18551850
await page.evaluate(() => {
1856-
window.__objectVectorStudioV2App.viewport.zoom = 0.095;
1851+
window.__objectVectorStudioV2App.viewport.zoom = 0.95;
18571852
window.__objectVectorStudioV2App.updateViewport();
18581853
});
18591854
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 95%");
1855+
await page.evaluate(() => {
1856+
window.__objectVectorStudioV2App.zoomViewport(2.5);
1857+
});
1858+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 200%");
1859+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-80 -55 160 110");
1860+
await page.evaluate(() => {
1861+
window.__objectVectorStudioV2App.zoomViewport(0);
1862+
});
1863+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 1%");
1864+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-16000 -11000 32000 22000");
18601865
await page.locator("#objectVectorStudioV2ResetViewButton").click();
18611866
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-160 -110 320 220");
18621867
await page.locator("#objectVectorStudioV2RenderSurface").hover();
1863-
for (let index = 0; index < 40; index += 1) {
1864-
await page.mouse.wheel(0, -240);
1865-
}
1866-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 4000%");
1868+
await page.mouse.wheel(0, -240);
1869+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 101%");
18671870
await expect(page.locator("#objectVectorStudioV2RenderSurface [data-grid-rendered='true']")).toHaveCount(1);
18681871
await expect(page.locator("#objectVectorStudioV2RenderSurface [data-center-origin='0,0']")).toHaveCount(1);
18691872
const zoomedGridState = await page.locator("#objectVectorStudioV2RenderSurface").evaluate((surface) => ({
@@ -1873,11 +1876,13 @@ test.describe("Workspace Manager V2 bootstrap", () => {
18731876
}));
18741877
expect(zoomedGridState.backgroundImage).toBe("none");
18751878
expect(zoomedGridState.gridLineCount).toBeGreaterThan(0);
1876-
expect(zoomedGridState.viewBox).toBe("-40 -27.5 80 55");
1877-
for (let index = 0; index < 60; index += 1) {
1878-
await page.mouse.wheel(0, 240);
1879-
}
1880-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 250%");
1879+
expect(zoomedGridState.viewBox).toBe("-158.416 -108.911 316.832 217.822");
1880+
await page.mouse.wheel(0, 240);
1881+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 100%");
1882+
await page.evaluate(() => {
1883+
window.__objectVectorStudioV2App.zoomViewport(0.25);
1884+
});
1885+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 25%");
18811886
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-640 -440 1280 880");
18821887
await page.locator("#objectVectorStudioV2ResetViewButton").click();
18831888

@@ -2136,10 +2141,10 @@ test.describe("Workspace Manager V2 bootstrap", () => {
21362141
});
21372142
await expect(page.locator("#statusLog")).toHaveValue(/OK Render mode svg-work-surface: rendered Asteroids Ship Grid Check with 1 visible shapes; capture mode none\./);
21382143
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-160 -110 320 220");
2139-
for (let index = 0; index < 8; index += 1) {
2140-
await page.locator("#objectVectorStudioV2ZoomOutButton").click();
2141-
}
2142-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 250%");
2144+
await page.evaluate(() => {
2145+
window.__objectVectorStudioV2App.zoomViewport(0.25);
2146+
});
2147+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 25%");
21432148
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-640 -440 1280 880");
21442149

21452150
const readPreviewScale = async () => page.locator("#objectVectorStudioV2RenderSurface").evaluate((surface) => {
@@ -2219,10 +2224,10 @@ test.describe("Workspace Manager V2 bootstrap", () => {
22192224

22202225
await page.locator("#objectVectorStudioV2PanRightButton").click();
22212226
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-620 -440 1280 880");
2222-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 2, 0 | Canvas 0,0 centered | Zoom 250%");
2227+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 2, 0 | Canvas 0,0 centered | Zoom 25%");
22232228
await page.locator("#objectVectorStudioV2PanLeftButton").click();
22242229
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-640 -440 1280 880");
2225-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 250%");
2230+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 25%");
22262231
const examplePointerScreen = await page.locator("#objectVectorStudioV2RenderSurface").evaluate((surface) => {
22272232
const point = surface.createSVGPoint();
22282233
point.x = -140;
@@ -2235,7 +2240,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
22352240
clientX: examplePointerScreen.x,
22362241
clientY: examplePointerScreen.y
22372242
});
2238-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Pointer -14, -16 | Canvas origin 0,0 centered | Zoom 250%");
2243+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Pointer -14, -16 | Canvas origin 0,0 centered | Zoom 25%");
22392244
await page.setViewportSize({ width: 1040, height: 720 });
22402245
const resizedPreviewScale = await readPreviewScale();
22412246
expect(resizedPreviewScale.aspectRatioStable).toBe(true);
@@ -7032,6 +7037,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
70327037
try {
70337038
await selectMockRepo(page);
70347039
await page.locator("#activeGameSelect").selectOption("Asteroids");
7040+
await expect.poll(() => page.evaluate(() => sessionStorage.getItem("workspace.tools.asset-manager-v2"))).not.toBeNull();
70357041
await page.evaluate(() => {
70367042
const app = window.__workspaceManagerV2App;
70377043
const session = JSON.parse(window.sessionStorage.getItem("workspace.tools.asset-manager-v2"));

tools/object-vector-studio-v2/js/ToolStarterApp.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ const SVG_NS = "http://www.w3.org/2000/svg";
1212
const DEFAULT_VIEWPORT = Object.freeze({ height: 220, width: 320, x: 0, y: 0, zoom: 1 });
1313
const GRID_STEP = 10;
1414
const OBJECT_PREVIEW_DRAWING_SCALE = GRID_STEP;
15-
const MAX_ZOOM = 1;
16-
const MIN_ZOOM = 0.25;
17-
const ZOOM_STEP = 0.1;
15+
const MAX_ZOOM = 2;
16+
const MIN_ZOOM = 0.01;
17+
const ZOOM_STEP = 0.01;
1818

1919
const OBJECT_STATE_IDS = Object.freeze(["idle", "thrust", "damaged", "destroyed", "active", "inactive"]);
2020

@@ -1884,7 +1884,7 @@ export class ToolStarterApp {
18841884
}
18851885

18861886
formatZoomPercentage() {
1887-
return Math.round(this.viewport.zoom * 100 * GRID_STEP);
1887+
return Math.round(this.viewport.zoom * 100);
18881888
}
18891889

18901890
zoomViewportByStep(step) {

0 commit comments

Comments
 (0)