From 2e5e8b2259b9b2ef4f78dfa036f5fbc9622102fc Mon Sep 17 00:00:00 2001 From: akhuoa Date: Fri, 26 Sep 2025 15:03:06 +1200 Subject: [PATCH 01/15] Update flatmap-viewer version --- src/components/FlatmapVuer.vue | 2 +- src/components/MultiFlatmapVuer.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/FlatmapVuer.vue b/src/components/FlatmapVuer.vue index 22627f97..73d26715 100644 --- a/src/components/FlatmapVuer.vue +++ b/src/components/FlatmapVuer.vue @@ -647,7 +647,7 @@ import { import { capitalise } from './utilities.js' import yellowstar from '../icons/yellowstar' import ResizeSensor from 'css-element-queries/src/ResizeSensor' -import * as flatmap from 'https://cdn.jsdelivr.net/npm/@abi-software/flatmap-viewer@4.3.0/+esm' +import * as flatmap from 'https://cdn.jsdelivr.net/npm/@abi-software/flatmap-viewer@4.3.1/+esm' import { AnnotationService } from '@abi-software/sparc-annotation' import { mapState } from 'pinia' import { useMainStore } from '@/store/index' diff --git a/src/components/MultiFlatmapVuer.vue b/src/components/MultiFlatmapVuer.vue index a590da7a..ae244f66 100644 --- a/src/components/MultiFlatmapVuer.vue +++ b/src/components/MultiFlatmapVuer.vue @@ -104,7 +104,7 @@ import { markRaw } from 'vue' import EventBus from './EventBus' import FlatmapVuer from './FlatmapVuer.vue' -import * as flatmap from 'https://cdn.jsdelivr.net/npm/@abi-software/flatmap-viewer@4.3.0/+esm' +import * as flatmap from 'https://cdn.jsdelivr.net/npm/@abi-software/flatmap-viewer@4.3.1/+esm' import { ElCol as Col, ElOption as Option, From a5e9a007561b302b9cb8c59d120a3b3929d25de6 Mon Sep 17 00:00:00 2001 From: akhuoa Date: Fri, 26 Sep 2025 15:04:09 +1200 Subject: [PATCH 02/15] Fix connectivity source check --- src/components/FlatmapVuer.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/FlatmapVuer.vue b/src/components/FlatmapVuer.vue index 73d26715..0e004469 100644 --- a/src/components/FlatmapVuer.vue +++ b/src/components/FlatmapVuer.vue @@ -1808,7 +1808,7 @@ export default { setConnectivityDataSource: function (viewingMode, data) { // Exploration mode, only path click will be used as data source if (viewingMode === 'Exploration') { - this.connectivityDataSource = data.models.startsWith('ilxtr:') ? data.models : ''; + this.connectivityDataSource = data.models?.startsWith('ilxtr:') ? data.models : ''; } else { // Other modes, it can be anything // (annotation drawing doesn't have featureId or models) From e32ae47160b78dcbce854ea44db08e3f45a8e1d6 Mon Sep 17 00:00:00 2001 From: akhuoa Date: Mon, 29 Sep 2025 13:04:02 +1300 Subject: [PATCH 03/15] Add visual component test for test flatmap --- cypress/component/VisualTest.cy.js | 90 ++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 cypress/component/VisualTest.cy.js diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js new file mode 100644 index 00000000..58b74a71 --- /dev/null +++ b/cypress/component/VisualTest.cy.js @@ -0,0 +1,90 @@ +/* eslint-disable no-alert, no-console */ + +const ERROR_TOLERANCE = parseFloat(Cypress.env('ERROR_TOLERANCE')) || 0.1 + + +describe('MultiFlatmapVuer Screenshot Comparison', () => { + + beforeEach(() => { + cy.viewport(1920, 1080); + cy.fixture('MultiFlatmapPropsDevel.json').then((props) => { + const modifiedProps = { + ...props, + displayMinimap: false, + }; + cy.wrap(modifiedProps).as('develProps'); + }); + }); + + it('should render the same content as base map', () => { + // Use the existing loadMultiFlatmap command + cy.loadMultiFlatmap('@develProps', 'Test'); + + // Wait for MultiFlatmap to be ready + cy.get('@readySpy').should('have.been.called'); + + // Wait for the map canvas to appear (indicates component is ready) + cy.get('.maplibregl-touch-zoom-rotate > .maplibregl-canvas:visible', { timeout: 30000 }).should('exist'); + + cy.wait(1000); + cy.get('.el-loading-mask', { timeout: 30000 }).should('not.exist'); // Hide drawer + + // hide species-display-text + cy.get('.species-display-text').invoke('hide'); + // hide sepcies select box + cy.get('.el-select.select-box').invoke('hide'); + // hide beta-popovers + cy.get('.beta-popovers').invoke('hide'); + // hide minimap-resize + cy.get('.minimap-resize').invoke('hide'); + // hide bottom-right-control + cy.get('.bottom-right-control').invoke('hide'); + // hide pathway-location + cy.get('.pathway-location').invoke('hide'); + // hide settings-group + cy.get('.settings-group').invoke('hide'); + cy.wait(2000); + + // Take screenshot of viewer canvas + cy.get('.maplibregl-touch-zoom-rotate > .maplibregl-canvas:visible').as('viewerCanvas'); + cy.get('@viewerCanvas').screenshot('viewer-canvas'); + + // Get the flatmap UUID and API from the loaded component + cy.window().then((win) => { + const flatmapVuer = win.Cypress.multiFlatmapVuer.getCurrentFlatmap(); + const flatmapUUID = flatmapVuer.mapImp.uuid; + + cy.get('@develProps').then((props) => { + const flatmapAPI = props.flatmapAPI; + const baseMapUrl = `${flatmapAPI}flatmap/${flatmapUUID}`; + + // Create iframe in the same document to load base map + cy.document().then((doc) => { + // Clear the body and add iframe + doc.body.innerHTML = ''; + const iframe = doc.createElement('iframe'); + iframe.src = baseMapUrl; + iframe.style.width = '100%'; + iframe.style.height = '100vh'; + iframe.style.border = 'none'; + iframe.id = 'base-map-iframe'; + doc.body.appendChild(iframe); + + // Wait for iframe to load and render + cy.get('#base-map-iframe', { timeout: 30000 }).should('exist'); + cy.wait(8000); + + // Take screenshot of iframe + cy.get('#base-map-iframe').as('baseMapIframe'); + cy.get('@baseMapIframe').screenshot('base-canvas'); + + // Compare screenshots + cy.get('@baseMapIframe').compareSnapshot('viewer-canvas').then(comparisonResults => { + expect(comparisonResults.percentage, 'Base map and viewer map should render identically').to.be.lessThan(ERROR_TOLERANCE); + }); + }); + }); + }); + }); + +}); \ No newline at end of file From 4a358149ce4c7fd01715261d97551b585c66596e Mon Sep 17 00:00:00 2001 From: akhuoa Date: Mon, 29 Sep 2025 13:20:44 +1300 Subject: [PATCH 04/15] Update disable UI method in visual test --- cypress/component/VisualTest.cy.js | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js index 58b74a71..fa020169 100644 --- a/cypress/component/VisualTest.cy.js +++ b/cypress/component/VisualTest.cy.js @@ -1,8 +1,6 @@ /* eslint-disable no-alert, no-console */ - const ERROR_TOLERANCE = parseFloat(Cypress.env('ERROR_TOLERANCE')) || 0.1 - describe('MultiFlatmapVuer Screenshot Comparison', () => { beforeEach(() => { @@ -11,38 +9,23 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { const modifiedProps = { ...props, displayMinimap: false, + disableUI: true, }; cy.wrap(modifiedProps).as('develProps'); }); }); it('should render the same content as base map', () => { - // Use the existing loadMultiFlatmap command cy.loadMultiFlatmap('@develProps', 'Test'); // Wait for MultiFlatmap to be ready cy.get('@readySpy').should('have.been.called'); - // Wait for the map canvas to appear (indicates component is ready) + // Wait for the map canvas to appear cy.get('.maplibregl-touch-zoom-rotate > .maplibregl-canvas:visible', { timeout: 30000 }).should('exist'); cy.wait(1000); cy.get('.el-loading-mask', { timeout: 30000 }).should('not.exist'); // Hide drawer - - // hide species-display-text - cy.get('.species-display-text').invoke('hide'); - // hide sepcies select box - cy.get('.el-select.select-box').invoke('hide'); - // hide beta-popovers - cy.get('.beta-popovers').invoke('hide'); - // hide minimap-resize - cy.get('.minimap-resize').invoke('hide'); - // hide bottom-right-control - cy.get('.bottom-right-control').invoke('hide'); - // hide pathway-location - cy.get('.pathway-location').invoke('hide'); - // hide settings-group - cy.get('.settings-group').invoke('hide'); cy.wait(2000); // Take screenshot of viewer canvas @@ -87,4 +70,4 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { }); }); -}); \ No newline at end of file +}); From 7cef87e27f9c975ba4233c5d816e1ea2a0f39346 Mon Sep 17 00:00:00 2001 From: akhuoa Date: Mon, 29 Sep 2025 14:45:10 +1300 Subject: [PATCH 05/15] Update visual test --- cypress/component/VisualTest.cy.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js index fa020169..f2c38cd4 100644 --- a/cypress/component/VisualTest.cy.js +++ b/cypress/component/VisualTest.cy.js @@ -21,22 +21,22 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { // Wait for MultiFlatmap to be ready cy.get('@readySpy').should('have.been.called'); - // Wait for the map canvas to appear - cy.get('.maplibregl-touch-zoom-rotate > .maplibregl-canvas:visible', { timeout: 30000 }).should('exist'); - - cy.wait(1000); - cy.get('.el-loading-mask', { timeout: 30000 }).should('not.exist'); // Hide drawer - cy.wait(2000); - - // Take screenshot of viewer canvas - cy.get('.maplibregl-touch-zoom-rotate > .maplibregl-canvas:visible').as('viewerCanvas'); - cy.get('@viewerCanvas').screenshot('viewer-canvas'); - // Get the flatmap UUID and API from the loaded component cy.window().then((win) => { const flatmapVuer = win.Cypress.multiFlatmapVuer.getCurrentFlatmap(); const flatmapUUID = flatmapVuer.mapImp.uuid; + // Wait for the map canvas to appear + cy.get('.maplibregl-touch-zoom-rotate > .maplibregl-canvas:visible', { timeout: 30000 }).should('exist'); + + cy.wait(1000); + cy.get('.el-loading-mask', { timeout: 30000 }).should('not.exist'); // Hide drawer + cy.wait(2000); + + // Take screenshot of viewer canvas + cy.get('.maplibregl-touch-zoom-rotate > .maplibregl-canvas:visible').as('viewerCanvas'); + cy.get('@viewerCanvas').screenshot('viewer-canvas'); + cy.get('@develProps').then((props) => { const flatmapAPI = props.flatmapAPI; const baseMapUrl = `${flatmapAPI}flatmap/${flatmapUUID}`; From 2af5700a215ab851b1aa560140c64d139cb8cd7c Mon Sep 17 00:00:00 2001 From: akhuoa Date: Mon, 29 Sep 2025 15:01:38 +1300 Subject: [PATCH 06/15] Add centreline in visual test flatmap --- cypress/component/VisualTest.cy.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js index f2c38cd4..9e7555a4 100644 --- a/cypress/component/VisualTest.cy.js +++ b/cypress/component/VisualTest.cy.js @@ -24,13 +24,15 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { // Get the flatmap UUID and API from the loaded component cy.window().then((win) => { const flatmapVuer = win.Cypress.multiFlatmapVuer.getCurrentFlatmap(); - const flatmapUUID = flatmapVuer.mapImp.uuid; + const mapImp = flatmapVuer.mapImp; + const flatmapUUID = mapImp.uuid; // Wait for the map canvas to appear cy.get('.maplibregl-touch-zoom-rotate > .maplibregl-canvas:visible', { timeout: 30000 }).should('exist'); cy.wait(1000); cy.get('.el-loading-mask', { timeout: 30000 }).should('not.exist'); // Hide drawer + mapImp.enablePath('centreline', true); // Enable centreline cy.wait(2000); // Take screenshot of viewer canvas From 5fbc3f7ca1ca480fbabd7166e653d0f083c3ee31 Mon Sep 17 00:00:00 2001 From: akhuoa Date: Mon, 29 Sep 2025 18:43:39 +1300 Subject: [PATCH 07/15] Update visual test --- cypress/component/VisualTest.cy.js | 45 +++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js index 9e7555a4..21c809c1 100644 --- a/cypress/component/VisualTest.cy.js +++ b/cypress/component/VisualTest.cy.js @@ -1,6 +1,43 @@ /* eslint-disable no-alert, no-console */ const ERROR_TOLERANCE = parseFloat(Cypress.env('ERROR_TOLERANCE')) || 0.1 +// Ref: flatmap-viewer/src/layers/styling.ts +const STROKE_INTERPOLATION = [ + 'interpolate', + ['exponential', 2], + ['zoom'], + 2, ["*", ['var', 'width'], ["^", 2, 0.5]], + 7, ["*", ['var', 'width'], ["^", 2, 1.5]], + 9, ["*", ['var', 'width'], ["^", 2, 2.0]] +] + +const modifyRenderedMap = (mapImp) => { + const map = mapImp.map + mapImp.setPaint({ coloured: true, outlined: false }); + if (map) { + const layers = [ + 'simple-test_pathways_nerve-centreline-edge', + 'simple-test_pathways_nerve-centreline-track', + ]; + + layers.forEach(layerId => { + try { + map.setPaintProperty(layerId, 'line-width', [ + 'let', + 'width', + 2, + STROKE_INTERPOLATION + ]); + + map.setPaintProperty(layerId, 'line-color', '#ccc'); + map.setPaintProperty(layerId, 'line-opacity', 0.4); + } catch (error) { + console.log(`Layer ${layerId} not found or already updated`); + } + }); + } +}; + describe('MultiFlatmapVuer Screenshot Comparison', () => { beforeEach(() => { @@ -33,11 +70,16 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { cy.wait(1000); cy.get('.el-loading-mask', { timeout: 30000 }).should('not.exist'); // Hide drawer mapImp.enablePath('centreline', true); // Enable centreline + mapImp.setPaint({ coloured: true, outlined: false }); // outline false + modifyRenderedMap(mapImp); // modify centreline style cy.wait(2000); // Take screenshot of viewer canvas cy.get('.maplibregl-touch-zoom-rotate > .maplibregl-canvas:visible').as('viewerCanvas'); - cy.get('@viewerCanvas').screenshot('viewer-canvas'); + // CLI + cy.get('@viewerCanvas').screenshot('base/cypress/component/VisualTest.cy.js/viewer-canvas') + // UI + cy.get('@viewerCanvas').screenshot('VisualTest.cy.js/base/cypress/component/VisualTest.cy.js/viewer-canvas') cy.get('@develProps').then((props) => { const flatmapAPI = props.flatmapAPI; @@ -65,6 +107,7 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { // Compare screenshots cy.get('@baseMapIframe').compareSnapshot('viewer-canvas').then(comparisonResults => { + // TODO: current result 0.2663686412274386 expect(comparisonResults.percentage, 'Base map and viewer map should render identically').to.be.lessThan(ERROR_TOLERANCE); }); }); From e1c9c89132255c03e2d149292ce6e3ae358148a6 Mon Sep 17 00:00:00 2001 From: akhuoa Date: Tue, 30 Sep 2025 12:28:41 +1300 Subject: [PATCH 08/15] Update visual test --- cypress/component/VisualTest.cy.js | 69 +++++++++++++++++------------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js index 21c809c1..a28eab7a 100644 --- a/cypress/component/VisualTest.cy.js +++ b/cypress/component/VisualTest.cy.js @@ -9,33 +9,44 @@ const STROKE_INTERPOLATION = [ 2, ["*", ['var', 'width'], ["^", 2, 0.5]], 7, ["*", ['var', 'width'], ["^", 2, 1.5]], 9, ["*", ['var', 'width'], ["^", 2, 2.0]] -] - -const modifyRenderedMap = (mapImp) => { - const map = mapImp.map - mapImp.setPaint({ coloured: true, outlined: false }); - if (map) { - const layers = [ - 'simple-test_pathways_nerve-centreline-edge', - 'simple-test_pathways_nerve-centreline-track', - ]; - - layers.forEach(layerId => { - try { - map.setPaintProperty(layerId, 'line-width', [ - 'let', - 'width', - 2, - STROKE_INTERPOLATION - ]); - - map.setPaintProperty(layerId, 'line-color', '#ccc'); - map.setPaintProperty(layerId, 'line-opacity', 0.4); - } catch (error) { - console.log(`Layer ${layerId} not found or already updated`); - } - }); - } +]; +const LAYERS = [ + { + id: 'simple-test_pathways_nerve-centreline-edge', + width: 2, + color: '#ccc', + opacity: 0 + }, + { + id: 'simple-test_pathways_nerve-centreline-track', + width: 2, + color: '#ccc', + opacity: 0.2 + }, +]; + +const modifyRenderedMap = (mapImp, layers, strokeInterpolation) => { + const map = mapImp.map; + + mapImp.enablePath('centreline', true); // Enable centreline + mapImp.setPaint({ coloured: true, outlined: false }); // outline false + + layers.forEach((layer) => { + const { id: layerId, width, color, opacity } = layer; + try { + map.setPaintProperty(layerId, 'line-width', [ + 'let', + 'width', + width, + strokeInterpolation + ]); + + map.setPaintProperty(layerId, 'line-color', color); + map.setPaintProperty(layerId, 'line-opacity', opacity); + } catch (error) { + console.log(`Layer ${layerId} not found or already updated`); + } + }); }; describe('MultiFlatmapVuer Screenshot Comparison', () => { @@ -69,9 +80,7 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { cy.wait(1000); cy.get('.el-loading-mask', { timeout: 30000 }).should('not.exist'); // Hide drawer - mapImp.enablePath('centreline', true); // Enable centreline - mapImp.setPaint({ coloured: true, outlined: false }); // outline false - modifyRenderedMap(mapImp); // modify centreline style + modifyRenderedMap(mapImp, LAYERS, STROKE_INTERPOLATION); // modify centreline style cy.wait(2000); // Take screenshot of viewer canvas From ede8acd45957b293bf1bf762f0c6a987b9995976 Mon Sep 17 00:00:00 2001 From: akhuoa Date: Fri, 3 Oct 2025 11:13:52 +1300 Subject: [PATCH 09/15] Update visual test --- cypress/component/VisualTest.cy.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js index a28eab7a..5acfaea9 100644 --- a/cypress/component/VisualTest.cy.js +++ b/cypress/component/VisualTest.cy.js @@ -1,6 +1,5 @@ /* eslint-disable no-alert, no-console */ -const ERROR_TOLERANCE = parseFloat(Cypress.env('ERROR_TOLERANCE')) || 0.1 - +const ERROR_TOLERANCE = 0.00384; // Ref: flatmap-viewer/src/layers/styling.ts const STROKE_INTERPOLATION = [ 'interpolate', @@ -52,7 +51,8 @@ const modifyRenderedMap = (mapImp, layers, strokeInterpolation) => { describe('MultiFlatmapVuer Screenshot Comparison', () => { beforeEach(() => { - cy.viewport(1920, 1080); + Cypress.env('visualRegressionBaseDirectory', 'cypress/screenshots/visual-test-base'); + cy.viewport(500, 500); cy.fixture('MultiFlatmapPropsDevel.json').then((props) => { const modifiedProps = { ...props, @@ -86,9 +86,9 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { // Take screenshot of viewer canvas cy.get('.maplibregl-touch-zoom-rotate > .maplibregl-canvas:visible').as('viewerCanvas'); // CLI - cy.get('@viewerCanvas').screenshot('base/cypress/component/VisualTest.cy.js/viewer-canvas') + cy.get('@viewerCanvas').screenshot('base/cypress/component/VisualTest.cy.js/viewer-canvas', { overwrite: true }) // UI - cy.get('@viewerCanvas').screenshot('VisualTest.cy.js/base/cypress/component/VisualTest.cy.js/viewer-canvas') + cy.get('@viewerCanvas').screenshot('VisualTest.cy.js/base/cypress/component/VisualTest.cy.js/viewer-canvas', { overwrite: true }) cy.get('@develProps').then((props) => { const flatmapAPI = props.flatmapAPI; @@ -101,7 +101,7 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { const iframe = doc.createElement('iframe'); iframe.src = baseMapUrl; iframe.style.width = '100%'; - iframe.style.height = '100vh'; + iframe.style.height = '100%'; iframe.style.border = 'none'; iframe.id = 'base-map-iframe'; doc.body.appendChild(iframe); @@ -112,11 +112,10 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { // Take screenshot of iframe cy.get('#base-map-iframe').as('baseMapIframe'); - cy.get('@baseMapIframe').screenshot('base-canvas'); + cy.get('@baseMapIframe').screenshot('base-canvas', { overwrite: true }); // Compare screenshots cy.get('@baseMapIframe').compareSnapshot('viewer-canvas').then(comparisonResults => { - // TODO: current result 0.2663686412274386 expect(comparisonResults.percentage, 'Base map and viewer map should render identically').to.be.lessThan(ERROR_TOLERANCE); }); }); From f0abdf68ea18361673170a5c1cab00a5a76ccc21 Mon Sep 17 00:00:00 2001 From: akhuoa Date: Fri, 3 Oct 2025 11:16:09 +1300 Subject: [PATCH 10/15] Update visual test --- cypress/component/VisualTest.cy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js index 5acfaea9..f0377392 100644 --- a/cypress/component/VisualTest.cy.js +++ b/cypress/component/VisualTest.cy.js @@ -51,7 +51,7 @@ const modifyRenderedMap = (mapImp, layers, strokeInterpolation) => { describe('MultiFlatmapVuer Screenshot Comparison', () => { beforeEach(() => { - Cypress.env('visualRegressionBaseDirectory', 'cypress/screenshots/visual-test-base'); + Cypress.env('visualRegressionBaseDirectory', 'cypress/screenshots/base'); cy.viewport(500, 500); cy.fixture('MultiFlatmapPropsDevel.json').then((props) => { const modifiedProps = { From ecedde0e475236c539f12366d5c9fa8c9a0d7e83 Mon Sep 17 00:00:00 2001 From: akhuoa Date: Fri, 3 Oct 2025 11:39:29 +1300 Subject: [PATCH 11/15] Update comment --- cypress/component/VisualTest.cy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js index f0377392..bef036ae 100644 --- a/cypress/component/VisualTest.cy.js +++ b/cypress/component/VisualTest.cy.js @@ -79,7 +79,7 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { cy.get('.maplibregl-touch-zoom-rotate > .maplibregl-canvas:visible', { timeout: 30000 }).should('exist'); cy.wait(1000); - cy.get('.el-loading-mask', { timeout: 30000 }).should('not.exist'); // Hide drawer + cy.get('.el-loading-mask', { timeout: 30000 }).should('not.exist'); modifyRenderedMap(mapImp, LAYERS, STROKE_INTERPOLATION); // modify centreline style cy.wait(2000); From 08773fa0cfaf1214396149152e02025ddc53b9f9 Mon Sep 17 00:00:00 2001 From: akhuoa Date: Fri, 3 Oct 2025 13:13:07 +1300 Subject: [PATCH 12/15] Fix visual test screenshot base directory --- cypress/component/VisualTest.cy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js index bef036ae..0b359931 100644 --- a/cypress/component/VisualTest.cy.js +++ b/cypress/component/VisualTest.cy.js @@ -51,7 +51,7 @@ const modifyRenderedMap = (mapImp, layers, strokeInterpolation) => { describe('MultiFlatmapVuer Screenshot Comparison', () => { beforeEach(() => { - Cypress.env('visualRegressionBaseDirectory', 'cypress/screenshots/base'); + Cypress.env('visualRegressionBaseDirectory', 'cypress/screenshots/VisualTest.cy.js/base'); cy.viewport(500, 500); cy.fixture('MultiFlatmapPropsDevel.json').then((props) => { const modifiedProps = { From bfe7f64835caac6d0da3c31de29f9353e59f6f7d Mon Sep 17 00:00:00 2001 From: akhuoa Date: Thu, 16 Oct 2025 15:07:22 +1300 Subject: [PATCH 13/15] Update visual test --- cypress/component/VisualTest.cy.js | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js index 0b359931..708856a1 100644 --- a/cypress/component/VisualTest.cy.js +++ b/cypress/component/VisualTest.cy.js @@ -96,15 +96,32 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { // Create iframe in the same document to load base map cy.document().then((doc) => { - // Clear the body and add iframe - doc.body.innerHTML = ''; + doc.body.style.margin = '0'; + const iframe = doc.createElement('iframe'); + const iframeContainer = doc.createElement('div'); + + iframeContainer.style.position = 'fixed'; + iframeContainer.style.top = '0'; + iframeContainer.style.left = '0'; + iframeContainer.style.width = '500px'; + iframeContainer.style.height = '500px'; + iframeContainer.style.zIndex = '9999'; + iframe.src = baseMapUrl; + iframe.style.position = 'absolute'; + iframe.style.top = '0'; + iframe.style.left = '0'; iframe.style.width = '100%'; iframe.style.height = '100%'; iframe.style.border = 'none'; iframe.id = 'base-map-iframe'; - doc.body.appendChild(iframe); + + iframeContainer.appendChild(iframe); + doc.body.appendChild(iframeContainer); + + cy.get('.multi-container').invoke('css', 'z-index', '0'); + cy.get('.multi-container').invoke('css', 'opacity', '0'); // Wait for iframe to load and render cy.get('#base-map-iframe', { timeout: 30000 }).should('exist'); From 64369a6a691f955885a3717b6f3fa19e08d37ab8 Mon Sep 17 00:00:00 2001 From: akhuoa Date: Thu, 16 Oct 2025 15:27:13 +1300 Subject: [PATCH 14/15] Change visual test to compare with saved screenshot --- cypress/component/VisualTest.cy.js | 107 ++++++++++++++++------------- cypress/fixtures/test-canvas.png | Bin 0 -> 58207 bytes 2 files changed, 60 insertions(+), 47 deletions(-) create mode 100644 cypress/fixtures/test-canvas.png diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js index 708856a1..8868acf4 100644 --- a/cypress/component/VisualTest.cy.js +++ b/cypress/component/VisualTest.cy.js @@ -61,6 +61,11 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { }; cy.wrap(modifiedProps).as('develProps'); }); + + cy.fixture('test-canvas.png').then((baseImage) => { + // Save the base image to the screenshots folder for comparison + cy.writeFile('cypress/screenshots/VisualTest.cy.js/base/cypress/component/VisualTest.cy.js/test-canvas.png', baseImage, 'base64'); + }); }); it('should render the same content as base map', () => { @@ -80,7 +85,8 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { cy.wait(1000); cy.get('.el-loading-mask', { timeout: 30000 }).should('not.exist'); - modifyRenderedMap(mapImp, LAYERS, STROKE_INTERPOLATION); // modify centreline style + // NOTE: disable style modifications for now + // modifyRenderedMap(mapImp, LAYERS, STROKE_INTERPOLATION); // modify centreline style cy.wait(2000); // Take screenshot of viewer canvas @@ -90,53 +96,60 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { // UI cy.get('@viewerCanvas').screenshot('VisualTest.cy.js/base/cypress/component/VisualTest.cy.js/viewer-canvas', { overwrite: true }) - cy.get('@develProps').then((props) => { - const flatmapAPI = props.flatmapAPI; - const baseMapUrl = `${flatmapAPI}flatmap/${flatmapUUID}`; - - // Create iframe in the same document to load base map - cy.document().then((doc) => { - doc.body.style.margin = '0'; - - const iframe = doc.createElement('iframe'); - const iframeContainer = doc.createElement('div'); - - iframeContainer.style.position = 'fixed'; - iframeContainer.style.top = '0'; - iframeContainer.style.left = '0'; - iframeContainer.style.width = '500px'; - iframeContainer.style.height = '500px'; - iframeContainer.style.zIndex = '9999'; - - iframe.src = baseMapUrl; - iframe.style.position = 'absolute'; - iframe.style.top = '0'; - iframe.style.left = '0'; - iframe.style.width = '100%'; - iframe.style.height = '100%'; - iframe.style.border = 'none'; - iframe.id = 'base-map-iframe'; - - iframeContainer.appendChild(iframe); - doc.body.appendChild(iframeContainer); - - cy.get('.multi-container').invoke('css', 'z-index', '0'); - cy.get('.multi-container').invoke('css', 'opacity', '0'); - - // Wait for iframe to load and render - cy.get('#base-map-iframe', { timeout: 30000 }).should('exist'); - cy.wait(8000); - - // Take screenshot of iframe - cy.get('#base-map-iframe').as('baseMapIframe'); - cy.get('@baseMapIframe').screenshot('base-canvas', { overwrite: true }); - - // Compare screenshots - cy.get('@baseMapIframe').compareSnapshot('viewer-canvas').then(comparisonResults => { - expect(comparisonResults.percentage, 'Base map and viewer map should render identically').to.be.lessThan(ERROR_TOLERANCE); - }); - }); + // Test with saved screenshot from fixture + cy.get('@viewerCanvas').compareSnapshot('test-canvas').then(comparisonResults => { + expect(comparisonResults.percentage, 'Viewer map should match test-canvas.png exactly').to.equal(0); }); + + // NOTE: disable base map comparison for now + // Currently, the base map's style are differnt from rendered map in viewer + // cy.get('@develProps').then((props) => { + // const flatmapAPI = props.flatmapAPI; + // const baseMapUrl = `${flatmapAPI}flatmap/${flatmapUUID}`; + + // // Create iframe in the same document to load base map + // cy.document().then((doc) => { + // doc.body.style.margin = '0'; + + // const iframe = doc.createElement('iframe'); + // const iframeContainer = doc.createElement('div'); + + // iframeContainer.style.position = 'fixed'; + // iframeContainer.style.top = '0'; + // iframeContainer.style.left = '0'; + // iframeContainer.style.width = '500px'; + // iframeContainer.style.height = '500px'; + // iframeContainer.style.zIndex = '9999'; + + // iframe.src = baseMapUrl; + // iframe.style.position = 'absolute'; + // iframe.style.top = '0'; + // iframe.style.left = '0'; + // iframe.style.width = '100%'; + // iframe.style.height = '100%'; + // iframe.style.border = 'none'; + // iframe.id = 'base-map-iframe'; + + // iframeContainer.appendChild(iframe); + // doc.body.appendChild(iframeContainer); + + // cy.get('.multi-container').invoke('css', 'z-index', '0'); + // cy.get('.multi-container').invoke('css', 'opacity', '0'); + + // // Wait for iframe to load and render + // cy.get('#base-map-iframe', { timeout: 30000 }).should('exist'); + // cy.wait(8000); + + // // Take screenshot of iframe + // cy.get('#base-map-iframe').as('baseMapIframe'); + // cy.get('@baseMapIframe').screenshot('base-canvas', { overwrite: true }); + + // // Compare screenshots + // cy.get('@baseMapIframe').compareSnapshot('viewer-canvas').then(comparisonResults => { + // expect(comparisonResults.percentage, 'Base map and viewer map should render identically').to.be.lessThan(ERROR_TOLERANCE); + // }); + // }); + // }); }); }); diff --git a/cypress/fixtures/test-canvas.png b/cypress/fixtures/test-canvas.png new file mode 100644 index 0000000000000000000000000000000000000000..b438d00a7188097c2d50f9ba03770a022a860fa4 GIT binary patch literal 58207 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 literal 0 HcmV?d00001 From bd3417c727cc0b5389a97f643f1186a5020cf0ff Mon Sep 17 00:00:00 2001 From: akhuoa Date: Tue, 21 Oct 2025 16:44:06 +1300 Subject: [PATCH 15/15] Fix different screen resolution issue for visual test --- cypress/component/VisualTest.cy.js | 8 +++++++- .../{test-canvas.png => test-canvas_hr.png} | Bin cypress/fixtures/test-canvas_lr.png | Bin 0 -> 22652 bytes 3 files changed, 7 insertions(+), 1 deletion(-) rename cypress/fixtures/{test-canvas.png => test-canvas_hr.png} (100%) create mode 100644 cypress/fixtures/test-canvas_lr.png diff --git a/cypress/component/VisualTest.cy.js b/cypress/component/VisualTest.cy.js index 8868acf4..4ccd4a25 100644 --- a/cypress/component/VisualTest.cy.js +++ b/cypress/component/VisualTest.cy.js @@ -48,6 +48,11 @@ const modifyRenderedMap = (mapImp, layers, strokeInterpolation) => { }); }; +function is_high_resolution_screen() { + // retina display has a devicePixelRatio of 2 + return window.devicePixelRatio > 1; +} + describe('MultiFlatmapVuer Screenshot Comparison', () => { beforeEach(() => { @@ -62,7 +67,8 @@ describe('MultiFlatmapVuer Screenshot Comparison', () => { cy.wrap(modifiedProps).as('develProps'); }); - cy.fixture('test-canvas.png').then((baseImage) => { + const testCanvasPath = is_high_resolution_screen() ? 'test-canvas_hr.png' : 'test-canvas_lr.png'; + cy.fixture(testCanvasPath).then((baseImage) => { // Save the base image to the screenshots folder for comparison cy.writeFile('cypress/screenshots/VisualTest.cy.js/base/cypress/component/VisualTest.cy.js/test-canvas.png', baseImage, 'base64'); }); diff --git a/cypress/fixtures/test-canvas.png b/cypress/fixtures/test-canvas_hr.png similarity index 100% rename from cypress/fixtures/test-canvas.png rename to cypress/fixtures/test-canvas_hr.png diff --git a/cypress/fixtures/test-canvas_lr.png b/cypress/fixtures/test-canvas_lr.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f4037ccbc28374d6a0a38c4356ca2046af69f1 GIT binary patch literal 22652 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 LEetC4oSyy{;apXd literal 0 HcmV?d00001