diff --git a/platform/viewer/cypress/integration/common/OHIFCornerstoneHotkeys.spec.js b/platform/viewer/cypress/integration/common/OHIFCornerstoneHotkeys.spec.js new file mode 100644 index 000000000..f525b61a2 --- /dev/null +++ b/platform/viewer/cypress/integration/common/OHIFCornerstoneHotkeys.spec.js @@ -0,0 +1,153 @@ +describe('OHIF Cornerstone Hotkeys', () => { + before(() => { + cy.openStudy('MISTER^MR'); + cy.waitDicomImage(); + cy.expectMinimumThumbnails(3); + }); + + beforeEach(() => { + cy.initCornerstoneToolsAliases(); + cy.initCommonElementsAliases(); + cy.resetViewport(); + }); + + it('checks if hotkeys "R" and "L" can rotate the image', () => { + // Hotkey R + cy.get('body').type('R'); + cy.get('@viewportInfoMidLeft').should('contains.text', 'P'); + cy.get('@viewportInfoMidTop').should('contains.text', 'R'); + // Hotkey L + cy.get('body').type('L'); + cy.get('@viewportInfoMidLeft').should('contains.text', 'R'); + cy.get('@viewportInfoMidTop').should('contains.text', 'A'); + }); + + it('checks if hotkeys "ArrowUp" and "ArrowDown" can navigate in the stack', () => { + // Hotkey ArrowDown + cy.get('body').type('{downarrow}'); + cy.get('@viewportInfoBottomLeft').should('contains.text', 'Img: 2 2/26'); + // Hotkey ArrowUp + cy.get('body').type('{uparrow}'); + cy.get('@viewportInfoBottomLeft').should('contains.text', 'Img: 1 1/26'); + }); + + it('checks if hotkeys "V" and "H" can flip the image', () => { + // Hotkey V + cy.get('body').type('V'); + cy.get('@viewportInfoMidLeft').should('contains.text', 'L'); + cy.get('@viewportInfoMidTop').should('contains.text', 'A'); + // Hotkey H + cy.get('body').type('H'); + cy.get('@viewportInfoMidLeft').should('contains.text', 'L'); + cy.get('@viewportInfoMidTop').should('contains.text', 'P'); + }); + + it('checks if hotkey "I" can invert the image', () => { + // Hotkey I + cy.get('body').type('I'); + // Visual comparison + cy.screenshot(); + cy.percyCanvasSnapshot('Hotkey I - invert image'); + }); + + it('checks if hotkeys "+", "-" and "=" can zoom in, out and fit to viewport', () => { + // Hotkey + + cy.get('body').type('+++'); // Press hotkey 3 times + cy.get('@viewportInfoBottomRight').should('contains.text', 'Zoom: 256%'); + // Hotkey - + cy.get('body').type('-'); + cy.get('@viewportInfoBottomRight').should('contains.text', 'Zoom: 241%'); + // Hotkey = + cy.get('body').type('='); + cy.get('@viewportInfoBottomRight').should('contains.text', 'Zoom: 211%'); + }); + + it('checks if hotkey "SPACEBAR" can reset the image', () => { + // Press multiples hotkeys + cy.get('body').type('V+++I'); + cy.get('@viewportInfoMidLeft').should('contains.text', 'L'); + cy.get('@viewportInfoMidTop').should('contains.text', 'A'); + cy.get('@viewportInfoBottomRight').should('contains.text', 'Zoom: 256%'); + + // Hotkey SPACEBAR + cy.get('body').type(' '); + cy.get('@viewportInfoMidLeft').should('contains.text', 'R'); + cy.get('@viewportInfoMidTop').should('contains.text', 'A'); + cy.get('@viewportInfoBottomRight').should('contains.text', 'Zoom: 211%'); + + // Visual comparison to make sure the 'inverted' image was reset + cy.screenshot(); + cy.percyCanvasSnapshot('Hotkey SPACEBAR - Reset Image'); + }); + + it('uses hotkeys "RightArrow" and "LeftArrow" to navigate between multiple viewports', () => { + //Click on Layout button + cy.get('@layoutBtn').click(); + //Select 3 viewports + cy.get('tbody > :nth-child(1) > :nth-child(3)').click(); + + // Press multiples hotkeys on viewport #1 + cy.get('body').type('VL+++I'); + cy.get('@viewportInfoMidLeft').should('contains.text', 'A'); + cy.get('@viewportInfoMidTop').should('contains.text', 'R'); + cy.get('@viewportInfoBottomRight').should('contains.text', 'Zoom: 134%'); + + // Hotkey RightArrow: Move to next viewport + cy.get('body').type('{rightarrow}'); + + // Get overlay information from viewport #2 + cy.get( + ':nth-child(2) > .viewport-wrapper > .viewport-element > .ViewportOrientationMarkers.noselect > .top-mid.orientation-marker' + ).as('viewport2InfoMidTop'); + cy.get( + ':nth-child(2) > .viewport-wrapper > .viewport-element > .ViewportOrientationMarkers.noselect > .left-mid.orientation-marker' + ).as('viewport2InfoMidLeft'); + cy.get( + ':nth-child(2) > .viewport-wrapper > .viewport-element > .ViewportOverlay > div.bottom-right.overlay-element > div' + ).as('viewport2InfoBottomRight'); + + // Press multiples hotkeys on viewport #2 + cy.get('body').type('RR++H+++I'); + cy.get('@viewport2InfoMidLeft').should('contains.text', 'P'); + cy.get('@viewport2InfoMidTop').should('contains.text', 'H'); + cy.get('@viewport2InfoBottomRight').should('contains.text', 'Zoom: 120%'); + + // Hotkey LeftArrow: Move to previous viewport + cy.get('body').type('{leftarrow}'); + + // Hotkey SPACEBAR: Reset viewport #1 + cy.get('body').type(' '); + cy.get('@viewportInfoMidLeft').should('contains.text', 'R'); + cy.get('@viewportInfoMidTop').should('contains.text', 'A'); + cy.get('@viewportInfoBottomRight').should('contains.text', 'Zoom: 89%'); + + // Hotkey RightArrow: Move to next viewport + cy.get('body').type('{rightarrow}'); + + // Hotkey SPACEBAR: Reset viewport #2 + cy.get('body').type(' '); + cy.get('@viewport2InfoMidLeft').should('contains.text', 'A'); + cy.get('@viewport2InfoMidTop').should('contains.text', 'H'); + cy.get('@viewport2InfoBottomRight').should('contains.text', 'Zoom: 45%'); + }); + + //TO-DO: This test is blocked by issue #1095 (https://github.com/OHIF/Viewers/issues/1095) + //Once issue is fixed, this test can be uncommented + // it('checks if hotkey "Z" activates zoom tool', () => { + // // Hotkey Z + // cy.get('body').type('Z'); + // // Verify if icon is active on toolbar + // cy.get('@zoomBtn').should('have.class', 'active'); + // }); + + //TO-DO: This test is blocked by issue #1095 (https://github.com/OHIF/Viewers/issues/1095) + //Once issue is fixed, this test can be uncommented + // it('checks if hotkeys "PageDown" and "PageUp" can navigate in the series thumbnails', () => { + // // Hotkey PageDown + // cy.get('body').type('{pagedown}{pagedown}'); // press hotkey twice + // cy.get('@viewportInfoBottomLeft').should('contains.text', 'Ser: 3'); + // // Hotkey PageUp + // cy.get('body').type('{pageup}'); + // cy.get('@viewportInfoBottomLeft').should('contains.text', 'Ser: 2'); + // }); +}); diff --git a/platform/viewer/cypress/integration/common/OHIFCornerstoneToolbar.spec.js b/platform/viewer/cypress/integration/common/OHIFCornerstoneToolbar.spec.js index 643d74e81..380622430 100644 --- a/platform/viewer/cypress/integration/common/OHIFCornerstoneToolbar.spec.js +++ b/platform/viewer/cypress/integration/common/OHIFCornerstoneToolbar.spec.js @@ -66,7 +66,7 @@ describe('OHIF Cornerstone Toolbar', () => { }); it('checks if Zoom tool will zoom in/out an image in the viewport', () => { - //Click on button and vefiry if icon is active on toolbar + //Click on button and verify if icon is active on toolbar cy.get('@zoomBtn') .click() .then($zoomBtn => { diff --git a/platform/viewer/cypress/support/aliases.js b/platform/viewer/cypress/support/aliases.js index ec9a246eb..1f22d200f 100644 --- a/platform/viewer/cypress/support/aliases.js +++ b/platform/viewer/cypress/support/aliases.js @@ -30,6 +30,8 @@ export function initCommonElementsAliases() { cy.get('div.ViewportOverlay > div.bottom-right.overlay-element > div').as( 'viewportInfoBottomRight' ); + cy.get('.left-mid.orientation-marker').as('viewportInfoMidLeft'); + cy.get('.top-mid.orientation-marker').as('viewportInfoMidTop'); } //Creating aliases for Routes