2026-04-27 12:55:12 -04:00
|
|
|
import {
|
|
|
|
|
checkForScreenshot,
|
|
|
|
|
screenShotPaths,
|
|
|
|
|
test,
|
|
|
|
|
visitStudy,
|
|
|
|
|
waitForViewportRenderCycle,
|
|
|
|
|
waitForViewportsRendered,
|
|
|
|
|
} from './utils';
|
2025-02-26 11:23:40 -05:00
|
|
|
|
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
|
|
|
const studyInstanceUID = '1.3.12.2.1107.5.2.32.35162.30000015050317233592200000046';
|
|
|
|
|
const mode = 'viewer';
|
|
|
|
|
await visitStudy(page, studyInstanceUID, mode, 2000);
|
|
|
|
|
});
|
|
|
|
|
|
2025-12-12 13:46:45 -03:00
|
|
|
test('should properly display MPR for MR', async ({
|
|
|
|
|
page,
|
|
|
|
|
DOMOverlayPageObject,
|
|
|
|
|
leftPanelPageObject,
|
|
|
|
|
mainToolbarPageObject,
|
|
|
|
|
rightPanelPageObject,
|
2026-04-27 12:55:12 -04:00
|
|
|
viewportPageObject,
|
2025-12-12 13:46:45 -03:00
|
|
|
}) => {
|
|
|
|
|
await rightPanelPageObject.toggle();
|
2025-04-04 12:11:29 -04:00
|
|
|
|
2025-11-20 11:29:14 -03:00
|
|
|
await mainToolbarPageObject.layoutSelection.MPR.click();
|
2025-04-04 12:11:29 -04:00
|
|
|
|
2026-04-27 12:55:12 -04:00
|
|
|
await waitForViewportsRendered(page);
|
|
|
|
|
|
|
|
|
|
await checkForScreenshot(
|
|
|
|
|
page,
|
|
|
|
|
viewportPageObject.grid,
|
|
|
|
|
screenShotPaths.segHydrationFromMPR.mprBeforeSEG
|
|
|
|
|
);
|
2025-04-04 12:11:29 -04:00
|
|
|
|
2025-12-12 13:46:45 -03:00
|
|
|
await leftPanelPageObject.loadSeriesByDescription('SEG');
|
2025-02-26 11:23:40 -05:00
|
|
|
|
2026-06-16 11:59:04 -04:00
|
|
|
// SEG load triggers a progressive labelmap volume upload. waitForViewportsRendered
|
|
|
|
|
// (waitVolumeLoad defaults to true) polls the viewport volume actors until the
|
|
|
|
|
// labelmap reports loadStatus.loaded, then settles, so the screenshot captures the
|
|
|
|
|
// finished upload rather than a mid-stream frame.
|
2026-04-27 12:55:12 -04:00
|
|
|
await waitForViewportsRendered(page);
|
|
|
|
|
|
|
|
|
|
await checkForScreenshot(
|
|
|
|
|
page,
|
|
|
|
|
viewportPageObject.grid,
|
|
|
|
|
screenShotPaths.segHydrationFromMPR.mprAfterSEG
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// start watching for viewports to render
|
|
|
|
|
const viewportRenderCycle = waitForViewportRenderCycle(page);
|
2025-04-04 12:11:29 -04:00
|
|
|
|
2025-12-12 13:46:45 -03:00
|
|
|
await DOMOverlayPageObject.viewport.segmentationHydration.yes.click();
|
2025-04-04 12:11:29 -04:00
|
|
|
|
2026-04-27 12:55:12 -04:00
|
|
|
await viewportRenderCycle;
|
2026-06-16 11:59:04 -04:00
|
|
|
// Hydration propagates the labelmap volume to the sagittal/coronal MPR viewports
|
|
|
|
|
// asynchronously, adding new volume actors after the first render cycle resolves.
|
|
|
|
|
// waitForViewportsRendered re-polls every viewport's volume actors until those
|
|
|
|
|
// propagated labelmaps report loadStatus.loaded, then settles.
|
|
|
|
|
await waitForViewportsRendered(page);
|
2026-04-27 12:55:12 -04:00
|
|
|
|
|
|
|
|
await checkForScreenshot(
|
|
|
|
|
page,
|
|
|
|
|
viewportPageObject.grid,
|
|
|
|
|
screenShotPaths.segHydrationFromMPR.mprAfterSegHydrated
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const viewportRenderAfterLayoutChange = waitForViewportRenderCycle(page);
|
2025-02-26 11:23:40 -05:00
|
|
|
|
2025-11-20 11:29:14 -03:00
|
|
|
await mainToolbarPageObject.layoutSelection.axialPrimary.click();
|
2025-02-26 11:23:40 -05:00
|
|
|
|
2026-04-27 12:55:12 -04:00
|
|
|
await viewportRenderAfterLayoutChange;
|
2026-06-16 11:59:04 -04:00
|
|
|
// The layout change rebuilds the viewports; wait for their volume actors (image
|
|
|
|
|
// + labelmap) to report loaded before settling and capturing.
|
|
|
|
|
await waitForViewportsRendered(page);
|
2026-04-27 12:55:12 -04:00
|
|
|
|
2025-02-26 11:23:40 -05:00
|
|
|
await checkForScreenshot(
|
|
|
|
|
page,
|
2026-04-27 12:55:12 -04:00
|
|
|
viewportPageObject.grid,
|
2025-04-04 12:11:29 -04:00
|
|
|
screenShotPaths.segHydrationFromMPR.mprAfterSegHydratedAfterLayoutChange
|
2025-02-26 11:23:40 -05:00
|
|
|
);
|
|
|
|
|
});
|