From 7efd8b009d244b82cb888cc4c23bb2121a333089 Mon Sep 17 00:00:00 2001 From: Andrei Vorobev <738482+vorobey@users.noreply.github.com> Date: Mon, 31 Aug 2026 17:17:06 +0300 Subject: [PATCH 01/12] chore: fix relience on facade #1 --- .../common/core/events/visibility_change.js | 20 +++++++++++-- packages/devextreme/js/exporter.js | 11 ++++--- .../devextreme/testing/helpers/moduleSeam.js | 18 +++++++++++ .../testing/helpers/visibilityChangeMock.js | 11 +++++++ .../testing/runner/lib/importMap.ts | 5 +++- .../testing/runner/lib/mutableModuleGroups.ts | 30 ------------------- .../gridView.tests.js | 6 ++-- .../DevExpress.ui.widgets.form/form.tests.js | 7 +++-- .../DevExpress.ui.widgets/drawer.tests.js | 26 ++++++++-------- .../DevExpress.ui.widgets/gallery.tests.js | 4 +-- .../DevExpress.ui.widgets/overlay.tests.js | 12 ++++---- .../DevExpress.ui.widgets/popup.tests.js | 8 ++--- .../DevExpress.ui.widgets/resizable.tests.js | 8 ++--- .../DevExpress.viz.charts/charts.tests.js | 2 +- .../export.integration.tests.js | 5 ++-- .../tests/DevExpress.viz.core/export.tests.js | 11 +++---- 16 files changed, 104 insertions(+), 80 deletions(-) create mode 100644 packages/devextreme/testing/helpers/moduleSeam.js create mode 100644 packages/devextreme/testing/helpers/visibilityChangeMock.js diff --git a/packages/devextreme/js/common/core/events/visibility_change.js b/packages/devextreme/js/common/core/events/visibility_change.js index 93ea077c6d9a..e678ff243c28 100644 --- a/packages/devextreme/js/common/core/events/visibility_change.js +++ b/packages/devextreme/js/common/core/events/visibility_change.js @@ -1,7 +1,21 @@ import VisibilityChangeModule from '../../../__internal/events/m_visibility_change'; -export const triggerShownEvent = VisibilityChangeModule.triggerShownEvent; -export const triggerHidingEvent = VisibilityChangeModule.triggerHidingEvent; -export const triggerResizeEvent = VisibilityChangeModule.triggerResizeEvent; +export let triggerShownEvent = VisibilityChangeModule.triggerShownEvent; +export let triggerHidingEvent = VisibilityChangeModule.triggerHidingEvent; +export let triggerResizeEvent = VisibilityChangeModule.triggerResizeEvent; + +/// #DEBUG +export function DEBUG_set_triggerShownEvent(value) { + triggerShownEvent = value; +} + +export function DEBUG_set_triggerHidingEvent(value) { + triggerHidingEvent = value; +} + +export function DEBUG_set_triggerResizeEvent(value) { + triggerResizeEvent = value; +} +/// #ENDDEBUG export default VisibilityChangeModule; diff --git a/packages/devextreme/js/exporter.js b/packages/devextreme/js/exporter.js index cfcf606cc8ee..0cdb267d06a1 100644 --- a/packages/devextreme/js/exporter.js +++ b/packages/devextreme/js/exporter.js @@ -1,13 +1,16 @@ import * as clientExporter from './__internal/exporter/exporter'; -// Re-exported through local bindings on purpose: `export { … } from './…'` compiles to -// getter-only, non-configurable properties, while tests stub these members -// (see testing/tests/DevExpress.viz.core/export.tests.js). -const _export = clientExporter.export; +let _export = clientExporter.export; export const fileSaver = clientExporter.fileSaver; export const image = clientExporter.image; export const pdf = clientExporter.pdf; export const svg = clientExporter.svg; +/// #DEBUG +export function DEBUG_set_export(value) { + _export = value; +} +/// #ENDDEBUG + export { _export as export }; diff --git a/packages/devextreme/testing/helpers/moduleSeam.js b/packages/devextreme/testing/helpers/moduleSeam.js new file mode 100644 index 000000000000..6fc916117a6b --- /dev/null +++ b/packages/devextreme/testing/helpers/moduleSeam.js @@ -0,0 +1,18 @@ +/* global sinon */ + +export function installSeam(module, name, replacement) { + const original = module[name]; + + replacement.restore = () => module[`DEBUG_set_${name}`](original); + module[`DEBUG_set_${name}`](replacement); + + return replacement; +} + +export function spySeam(module, name) { + return installSeam(module, name, sinon.spy(module[name])); +} + +export function stubSeam(module, name) { + return installSeam(module, name, sinon.stub()); +} diff --git a/packages/devextreme/testing/helpers/visibilityChangeMock.js b/packages/devextreme/testing/helpers/visibilityChangeMock.js new file mode 100644 index 000000000000..01ff2d64e372 --- /dev/null +++ b/packages/devextreme/testing/helpers/visibilityChangeMock.js @@ -0,0 +1,11 @@ +import * as visibilityChange from 'common/core/events/visibility_change'; + +import { spySeam, stubSeam } from './moduleSeam.js'; + +export function spyVisibilityEvent(name) { + return spySeam(visibilityChange, name); +} + +export function stubVisibilityEvent(name) { + return stubSeam(visibilityChange, name); +} diff --git a/packages/devextreme/testing/runner/lib/importMap.ts b/packages/devextreme/testing/runner/lib/importMap.ts index 01384871feb7..fe8cd4444eeb 100644 --- a/packages/devextreme/testing/runner/lib/importMap.ts +++ b/packages/devextreme/testing/runner/lib/importMap.ts @@ -240,7 +240,10 @@ function collectPackageRootEntries(): Record { fs.readdirSync(ESM_FS_ROOT, { withFileTypes: true }).forEach((entry) => { if (entry.isFile() && entry.name.endsWith('.js')) { const name = entry.name.slice(0, -3); - const url = `${ESM_ROOT}/${entry.name}`; + // Extensionless, like the `viz/` `core/` `common/` prefix maps: artifacts import + // root modules as `../../exporter`, and a second URL for the same file would give + // the browser a second module instance with its own copy of every binding. + const url = `${ESM_ROOT}/${name}`; entries[name] = url; // Suites often `require('aspnet.js')` / `require('color.js')` with the extension. entries[entry.name] = url; diff --git a/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts b/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts index 6e07f6af6a8a..974d1ec52ed6 100644 --- a/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts +++ b/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts @@ -35,15 +35,6 @@ export const MUTABLE_MODULE_GROUPS: readonly MutableModuleGroup[] = [ internal: '__internal/viz/axes/base_axis.js', extraKeys: ['viz/axes/base_axis'], }, - { - internal: 'exporter.js', - extraKeys: ['exporter.js'], - }, - { - internal: 'format_helper.js', - extraKeys: ['format_helper.js'], - apiFromDefault: true, - }, { internal: '__internal/viz/translators/translator2d.js', extraKeys: ['viz/translators/translator2d'], @@ -67,10 +58,6 @@ export const MUTABLE_MODULE_GROUPS: readonly MutableModuleGroup[] = [ 'viz/core/export.js', ], }, - { - internal: '__internal/viz/chart_components/tracker.js', - also: ['viz/chart_components/tracker.js'], - }, { internal: '__internal/viz/components/legend.js', also: ['viz/components/legend.js'], @@ -86,23 +73,6 @@ export const MUTABLE_MODULE_GROUPS: readonly MutableModuleGroup[] = [ 'common/core/localization/ldml/date.parser.js', ], }, - { - internal: '__internal/events/m_visibility_change.js', - also: ['common/core/events/visibility_change.js'], - apiFromDefault: true, - }, - { - internal: 'core/errors.js', - apiFromDefault: true, - }, - { - internal: 'ui/widget/ui.errors.js', - apiFromDefault: true, - }, - { - internal: '__internal/core/m_template_manager.js', - apiFromDefault: true, - }, { // Real named exports live in palette.js; paletteModule.js is only // `import * as PaletteModule from './palette'; export default PaletteModule`. diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/gridView.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/gridView.tests.js index 104fa23f7724..250cda522ff2 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/gridView.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/gridView.tests.js @@ -1,5 +1,5 @@ import devices from '__internal/core/m_devices'; -import visibilityChange from 'common/core/events/visibility_change'; +import * as visibilityChange from 'common/core/events/visibility_change'; import 'fluent_blue_light.css!'; import $ from 'jquery'; import 'ui/data_grid'; @@ -913,9 +913,9 @@ QUnit.module('Grid view', { this.createGridView(this.defaultOptions); - visibilityChange.triggerShownEvent = function() { + visibilityChange.DEBUG_set_triggerShownEvent(function() { isShownEventTriggered = true; - }; + }); this.resizingController.component._fireContentReadyAction = function() { isContentReadyCalled = true; diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.form/form.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.form/form.tests.js index 0f7a304b3962..3533d04adc83 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.form/form.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.form/form.tests.js @@ -6,7 +6,8 @@ import resizeCallbacks from '__internal/core/utils/m_resize_callbacks'; import typeUtils from 'core/utils/type'; import { extend } from 'core/utils/extend'; import messageLocalization from 'localization/message'; -import visibilityEventsModule from 'common/core/events/visibility_change'; +import * as visibilityEventsModule from 'common/core/events/visibility_change'; +import { spyVisibilityEvent } from '../../helpers/visibilityChangeMock.js'; import { TABS_ITEM_CLASS } from '__internal/ui/tabs/tabs'; import 'fluent_blue_light.css!'; import $ from 'jquery'; @@ -1042,7 +1043,7 @@ QUnit.module('T986577', () => { } QUnit.test('Toolbar is rendered inside form. alignItemLabels = false', function(assert) { - const resizeEventSpy = sinon.spy(visibilityEventsModule, 'triggerResizeEvent'); + const resizeEventSpy = spyVisibilityEvent('triggerResizeEvent'); const $form = $('#form').dxForm(extend({ alignItemLabels: false }, getFormConfig())); const resizeEventArg = resizeEventSpy.getCall(0).args[0]; @@ -1055,7 +1056,7 @@ QUnit.module('T986577', () => { }); QUnit.test('Toolbar is rendered inside form. alignItemLabels = true', function(assert) { - const resizeEventSpy = sinon.spy(visibilityEventsModule, 'triggerResizeEvent'); + const resizeEventSpy = spyVisibilityEvent('triggerResizeEvent'); const $form = $('#form').dxForm(extend({ alignItemLabels: true }, getFormConfig())); const resizeEventArg = resizeEventSpy.getCall(0).args[0]; diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/drawer.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/drawer.tests.js index 7ca9ed022c71..25c7f056db2b 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/drawer.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/drawer.tests.js @@ -7,7 +7,7 @@ import resizeCallbacks from 'core/utils/resize_callbacks'; import typeUtils from 'core/utils/type'; import { addShadowDomStyles } from 'core/utils/shadow_dom'; import eventsEngine from 'common/core/events/core/events_engine'; -import visibilityChange from 'common/core/events/visibility_change'; +import * as visibilityChange from 'common/core/events/visibility_change'; import $ from 'jquery'; import Button from 'ui/button'; import Drawer from 'ui/drawer'; @@ -281,16 +281,16 @@ QUnit.module('Drawer behavior', () => { const triggerResizeEventInitial = visibilityChange.triggerResizeEvent; - visibilityChange.triggerResizeEvent = ($element) => { + visibilityChange.DEBUG_set_triggerResizeEvent(($element) => { assert.ok(true, 'resize event call is expected'); assert.equal($element, drawer.viewContent(), 'ViewContent element is expected'); const rect = $(drawer.viewContent())[0].getBoundingClientRect(); assert.strictEqual(rect.width, 90, 'ViewContent element width'); assert.strictEqual(rect.height, 50, 'ViewContent element height'); - visibilityChange.triggerResizeEvent = triggerResizeEventInitial; + visibilityChange.DEBUG_set_triggerResizeEvent(triggerResizeEventInitial); done(); - }; + }); drawer.toggle(); }); @@ -311,18 +311,18 @@ QUnit.module('Drawer behavior', () => { const triggerFunction = visibilityChange.triggerResizeEvent; try { - visibilityChange.triggerResizeEvent = ($element) => { + visibilityChange.DEBUG_set_triggerResizeEvent(($element) => { assert.ok(true, 'resize event call is expected'); assert.equal($element, drawer.viewContent(), 'ViewContent element is expected'); const rect = $(drawer.viewContent())[0].getBoundingClientRect(); assert.strictEqual(rect.width, 90, 'ViewContent element width'); assert.strictEqual(rect.height, 50, 'ViewContent element height'); - }; + }); drawer.toggle(); } finally { - visibilityChange.triggerResizeEvent = triggerFunction; + visibilityChange.DEBUG_set_triggerResizeEvent(triggerFunction); } }); @@ -337,15 +337,15 @@ QUnit.module('Drawer behavior', () => { assert.expect(2); try { - visibilityChange.triggerResizeEvent = function($element) { + visibilityChange.DEBUG_set_triggerResizeEvent(function($element) { assert.ok(true, 'event was triggered'); assert.equal($element, instance.viewContent(), 'Event was triggered for right element'); - }; + }); instance.option('position', 'left'); } finally { - visibilityChange.triggerResizeEvent = triggerFunction; + visibilityChange.DEBUG_set_triggerResizeEvent(triggerFunction); } }); @@ -979,7 +979,7 @@ QUnit.module('Drawer behavior', () => { minSize: minSize }).dxDrawer('instance'); - visibilityChange.triggerResizeEvent = ($element) => { + visibilityChange.DEBUG_set_triggerResizeEvent(($element) => { resizeCallCount++; assert.strictEqual(resizeCallCount, 1, 'resize event should be triggered once'); assert.equal($element, drawer.viewContent(), 'ViewContent element is expected'); @@ -993,9 +993,9 @@ QUnit.module('Drawer behavior', () => { assert.strictEqual(viewRect.width, expectedViewRect.width, 'ViewContent width'); assert.strictEqual(viewRect.height, expectedViewRect.height, 'ViewContent height'); - visibilityChange.triggerResizeEvent = triggerResizeEventInitial; + visibilityChange.DEBUG_set_triggerResizeEvent(triggerResizeEventInitial); done(); - }; + }); drawer.toggle(); }); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/gallery.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/gallery.tests.js index d4627e9de67f..a630e7b44767 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/gallery.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/gallery.tests.js @@ -1,7 +1,7 @@ import { getHeight, getOuterHeight, getOuterWidth, getWidth } from 'core/utils/size'; import $ from 'jquery'; import { DataSource } from 'common/data/data_source/data_source'; -import visibilityChange from 'common/core/events/visibility_change'; +import { spyVisibilityEvent } from '../../helpers/visibilityChangeMock.js'; import ArrayStore from 'common/data/array_store'; import fx from 'common/core/animation/fx'; import animationFrame from '__internal/common/core/animation/frameModule'; @@ -731,7 +731,7 @@ QUnit.module('behavior', { }); QUnit.test('resizeCallback is called after item is rendered (T1132935)', function(assert) { - const resizeEventSpy = sinon.spy(visibilityChange, 'triggerResizeEvent'); + const resizeEventSpy = spyVisibilityEvent('triggerResizeEvent'); this.$element.dxGallery({ items: [0, 1, 2, 3], diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/overlay.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/overlay.tests.js index 9b60cc53f2b4..8010f8a63cf5 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/overlay.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/overlay.tests.js @@ -10,7 +10,9 @@ import resizeCallbacks from 'core/utils/resize_callbacks'; import { isRenderer } from 'core/utils/type'; import { value as viewPort } from 'core/utils/view_port'; import eventsEngine from 'common/core/events/core/events_engine'; -import visibilityChange, { triggerHidingEvent, triggerShownEvent } from 'common/core/events/visibility_change'; +import * as visibilityChange from 'common/core/events/visibility_change'; +import { triggerHidingEvent, triggerShownEvent } from 'common/core/events/visibility_change'; +import { stubVisibilityEvent } from '../../helpers/visibilityChangeMock.js'; import $ from 'jquery'; import { hideCallback as hideTopOverlayCallback } from 'common/core/environment/hide_callback'; import errors from 'core/errors'; @@ -778,9 +780,9 @@ testModule('visibility', moduleConfig, () => { const triggerFunction = visibilityChange.triggerResizeEvent; try { - visibilityChange.triggerResizeEvent = () => { + visibilityChange.DEBUG_set_triggerResizeEvent(() => { assert.ok(true, 'event triggered'); - }; + }); const $overlay = $('#overlay').dxOverlay({ visible: true }); const overlay = $overlay.dxOverlay('instance'); @@ -789,7 +791,7 @@ testModule('visibility', moduleConfig, () => { overlay.show(); } finally { - visibilityChange.triggerResizeEvent = triggerFunction; + visibilityChange.DEBUG_set_triggerResizeEvent(triggerFunction); } }); @@ -3127,7 +3129,7 @@ testModule('API', moduleConfig, () => { const instance = $element.dxOverlay({ visible: true }).dxOverlay('instance'); - const resizeStub = sinon.stub(visibilityChange, 'triggerResizeEvent'); + const resizeStub = stubVisibilityEvent('triggerResizeEvent'); instance.repaint(); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/popup.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/popup.tests.js index 1fcb96b26eef..79a1ca867418 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/popup.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/popup.tests.js @@ -23,7 +23,7 @@ import windowUtils from '__internal/core/utils/m_window'; import uiErrors from 'ui/widget/ui.errors'; import themes from 'ui/themes'; import executeAsyncMock from '../../helpers/executeAsyncMock.js'; -import visibilityChangeUtils from 'common/core/events/visibility_change'; +import { spyVisibilityEvent } from '../../helpers/visibilityChangeMock.js'; import domAdapter from '__internal/core/m_dom_adapter'; import { TEMPLATE_WRAPPER_CLASS, @@ -1532,7 +1532,7 @@ QUnit.module('options changed callbacks', { QUnit.module('T934380, T1245421', { beforeEach() { - this.resizeEventSpy = sinon.spy(visibilityChangeUtils, 'triggerResizeEvent'); + this.resizeEventSpy = spyVisibilityEvent('triggerResizeEvent'); }, afterEach() { this.resizeEventSpy.restore(); @@ -1676,7 +1676,7 @@ QUnit.module('options changed callbacks', { QUnit.test('titleTemplate option change should trigger resize event for content correct geometry rendering', function(assert) { this.instance.option('visible', true); - const resizeEventSpy = sinon.spy(visibilityChangeUtils, 'triggerResizeEvent'); + const resizeEventSpy = spyVisibilityEvent('triggerResizeEvent'); try { this.instance.option({ @@ -1691,7 +1691,7 @@ QUnit.module('options changed callbacks', { QUnit.test('bottomTemplate option change should trigger resize event for content correct geometry rendering', function(assert) { this.instance.option('visible', true); - const resizeEventSpy = sinon.spy(visibilityChangeUtils, 'triggerResizeEvent'); + const resizeEventSpy = spyVisibilityEvent('triggerResizeEvent'); try { this.instance.option({ diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/resizable.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/resizable.tests.js index 688151935f87..3125bdcfe254 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/resizable.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/resizable.tests.js @@ -1,5 +1,5 @@ import translator from 'common/core/animation/translator'; -import visibilityChange from 'common/core/events/visibility_change'; +import * as visibilityChange from 'common/core/events/visibility_change'; import $ from 'jquery'; import 'ui/resizable'; import pointerMock from '../../helpers/pointerMock.js'; @@ -1808,14 +1808,14 @@ QUnit.module('actions', () => { assert.expect(1); try { - visibilityChange.triggerResizeEvent = function() { + visibilityChange.DEBUG_set_triggerResizeEvent(function() { assert.ok(true, 'event triggered'); - }; + }); pointer.dragStart().drag(10, 0); } finally { - visibilityChange.triggerResizeEvent = triggerFunction; + visibilityChange.DEBUG_set_triggerResizeEvent(triggerFunction); } }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/charts.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/charts.tests.js index f4b7646b28dd..fdc0508079eb 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/charts.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/charts.tests.js @@ -5,7 +5,7 @@ import * as CrosshairModule from 'viz/chart_components/crosshair'; import * as LayoutManagerModule from 'viz/chart_components/layout_manager'; import multiAxesSynchronizer from '__internal/viz/chart_components/multi_axes_synchronizer'; import * as ScrollBarModule from 'viz/chart_components/scroll_bar'; -import * as trackerModule from 'viz/chart_components/tracker'; +import trackerModule from 'viz/chart_components/tracker'; import 'viz/chart'; import 'viz/pie_chart'; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core/export.integration.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core/export.integration.tests.js index 7f974ef2aef4..3df71f5c770a 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core/export.integration.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core/export.integration.tests.js @@ -2,7 +2,8 @@ import '__internal/viz/tree_map/tree_map'; import $ from 'jquery'; import { Renderer, ExportMenu } from '../../helpers/vizMocks.js'; import rendererModule from 'viz/core/renderers/renderer_default'; -import clientExporter from 'exporter'; +import * as clientExporter from 'exporter'; +import { stubSeam } from '../../helpers/moduleSeam.js'; import exportModule from '__internal/viz/core/exportModule'; import { Deferred } from 'core/utils/deferred'; import { logger } from 'core/utils/console'; @@ -29,7 +30,7 @@ QUnit.module('Export', { const exportMenu = this.exportMenu = new ExportMenu(); exportModule.DEBUG_set_ExportMenu(sinon.spy(function() { return exportMenu; })); - sinon.stub(clientExporter, 'export').returns(new Deferred()); + stubSeam(clientExporter, 'export').returns(new Deferred()); this.toDataURLStub = sinon.stub(window.HTMLCanvasElement.prototype, 'toDataURL'); this.toDataURLStub.returnsArg(0); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core/export.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core/export.tests.js index 15ce7e3c2c38..a745f3048761 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core/export.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core/export.tests.js @@ -2,7 +2,8 @@ import $ from 'jquery'; import { Renderer } from '../../helpers/vizMocks.js'; import exportModule from '__internal/viz/core/exportModule'; import themeModule from 'viz/themes'; -import clientExporter from 'exporter'; +import * as clientExporter from 'exporter'; +import { stubSeam } from '../../helpers/moduleSeam.js'; import localization from 'localization'; const combineMarkupsOrig = exportModule.combineMarkups; @@ -559,7 +560,7 @@ QUnit.test('Combine widgets markups (combineMarkups) in grid layout with bottom- QUnit.module('API. Export methods', { beforeEach: function() { - sinon.stub(clientExporter, 'export'); + stubSeam(clientExporter, 'export'); this.toDataURLStub = sinon.stub(window.HTMLCanvasElement.prototype, 'toDataURL'); this.toDataURLStub.returnsArg(0); }, @@ -828,7 +829,7 @@ QUnit.module('API', { this.renderer = new Renderer(); this.incidentOccurred = sinon.spy(); - sinon.stub(clientExporter, 'export'); + stubSeam(clientExporter, 'export'); this.options = { printingEnabled: true, formats: ['JPEG'], @@ -1055,7 +1056,7 @@ QUnit.module('Events', { this.renderer = new Renderer(); this.incidentOccurred = sinon.spy(); - sinon.stub(clientExporter, 'export'); + stubSeam(clientExporter, 'export'); this.options = { enabled: true, @@ -1365,7 +1366,7 @@ QUnit.module('Layout', { this.renderer = new Renderer(); this.incidentOccurred = sinon.spy(); - sinon.stub(clientExporter, 'export'); + stubSeam(clientExporter, 'export'); this.options = { enabled: true, From 3acfbedd9b521acd636617be2699378e8b9b9207 Mon Sep 17 00:00:00 2001 From: Andrei Vorobev <738482+vorobey@users.noreply.github.com> Date: Mon, 31 Aug 2026 18:14:07 +0300 Subject: [PATCH 02/12] Demos: hand-written list of modules for facade --- .../testing/runner/lib/autoMutableFacade.ts | 51 ++++--------------- .../testing/runner/lib/importMap.ts | 6 ++- .../runner/lib/namespaceFacadeModules.ts | 45 ++++++++++++++++ .../devextreme/testing/runner/lib/static.ts | 1 - 4 files changed, 59 insertions(+), 44 deletions(-) create mode 100644 packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts diff --git a/packages/devextreme/testing/runner/lib/autoMutableFacade.ts b/packages/devextreme/testing/runner/lib/autoMutableFacade.ts index b8aaddf1c0cc..969ee0e5d61a 100644 --- a/packages/devextreme/testing/runner/lib/autoMutableFacade.ts +++ b/packages/devextreme/testing/runner/lib/autoMutableFacade.ts @@ -6,6 +6,7 @@ import { MUTABLE_MODULE_GROUPS, type MutableModuleGroup, } from './mutableModuleGroups'; +import { NAMESPACE_FACADE_MODULES } from './namespaceFacadeModules'; export type { MutableModuleGroup }; export { MUTABLE_MODULE_GROUPS }; @@ -468,29 +469,6 @@ function tryRegisterNamespaceDefaultFile( return entry; } -function walkJsFiles(dir: string, acc: string[] = []): string[] { - if (!fs.existsSync(dir)) { - return acc; - } - for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { - const full = path.join(dir, entry.name); - if (entry.isDirectory()) { - walkJsFiles(full, acc); - } else if (entry.isFile() && entry.name.endsWith('.js')) { - acc.push(full); - } - } - return acc; -} - -function isSmallPublicReexportCandidate(filePath: string): boolean { - try { - return fs.statSync(filePath).size <= 2000; - } catch { - return false; - } -} - function registerForcedMutableGroups(workspaceRoot: string): void { const esmRoot = path.join( workspaceRoot, @@ -520,16 +498,14 @@ export function ensureAutoMutableFacadeIndex(workspaceRoot: string): void { facadeIndex.clear(); registerForcedMutableGroups(workspaceRoot); - const vizRoot = path.join( + const esmRoot = path.join( workspaceRoot, - 'packages/devextreme/artifacts/transpiled-esm-npm/esm/viz', + 'packages/devextreme/artifacts/transpiled-esm-npm/esm', ); - walkJsFiles(vizRoot) - .filter((filePath) => isSmallPublicReexportCandidate(filePath)) - .forEach((filePath) => { - tryRegisterNamespaceDefaultFile(workspaceRoot, filePath); - }); + NAMESPACE_FACADE_MODULES.forEach((relativePath) => { + tryRegisterNamespaceDefaultFile(workspaceRoot, path.join(esmRoot, relativePath)); + }); indexBuiltForRoot = workspaceRoot; } @@ -557,25 +533,18 @@ export function findHandWrittenMutableFacade(relativeUrlPath: string): string | } /** - * Returns generated facade source for a forced mutable module or a - * namespace-default public entry, or null when not applicable. + * Returns generated facade source for a module registered in + * `MUTABLE_MODULE_GROUPS` or `NAMESPACE_FACADE_MODULES`, or null for anything else. */ export function tryBuildAutoMutableFacade( relativeUrlPath: string, - absoluteFilePath: string, workspaceRoot: string, ): string | null { ensureAutoMutableFacadeIndex(workspaceRoot); - const esmKey = toEsmRelativePath(relativeUrlPath); - let entry = facadeIndex.get(esmKey); - + const entry = facadeIndex.get(toEsmRelativePath(relativeUrlPath)); if (!entry) { - const registered = tryRegisterNamespaceDefaultFile(workspaceRoot, absoluteFilePath); - if (!registered) { - return null; - } - entry = registered; + return null; } return generateAutoMutableFacadeSource(entry); diff --git a/packages/devextreme/testing/runner/lib/importMap.ts b/packages/devextreme/testing/runner/lib/importMap.ts index fe8cd4444eeb..191e8af7ad71 100644 --- a/packages/devextreme/testing/runner/lib/importMap.ts +++ b/packages/devextreme/testing/runner/lib/importMap.ts @@ -250,11 +250,13 @@ function collectPackageRootEntries(): Record { return; } - // Package folders with index.js (e.g. events → events/index.js) + // Package folders with index.js (e.g. events → events/index.js), mapped + // extensionless for the same reason as the file branch above: artifacts + // import them as `../events`, and the server resolves the index itself. if (entry.isDirectory()) { const indexPath = path.join(ESM_FS_ROOT, entry.name, 'index.js'); if (fs.existsSync(indexPath)) { - entries[entry.name] = `${ESM_ROOT}/${entry.name}/index.js`; + entries[entry.name] = `${ESM_ROOT}/${entry.name}`; } } }); diff --git a/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts b/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts new file mode 100644 index 000000000000..2a4c9dd401c5 --- /dev/null +++ b/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts @@ -0,0 +1,45 @@ +export const NAMESPACE_FACADE_MODULES: readonly string[] = [ + '__internal/common/core/animation/frameModule.js', + '__internal/common/core/animation/translatorModule.js', + '__internal/core/localization/ldml/dateParserModule.js', + '__internal/viz/core/exportModule.js', + '__internal/viz/paletteModule.js', + 'common/core/events/dblclick.js', + 'viz/axes/base_axis.js', + 'viz/axes/tick_generator.js', + 'viz/chart_components/crosshair.js', + 'viz/chart_components/layout_manager.js', + 'viz/chart_components/scroll_bar.js', + 'viz/components/chart_theme_manager.js', + 'viz/components/data_validator.js', + 'viz/components/legend.js', + 'viz/core/base_theme_manager.js', + 'viz/core/loading_indicator.js', + 'viz/core/plaque.js', + 'viz/core/renderers/animation.js', + 'viz/core/renderers/renderer_default.js', + 'viz/core/series_family.js', + 'viz/core/title.js', + 'viz/core/tooltip.js', + 'viz/core/utils_default.js', + 'viz/range_selector/range_view.js', + 'viz/range_selector/series_data_source.js', + 'viz/range_selector/sliders_controller.js', + 'viz/range_selector/tracker.js', + 'viz/sankey/tracker.js', + 'viz/series/base_series.js', + 'viz/series/points/base_point.js', + 'viz/series/points/label.js', + 'viz/translators/range.js', + 'viz/translators/translator1d.js', + 'viz/translators/translator2d.js', + 'viz/vector_map/control_bar/control_bar.js', + 'viz/vector_map/data_exchanger.js', + 'viz/vector_map/gesture_handler.js', + 'viz/vector_map/layout.js', + 'viz/vector_map/legend.js', + 'viz/vector_map/map_layer.js', + 'viz/vector_map/projection.main.js', + 'viz/vector_map/tooltip_viewer.js', + 'viz/vector_map/tracker.js', +]; diff --git a/packages/devextreme/testing/runner/lib/static.ts b/packages/devextreme/testing/runner/lib/static.ts index 85c1c20b36cb..f87adb34af82 100644 --- a/packages/devextreme/testing/runner/lib/static.ts +++ b/packages/devextreme/testing/runner/lib/static.ts @@ -585,7 +585,6 @@ export function createStaticFileService({ } const autoFacade = tryBuildAutoMutableFacade( relativeUrlPath, - resolvedFilePath, rootDirectory, ); if (autoFacade) { From c10f563c1c0b16a717285ab247636fc6cc5c983a Mon Sep 17 00:00:00 2001 From: Andrei Vorobev <738482+vorobey@users.noreply.github.com> Date: Tue, 1 Sep 2026 10:54:11 +0300 Subject: [PATCH 03/12] chore: remove viz/core/title from facade --- packages/devextreme/testing/helpers/moduleSeam.js | 14 +++++++------- packages/devextreme/testing/helpers/vizMocks.js | 2 +- .../testing/runner/lib/mutableModuleGroups.ts | 4 ---- .../testing/runner/lib/namespaceFacadeModules.ts | 1 - .../tests/DevExpress.viz.charts/chart.tests.js | 4 ++-- .../tests/DevExpress.viz.charts/chartSync.tests.js | 4 ++-- .../tests/DevExpress.viz.core/legend.tests.js | 4 ++-- 7 files changed, 14 insertions(+), 19 deletions(-) diff --git a/packages/devextreme/testing/helpers/moduleSeam.js b/packages/devextreme/testing/helpers/moduleSeam.js index 6fc916117a6b..0f02d142dab4 100644 --- a/packages/devextreme/testing/helpers/moduleSeam.js +++ b/packages/devextreme/testing/helpers/moduleSeam.js @@ -1,18 +1,18 @@ /* global sinon */ -export function installSeam(module, name, replacement) { +export function installSeam(module, name, replacement, setterName = `DEBUG_set_${name}`) { const original = module[name]; - replacement.restore = () => module[`DEBUG_set_${name}`](original); - module[`DEBUG_set_${name}`](replacement); + replacement.restore = () => module[setterName](original); + module[setterName](replacement); return replacement; } -export function spySeam(module, name) { - return installSeam(module, name, sinon.spy(module[name])); +export function spySeam(module, name, setterName) { + return installSeam(module, name, sinon.spy(module[name]), setterName); } -export function stubSeam(module, name) { - return installSeam(module, name, sinon.stub()); +export function stubSeam(module, name, setterName) { + return installSeam(module, name, sinon.stub(), setterName); } diff --git a/packages/devextreme/testing/helpers/vizMocks.js b/packages/devextreme/testing/helpers/vizMocks.js index 1d96bbb2face..4f826dea1c89 100644 --- a/packages/devextreme/testing/helpers/vizMocks.js +++ b/packages/devextreme/testing/helpers/vizMocks.js @@ -2,7 +2,7 @@ import $ from 'jquery'; import * as tooltipModule from 'viz/core/tooltip'; -import * as titleModule from 'viz/core/title'; +import titleModule from 'viz/core/title'; import legendModule from 'viz/components/legend'; import axisModule from 'viz/axes/base_axis'; import * as pointModule from 'viz/series/points/base_point'; diff --git a/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts b/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts index 974d1ec52ed6..56257711edab 100644 --- a/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts +++ b/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts @@ -47,10 +47,6 @@ export const MUTABLE_MODULE_GROUPS: readonly MutableModuleGroup[] = [ internal: '__internal/viz/core/tooltip.js', also: ['viz/core/tooltip.js'], }, - { - internal: '__internal/viz/core/title.js', - also: ['viz/core/title.js'], - }, { internal: '__internal/viz/core/export.js', also: [ diff --git a/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts b/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts index 2a4c9dd401c5..4a61b2d797d3 100644 --- a/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts +++ b/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts @@ -19,7 +19,6 @@ export const NAMESPACE_FACADE_MODULES: readonly string[] = [ 'viz/core/renderers/animation.js', 'viz/core/renderers/renderer_default.js', 'viz/core/series_family.js', - 'viz/core/title.js', 'viz/core/tooltip.js', 'viz/core/utils_default.js', 'viz/range_selector/range_view.js', diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.tests.js index 4cb701dc1d9d..3924a46d5d51 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.tests.js @@ -5,6 +5,7 @@ import seriesModule from 'viz/series/base_series'; import pointModule from 'viz/series/points/base_point'; import axisModule from 'viz/axes/base_axis'; import titleModule from 'viz/core/title'; +import { stubSeam } from '../../helpers/moduleSeam.js'; import dataValidatorModule from 'viz/components/data_validator'; import legendModule from 'viz/components/legend'; import rangeModule from 'viz/translators/range'; @@ -45,7 +46,6 @@ const environment = { layoutManagerModule.LayoutManager.restore(); seriesModule.Series.restore(); pointModule.Point.restore(); - this.Title.restore(); this.Legend.restore(); }, @@ -81,7 +81,7 @@ const environment = { }); }, _stubTitle: function() { - this.Title = sinon.stub(titleModule, 'Title').callsFake(function() { + this.Title = stubSeam(titleModule, 'Title', 'DEBUG_set_title').callsFake(function() { return new ChartTitle(); }); }, diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/chartSync.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/chartSync.tests.js index bb388fa2dc37..86fedbc86f2b 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/chartSync.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/chartSync.tests.js @@ -118,13 +118,13 @@ const environment = { that.themeManager.getOptions.withArgs('resolveLabelOverlapping').returns(false); that.themeManager.getOptions.returns({}); - titleModule.Title = sinon.spy(function(parameters) { + titleModule.DEBUG_set_title(sinon.spy(function(parameters) { const title = new Title(parameters); title.getLayoutOptions = sinon.stub().returns({ verticalAlignment: that.titleVerticalAlignment || 'bottom' }); return title; - }); + })); that.createChart = function(options) { options = $.extend(true, { diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core/legend.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core/legend.tests.js index 055dfdbe8026..1927e8eb96da 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core/legend.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core/legend.tests.js @@ -2215,7 +2215,7 @@ const titleEnvironment = $.extend({}, environment, { const titleConstructor = module.Title; that.titleLayout = { height: 17, width: 20, x: 4, y: 5 }; - module.Title = function(params) { + module.DEBUG_set_title(function(params) { that.title = new titleConstructor(params); that.title.getLayoutOptions = sinon.stub(); @@ -2231,7 +2231,7 @@ const titleEnvironment = $.extend({}, environment, { that.title.shift = sinon.spy(); return that.title; - }; + }); that.themeManagerTitleOptions = { backgroundColor: '#ffffff', From 00777d8afdfef3b350908a3e99d03cbaf7b3ec4c Mon Sep 17 00:00:00 2001 From: Andrei Vorobev <738482+vorobey@users.noreply.github.com> Date: Tue, 1 Sep 2026 11:27:52 +0300 Subject: [PATCH 04/12] chore: cache buster fix --- packages/devextreme/testing/runner/lib/importMap.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/devextreme/testing/runner/lib/importMap.ts b/packages/devextreme/testing/runner/lib/importMap.ts index 191e8af7ad71..33179122d6bd 100644 --- a/packages/devextreme/testing/runner/lib/importMap.ts +++ b/packages/devextreme/testing/runner/lib/importMap.ts @@ -77,6 +77,10 @@ function withCacheBuster(url: string, cacheBuster: string): string { return url; } + if (url.startsWith(ESM_ROOT)) { + return url; + } + return `${url}${url.includes('?') ? '&' : '?'}${cacheBuster}`; } From 9d3bed3e98f9dadbaf61d22e03e8735a6dbb6ca9 Mon Sep 17 00:00:00 2001 From: Andrei Vorobev <738482+vorobey@users.noreply.github.com> Date: Tue, 1 Sep 2026 14:30:30 +0300 Subject: [PATCH 05/12] QUnit: remove from facade tracker, dblclick, add seam for viz/core/plaque --- packages/devextreme/js/__internal/viz/core/plaque.ts | 9 ++++++++- packages/devextreme/testing/runner/lib/importMap.ts | 2 -- .../testing/runner/lib/namespaceFacadeModules.ts | 3 --- .../tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js | 3 ++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/devextreme/js/__internal/viz/core/plaque.ts b/packages/devextreme/js/__internal/viz/core/plaque.ts index 33f3c017989e..cab9ad80ccd3 100644 --- a/packages/devextreme/js/__internal/viz/core/plaque.ts +++ b/packages/devextreme/js/__internal/viz/core/plaque.ts @@ -1,4 +1,5 @@ /* eslint-disable @stylistic/no-mixed-operators */ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable @typescript-eslint/init-declarations */ /* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable no-nested-ternary */ @@ -223,7 +224,7 @@ function getCloudPoints({ width, height }, x, y, anchorX, anchorY, { arrowWidth, return buildPath('M', points, 'Z'); } -export class Plaque { +export let Plaque = class { widget; options; @@ -480,4 +481,10 @@ export class Plaque { const { width, height } = this._size || {}; return Math.abs(x - this.x) <= width / 2 && Math.abs(y - this.y) <= height / 2; } +}; + +/// #DEBUG +export function DEBUG_set_Plaque(value): void { + Plaque = value; } +/// #ENDDEBUG diff --git a/packages/devextreme/testing/runner/lib/importMap.ts b/packages/devextreme/testing/runner/lib/importMap.ts index 33179122d6bd..80f218cfaab5 100644 --- a/packages/devextreme/testing/runner/lib/importMap.ts +++ b/packages/devextreme/testing/runner/lib/importMap.ts @@ -365,7 +365,6 @@ export function buildQunitImportMap({ 'viz/series/points/label': `${ESM_ROOT}/viz/series/points/label.js`, 'viz/translators/range': `${ESM_ROOT}/viz/translators/range.js`, 'viz/translators/translator1d': `${ESM_ROOT}/viz/translators/translator1d.js`, - 'viz/core/plaque': `${ESM_ROOT}/viz/core/plaque.js`, 'viz/range_selector/tracker': `${ESM_ROOT}/viz/range_selector/tracker.js`, 'viz/range_selector/series_data_source': `${ESM_ROOT}/viz/range_selector/series_data_source.js`, 'viz/range_selector/sliders_controller': `${ESM_ROOT}/viz/range_selector/sliders_controller.js`, @@ -390,7 +389,6 @@ export function buildQunitImportMap({ '__internal/viz/series/points/label': `${ESM_ROOT}/__internal/viz/series/points/label.js`, '__internal/viz/translators/range': `${ESM_ROOT}/__internal/viz/translators/range.js`, '__internal/viz/translators/translator1d': `${ESM_ROOT}/__internal/viz/translators/translator1d.js`, - '__internal/viz/core/plaque': `${ESM_ROOT}/__internal/viz/core/plaque.js`, '__internal/viz/range_selector/tracker': `${ESM_ROOT}/__internal/viz/range_selector/tracker.js`, '__internal/viz/range_selector/series_data_source': `${ESM_ROOT}/__internal/viz/range_selector/series_data_source.js`, '__internal/viz/range_selector/sliders_controller': `${ESM_ROOT}/__internal/viz/range_selector/sliders_controller.js`, diff --git a/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts b/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts index 4a61b2d797d3..dafa06ce7a4e 100644 --- a/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts +++ b/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts @@ -4,7 +4,6 @@ export const NAMESPACE_FACADE_MODULES: readonly string[] = [ '__internal/core/localization/ldml/dateParserModule.js', '__internal/viz/core/exportModule.js', '__internal/viz/paletteModule.js', - 'common/core/events/dblclick.js', 'viz/axes/base_axis.js', 'viz/axes/tick_generator.js', 'viz/chart_components/crosshair.js', @@ -15,7 +14,6 @@ export const NAMESPACE_FACADE_MODULES: readonly string[] = [ 'viz/components/legend.js', 'viz/core/base_theme_manager.js', 'viz/core/loading_indicator.js', - 'viz/core/plaque.js', 'viz/core/renderers/animation.js', 'viz/core/renderers/renderer_default.js', 'viz/core/series_family.js', @@ -25,7 +23,6 @@ export const NAMESPACE_FACADE_MODULES: readonly string[] = [ 'viz/range_selector/series_data_source.js', 'viz/range_selector/sliders_controller.js', 'viz/range_selector/tracker.js', - 'viz/sankey/tracker.js', 'viz/series/base_series.js', 'viz/series/points/base_point.js', 'viz/series/points/label.js', diff --git a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js index ffbbc3da422a..d5831c4793ec 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js @@ -18,6 +18,7 @@ import { } from '../../helpers/vizMocks.js'; import typeUtils from 'core/utils/type'; import plaqueModule from 'viz/core/plaque'; +import { stubSeam } from '../../helpers/moduleSeam.js'; import '__internal/viz/vector_map/vector_map'; @@ -26,7 +27,7 @@ const stubLayersEnvironment = $.extend({}, environment, { environment.beforeEach.apply(this, arguments); this.layerCollection.stub('items').returns([]); this.tracker.on = sinon.stub().returns(noop); - sinon.stub(plaqueModule, 'Plaque').returns({ draw: sinon.stub(), hitTest: sinon.stub(), clear: sinon.stub() }); + stubSeam(plaqueModule, 'Plaque', 'DEBUG_set_Plaque').returns({ draw: sinon.stub(), hitTest: sinon.stub(), clear: sinon.stub() }); }, afterEach: function() { plaqueModule.Plaque.restore(); From f085aec47deabe6618e77c35d9af869632e1f0f8 Mon Sep 17 00:00:00 2001 From: Andrei Vorobev <738482+vorobey@users.noreply.github.com> Date: Tue, 1 Sep 2026 15:46:40 +0300 Subject: [PATCH 06/12] chore: replace QUnit mutable facades with DEBUG_set_* seams --- .../common/core/animation/translator.ts | 10 ++++++++- .../core/localization/ldml/date.parser.ts | 10 ++++++++- .../viz/chart_components/crosshair.ts | 12 ++++++++-- .../js/__internal/viz/core/plaque.ts | 2 +- .../viz/range_selector/range_view.ts | 13 +++++++++-- .../viz/range_selector/series_data_source.ts | 10 ++++++++- .../viz/range_selector/sliders_controller.ts | 12 ++++++++-- .../__internal/viz/range_selector/tracker.ts | 13 +++++++++-- .../viz/vector_map/control_bar/control_bar.ts | 11 ++++++++-- .../viz/vector_map/data_exchanger.ts | 13 +++++++++-- .../viz/vector_map/gesture_handler.ts | 12 ++++++++-- .../js/__internal/viz/vector_map/layout.ts | 11 ++++++++-- .../js/__internal/viz/vector_map/legend.ts | 10 +++++++-- .../viz/vector_map/projection.main.ts | 9 +++++++- .../viz/vector_map/tooltip_viewer.ts | 12 ++++++++-- .../testing/runner/lib/importMap.ts | 22 ------------------- .../testing/runner/lib/mutableModuleGroups.ts | 7 ------ .../runner/lib/namespaceFacadeModules.ts | 14 ------------ .../DevExpress.animation/position.tests.js | 3 ++- .../datebox.mask.tests.js | 3 ++- .../chartParts/commons.js | 3 ++- .../DevExpress.viz.charts/charts.tests.js | 2 +- .../common.part1.tests.js | 9 ++++---- .../common.part2.tests.js | 4 ++-- .../common.part3.tests.js | 7 +++--- .../rangeSelectorParts/commons.js | 8 +++---- .../controlBar.tests.js | 2 +- .../dataExchanger.tests.js | 2 +- .../dxVectorMap.tests.js | 20 ++++++++--------- .../map.elementsInteraction.tests.js | 5 +++-- .../mapLayer_new.tests.js | 6 ++--- .../vectorMapParts/commons.js | 14 ++++++------ 32 files changed, 182 insertions(+), 109 deletions(-) diff --git a/packages/devextreme/js/__internal/common/core/animation/translator.ts b/packages/devextreme/js/__internal/common/core/animation/translator.ts index 001375a94dc6..a07a1b852626 100644 --- a/packages/devextreme/js/__internal/common/core/animation/translator.ts +++ b/packages/devextreme/js/__internal/common/core/animation/translator.ts @@ -1,4 +1,6 @@ /* eslint-disable func-names */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable @typescript-eslint/prefer-optional-chain */ /* eslint-disable @typescript-eslint/no-use-before-define */ import { data as elementData, removeData } from '@js/core/element_data'; @@ -124,7 +126,7 @@ export const move = function ( } }; -export const resetPosition = function ( +export let resetPosition = function ( $element: dxElementWrapper | Element | undefined, finishTransition?: boolean, ): void { @@ -170,3 +172,9 @@ export const parseTranslate = function (translateString: string): TranslateVecto z: parseFloat(result[2]), }; }; + +/// #DEBUG +export function DEBUG_set_resetPosition(value: typeof resetPosition): void { + resetPosition = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/core/localization/ldml/date.parser.ts b/packages/devextreme/js/__internal/core/localization/ldml/date.parser.ts index 941d4ee6970e..cc259d3572a9 100644 --- a/packages/devextreme/js/__internal/core/localization/ldml/date.parser.ts +++ b/packages/devextreme/js/__internal/core/localization/ldml/date.parser.ts @@ -1,4 +1,6 @@ /* eslint-disable spellcheck/spell-checker */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable @typescript-eslint/naming-convention */ import type { Format } from '@ts/core/localization/date'; import { escapeRegExp } from '@ts/core/utils/m_common'; import { logger } from '@ts/core/utils/m_console'; @@ -235,7 +237,7 @@ export const isPossibleForParsingFormat = (patterns: string[]): boolean => { }); }; -export const getRegExpInfo = ( +export let getRegExpInfo = ( format: string, dateParts: LdlmDateLocalization, ): { @@ -381,3 +383,9 @@ export const getParser = (format: string, dateParts: LdlmDateLocalization) => { return null; }; }; + +/// #DEBUG +export function DEBUG_set_getRegExpInfo(value: typeof getRegExpInfo): void { + getRegExpInfo = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/chart_components/crosshair.ts b/packages/devextreme/js/__internal/viz/chart_components/crosshair.ts index 61174b64b40d..659a5a775ae2 100644 --- a/packages/devextreme/js/__internal/viz/chart_components/crosshair.ts +++ b/packages/devextreme/js/__internal/viz/chart_components/crosshair.ts @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/no-this-alias */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable @typescript-eslint/init-declarations */ /* eslint-disable no-plusplus */ /* eslint-disable func-names */ @@ -69,13 +71,13 @@ function getLabelCheckerPosition(x, y, isHorizontal, canvas) { }; } -export function Crosshair(renderer, options, params, group) { +export let Crosshair = function (renderer, options, params, group) { const that = this; that._renderer = renderer; that._crosshairGroup = group; that._options = {}; that.update(options, params); -} +}; Crosshair.prototype = { constructor: Crosshair, @@ -323,3 +325,9 @@ Crosshair.prototype = { } }, }; + +/// #DEBUG +export function DEBUG_set_Crosshair(value: typeof Crosshair): void { + Crosshair = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/core/plaque.ts b/packages/devextreme/js/__internal/viz/core/plaque.ts index cab9ad80ccd3..92771ad46b4b 100644 --- a/packages/devextreme/js/__internal/viz/core/plaque.ts +++ b/packages/devextreme/js/__internal/viz/core/plaque.ts @@ -484,7 +484,7 @@ export let Plaque = class { }; /// #DEBUG -export function DEBUG_set_Plaque(value): void { +export function DEBUG_set_Plaque(value: typeof Plaque): void { Plaque = value; } /// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/range_selector/range_view.ts b/packages/devextreme/js/__internal/viz/range_selector/range_view.ts index 3d5424ba3beb..44fe418a92b8 100644 --- a/packages/devextreme/js/__internal/viz/range_selector/range_view.ts +++ b/packages/devextreme/js/__internal/viz/range_selector/range_view.ts @@ -1,4 +1,7 @@ /* eslint-disable @typescript-eslint/init-declarations */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable func-names */ +/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable no-param-reassign */ /* eslint-disable no-multi-assign */ /* eslint-disable @stylistic/max-len */ @@ -36,11 +39,11 @@ function merge(a, b) { return a !== undefined ? a : b; } -export function RangeView(params) { +export let RangeView = function (params) { this._params = params; this._clipRect = params.renderer.clipRect(); params.root.attr({ 'clip-path': this._clipRect.id }); -} +}; RangeView.prototype = { constructor: RangeView, @@ -84,3 +87,9 @@ RangeView.prototype = { } }, }; + +/// #DEBUG +export function DEBUG_set_RangeView(value: typeof RangeView): void { + RangeView = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/range_selector/series_data_source.ts b/packages/devextreme/js/__internal/viz/range_selector/series_data_source.ts index 46a17f76d824..bb892f297758 100644 --- a/packages/devextreme/js/__internal/viz/range_selector/series_data_source.ts +++ b/packages/devextreme/js/__internal/viz/range_selector/series_data_source.ts @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/no-this-alias */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable @typescript-eslint/init-declarations */ /* eslint-disable no-plusplus */ /* eslint-disable func-names */ @@ -57,7 +59,7 @@ const processSeriesFamilies = function (series, minBubbleSize, maxBubbleSize, ba return families; }; -export const SeriesDataSource = function (options) { +export let SeriesDataSource = function (options) { const that = this; const themeManager = that._themeManager = createThemeManager(options.chart); @@ -278,3 +280,9 @@ SeriesDataSource.prototype = { return this._themeManager; }, }; + +/// #DEBUG +export function DEBUG_set_SeriesDataSource(value: typeof SeriesDataSource): void { + SeriesDataSource = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/range_selector/sliders_controller.ts b/packages/devextreme/js/__internal/viz/range_selector/sliders_controller.ts index f2c26e68e6b8..6fa812b8e468 100644 --- a/packages/devextreme/js/__internal/viz/range_selector/sliders_controller.ts +++ b/packages/devextreme/js/__internal/viz/range_selector/sliders_controller.ts @@ -1,4 +1,6 @@ /* eslint-disable max-depth */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable no-bitwise */ /* eslint-disable @typescript-eslint/no-this-alias */ /* eslint-disable @typescript-eslint/init-declarations */ @@ -75,7 +77,7 @@ function restoreSetSelectedRange(controller) { delete controller.setSelectedRange; } -export function SlidersController(params) { +export let SlidersController = function (params) { const that = this; const sliderParams = { renderer: params.renderer, root: params.root, trackersGroup: params.trackersGroup, translator: params.translator, @@ -89,7 +91,7 @@ export function SlidersController(params) { // It seems that there is no special reasons to suppress first event - it was accidentally suppressed. // Let it stay so for now. that._processSelectionChanged = dummyProcessSelectionChanged; -} +}; SlidersController.prototype = { constructor: SlidersController, @@ -519,3 +521,9 @@ SlidersController.prototype = { this._sliders[index].toForeground(); }, }; + +/// #DEBUG +export function DEBUG_set_SlidersController(value: typeof SlidersController): void { + SlidersController = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/range_selector/tracker.ts b/packages/devextreme/js/__internal/viz/range_selector/tracker.ts index fcc50b508ad1..8d90e0457804 100644 --- a/packages/devextreme/js/__internal/viz/range_selector/tracker.ts +++ b/packages/devextreme/js/__internal/viz/range_selector/tracker.ts @@ -1,4 +1,7 @@ /* eslint-disable @typescript-eslint/init-declarations */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable func-names */ +/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable no-multi-assign */ /* eslint-disable @stylistic/max-len */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ @@ -222,7 +225,7 @@ function initializeSliderEvents(controller, sliders, state, getRootOffsetLeft) { return docEvents; } -export function Tracker(params) { +export let Tracker = function (params) { const state = this._state = {}; const targets = params.controller.getTrackerTargets(); if (msPointerEnabled) { @@ -242,7 +245,7 @@ export function Tracker(params) { function getRootOffsetLeft() { return params.renderer.getRootOffset().left; } -} +}; Tracker.prototype = { constructor: Tracker, @@ -260,3 +263,9 @@ Tracker.prototype = { state.manualRangeSelectionEnabled = behavior.manualRangeSelectionEnabled; }, }; + +/// #DEBUG +export function DEBUG_set_Tracker(value: typeof Tracker): void { + Tracker = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/vector_map/control_bar/control_bar.ts b/packages/devextreme/js/__internal/viz/vector_map/control_bar/control_bar.ts index dff2890bb1ef..2425de79758e 100644 --- a/packages/devextreme/js/__internal/viz/vector_map/control_bar/control_bar.ts +++ b/packages/devextreme/js/__internal/viz/vector_map/control_bar/control_bar.ts @@ -1,4 +1,5 @@ /* eslint-disable import/no-import-module-exports */ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable new-cap */ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @stylistic/no-mixed-operators */ @@ -73,7 +74,7 @@ COMMAND_TO_TYPE_MAP[COMMAND_MOVE_UP] = COMMAND_TO_TYPE_MAP[COMMAND_MOVE_RIGHT] = COMMAND_TO_TYPE_MAP[COMMAND_ZOOM_IN] = COMMAND_TO_TYPE_MAP[COMMAND_ZOOM_OUT] = ZoomCommand; COMMAND_TO_TYPE_MAP[COMMAND_ZOOM_DRAG] = ZoomDragCommand; -export function ControlBar(parameters) { +export let ControlBar = function (parameters) { const that = this; that._params = parameters; that._createElements(parameters.renderer, parameters.container, parameters.dataKey); @@ -81,7 +82,7 @@ export function ControlBar(parameters) { that._subscribeToProjection(parameters.projection); that._subscribeToTracker(parameters.tracker); that._createCallbacks(parameters.projection); -} +}; ControlBar.prototype = { constructor: ControlBar, @@ -472,3 +473,9 @@ exports._TESTS_restoreCommandToTypeMap = function () { COMMAND_TO_TYPE_MAP = COMMAND_TO_TYPE_MAP__ORIGINAL; }; /// #ENDDEBUG + +/// #DEBUG +export function DEBUG_set_ControlBar(value: typeof ControlBar): void { + ControlBar = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/vector_map/data_exchanger.ts b/packages/devextreme/js/__internal/viz/vector_map/data_exchanger.ts index 3f0cf7a4f8a6..87c7a2b910d4 100644 --- a/packages/devextreme/js/__internal/viz/vector_map/data_exchanger.ts +++ b/packages/devextreme/js/__internal/viz/vector_map/data_exchanger.ts @@ -1,4 +1,7 @@ /* eslint-disable no-return-assign */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable @typescript-eslint/naming-convention */ +/* eslint-disable func-names */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/explicit-function-return-type */ @@ -6,9 +9,9 @@ import Callbacks from '@js/core/utils/callbacks'; -export function DataExchanger() { +export let DataExchanger = function () { this._store = {}; -} +}; DataExchanger.prototype = { constructor: DataExchanger, @@ -43,3 +46,9 @@ DataExchanger.prototype = { return this; }, }; + +/// #DEBUG +export function DEBUG_set_DataExchanger(value: typeof DataExchanger): void { + DataExchanger = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/vector_map/gesture_handler.ts b/packages/devextreme/js/__internal/viz/vector_map/gesture_handler.ts index 0fffd4195425..03cf23d611e0 100644 --- a/packages/devextreme/js/__internal/viz/vector_map/gesture_handler.ts +++ b/packages/devextreme/js/__internal/viz/vector_map/gesture_handler.ts @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/no-this-alias */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable func-names */ /* eslint-disable @typescript-eslint/init-declarations */ /* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable no-multi-assign */ @@ -8,13 +10,13 @@ const _ln = Math.log; const _LN2 = Math.LN2; -export function GestureHandler(params) { +export let GestureHandler = function (params) { const that = this; that._projection = params.projection; that._renderer = params.renderer; that._x = that._y = 0; that._subscribeToTracker(params.tracker); -} +}; GestureHandler.prototype = { constructor: GestureHandler, @@ -106,3 +108,9 @@ GestureHandler.prototype = { } }, }; + +/// #DEBUG +export function DEBUG_set_GestureHandler(value: typeof GestureHandler): void { + GestureHandler = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/vector_map/layout.ts b/packages/devextreme/js/__internal/viz/vector_map/layout.ts index 8de01f8433b4..7ffe923d8991 100644 --- a/packages/devextreme/js/__internal/viz/vector_map/layout.ts +++ b/packages/devextreme/js/__internal/viz/vector_map/layout.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/restrict-plus-operands */ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable max-depth */ /* eslint-disable @typescript-eslint/no-this-alias */ /* eslint-disable @typescript-eslint/init-declarations */ @@ -207,7 +208,7 @@ function applyLayout(canvas, items) { } } -export function LayoutControl(widget) { +export let LayoutControl = function (widget) { const that = this; that._items = []; that._suspended = 0; @@ -215,7 +216,7 @@ export function LayoutControl(widget) { that._updateLayout = function () { that._update(); }; -} +}; LayoutControl.prototype = { constructor: LayoutControl, @@ -266,3 +267,9 @@ LayoutControl.prototype = { } }, }; + +/// #DEBUG +export function DEBUG_set_LayoutControl(value: typeof LayoutControl): void { + LayoutControl = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/vector_map/legend.ts b/packages/devextreme/js/__internal/viz/vector_map/legend.ts index eb5d39c0c227..a0cc3472d8da 100644 --- a/packages/devextreme/js/__internal/viz/vector_map/legend.ts +++ b/packages/devextreme/js/__internal/viz/vector_map/legend.ts @@ -119,11 +119,11 @@ Legend.prototype = _extend(clone(_BaseLegend.prototype), { }, }); -export function LegendsControl(parameters) { +export let LegendsControl = function (parameters) { this._params = parameters; this._items = []; parameters.container.virtualLink('legend-base'); -} +}; LegendsControl.prototype = { constructor: LegendsControl, @@ -170,3 +170,9 @@ exports._TESTS_restoreLegendType = function () { Legend = originalLegend; }; /// #ENDDEBUG + +/// #DEBUG +export function DEBUG_set_LegendsControl(value: typeof LegendsControl): void { + LegendsControl = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/vector_map/projection.main.ts b/packages/devextreme/js/__internal/viz/vector_map/projection.main.ts index 3a960f5aaac9..55ddf0eafec6 100644 --- a/packages/devextreme/js/__internal/viz/vector_map/projection.main.ts +++ b/packages/devextreme/js/__internal/viz/vector_map/projection.main.ts @@ -1,4 +1,5 @@ /* eslint-disable @stylistic/no-mixed-operators */ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable no-bitwise */ /* eslint-disable @typescript-eslint/no-this-alias */ /* eslint-disable @typescript-eslint/init-declarations */ @@ -65,7 +66,7 @@ function getEngine(engine) { return (engine instanceof Engine && engine) || projection.get(engine) || projection(engine) || projection.get(DEFAULT_ENGINE_NAME); } -export const Projection = function (parameters) { +export let Projection = function (parameters) { const that = this; that._initEvents(); that._params = parameters; @@ -553,3 +554,9 @@ function createProjectUnprojectMethods(project, unproject, p1, p2, delta) { /// #DEBUG export { Engine as _TESTS_Engine }; /// #ENDDEBUG + +/// #DEBUG +export function DEBUG_set_Projection(value: typeof Projection): void { + Projection = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/vector_map/tooltip_viewer.ts b/packages/devextreme/js/__internal/viz/vector_map/tooltip_viewer.ts index 5e51270096a5..f564f31dad0b 100644 --- a/packages/devextreme/js/__internal/viz/vector_map/tooltip_viewer.ts +++ b/packages/devextreme/js/__internal/viz/vector_map/tooltip_viewer.ts @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/init-declarations */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable func-names */ /* eslint-disable @stylistic/max-len */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ @@ -9,9 +11,9 @@ const TOOLTIP_OFFSET = 12; // TODO: Somehow it should be merged with the core.Tooltip -export function TooltipViewer(params) { +export let TooltipViewer = function (params) { this._subscribeToTracker(params.tracker, params.tooltip, params.layerCollection); -} +}; TooltipViewer.prototype = { constructor: TooltipViewer, @@ -45,3 +47,9 @@ TooltipViewer.prototype = { }); }, }; + +/// #DEBUG +export function DEBUG_set_TooltipViewer(value: typeof TooltipViewer): void { + TooltipViewer = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/testing/runner/lib/importMap.ts b/packages/devextreme/testing/runner/lib/importMap.ts index 80f218cfaab5..7550bb05ac0e 100644 --- a/packages/devextreme/testing/runner/lib/importMap.ts +++ b/packages/devextreme/testing/runner/lib/importMap.ts @@ -356,7 +356,6 @@ export function buildQunitImportMap({ 'viz/core/base_theme_manager': `${ESM_ROOT}/viz/core/base_theme_manager.js`, 'viz/chart_components/layout_manager': `${ESM_ROOT}/viz/chart_components/layout_manager.js`, 'viz/chart_components/scroll_bar': `${ESM_ROOT}/viz/chart_components/scroll_bar.js`, - 'viz/chart_components/crosshair': `${ESM_ROOT}/viz/chart_components/crosshair.js`, 'viz/components/chart_theme_manager': `${ESM_ROOT}/viz/components/chart_theme_manager.js`, 'viz/components/data_validator': `${ESM_ROOT}/viz/components/data_validator.js`, 'viz/series/points/base_point': `${ESM_ROOT}/viz/series/points/base_point.js`, @@ -365,22 +364,11 @@ export function buildQunitImportMap({ 'viz/series/points/label': `${ESM_ROOT}/viz/series/points/label.js`, 'viz/translators/range': `${ESM_ROOT}/viz/translators/range.js`, 'viz/translators/translator1d': `${ESM_ROOT}/viz/translators/translator1d.js`, - 'viz/range_selector/tracker': `${ESM_ROOT}/viz/range_selector/tracker.js`, - 'viz/range_selector/series_data_source': `${ESM_ROOT}/viz/range_selector/series_data_source.js`, - 'viz/range_selector/sliders_controller': `${ESM_ROOT}/viz/range_selector/sliders_controller.js`, - 'viz/vector_map/projection.main': `${ESM_ROOT}/viz/vector_map/projection.main.js`, - 'viz/vector_map/control_bar/control_bar': `${ESM_ROOT}/viz/vector_map/control_bar/control_bar.js`, - 'viz/vector_map/gesture_handler': `${ESM_ROOT}/viz/vector_map/gesture_handler.js`, 'viz/vector_map/tracker': `${ESM_ROOT}/viz/vector_map/tracker.js`, - 'viz/vector_map/data_exchanger': `${ESM_ROOT}/viz/vector_map/data_exchanger.js`, - 'viz/vector_map/legend': `${ESM_ROOT}/viz/vector_map/legend.js`, - 'viz/vector_map/layout': `${ESM_ROOT}/viz/vector_map/layout.js`, 'viz/vector_map/map_layer': `${ESM_ROOT}/viz/vector_map/map_layer.js`, - 'viz/vector_map/tooltip_viewer': `${ESM_ROOT}/viz/vector_map/tooltip_viewer.js`, '__internal/viz/core/base_theme_manager': `${ESM_ROOT}/__internal/viz/core/base_theme_manager.js`, '__internal/viz/chart_components/layout_manager': `${ESM_ROOT}/__internal/viz/chart_components/layout_manager.js`, '__internal/viz/chart_components/scroll_bar': `${ESM_ROOT}/__internal/viz/chart_components/scroll_bar.js`, - '__internal/viz/chart_components/crosshair': `${ESM_ROOT}/__internal/viz/chart_components/crosshair.js`, '__internal/viz/components/chart_theme_manager': `${ESM_ROOT}/__internal/viz/components/chart_theme_manager.js`, '__internal/viz/components/data_validator': `${ESM_ROOT}/__internal/viz/components/data_validator.js`, '__internal/viz/series/points/base_point': `${ESM_ROOT}/__internal/viz/series/points/base_point.js`, @@ -389,18 +377,8 @@ export function buildQunitImportMap({ '__internal/viz/series/points/label': `${ESM_ROOT}/__internal/viz/series/points/label.js`, '__internal/viz/translators/range': `${ESM_ROOT}/__internal/viz/translators/range.js`, '__internal/viz/translators/translator1d': `${ESM_ROOT}/__internal/viz/translators/translator1d.js`, - '__internal/viz/range_selector/tracker': `${ESM_ROOT}/__internal/viz/range_selector/tracker.js`, - '__internal/viz/range_selector/series_data_source': `${ESM_ROOT}/__internal/viz/range_selector/series_data_source.js`, - '__internal/viz/range_selector/sliders_controller': `${ESM_ROOT}/__internal/viz/range_selector/sliders_controller.js`, - '__internal/viz/vector_map/projection.main': `${ESM_ROOT}/__internal/viz/vector_map/projection.main.js`, - '__internal/viz/vector_map/control_bar/control_bar': `${ESM_ROOT}/__internal/viz/vector_map/control_bar/control_bar.js`, - '__internal/viz/vector_map/gesture_handler': `${ESM_ROOT}/__internal/viz/vector_map/gesture_handler.js`, '__internal/viz/vector_map/tracker': `${ESM_ROOT}/__internal/viz/vector_map/tracker.js`, - '__internal/viz/vector_map/data_exchanger': `${ESM_ROOT}/__internal/viz/vector_map/data_exchanger.js`, - '__internal/viz/vector_map/legend': `${ESM_ROOT}/__internal/viz/vector_map/legend.js`, - '__internal/viz/vector_map/layout': `${ESM_ROOT}/__internal/viz/vector_map/layout.js`, '__internal/viz/vector_map/map_layer': `${ESM_ROOT}/__internal/viz/vector_map/map_layer.js`, - '__internal/viz/vector_map/tooltip_viewer': `${ESM_ROOT}/__internal/viz/vector_map/tooltip_viewer.js`, 'ui/themes': `${SHIMS}/themes.js`, '__internal/ui/themes': `${SHIMS}/themes.js`, diff --git a/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts b/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts index 56257711edab..5115f2dba0d4 100644 --- a/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts +++ b/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts @@ -62,13 +62,6 @@ export const MUTABLE_MODULE_GROUPS: readonly MutableModuleGroup[] = [ internal: '__internal/viz/core/loading_indicator.js', also: ['viz/core/loading_indicator.js'], }, - { - internal: '__internal/core/localization/ldml/date.parser.js', - also: [ - '__internal/core/localization/ldml/dateParserModule.js', - 'common/core/localization/ldml/date.parser.js', - ], - }, { // Real named exports live in palette.js; paletteModule.js is only // `import * as PaletteModule from './palette'; export default PaletteModule`. diff --git a/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts b/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts index dafa06ce7a4e..c614590e39b8 100644 --- a/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts +++ b/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts @@ -1,12 +1,9 @@ export const NAMESPACE_FACADE_MODULES: readonly string[] = [ '__internal/common/core/animation/frameModule.js', - '__internal/common/core/animation/translatorModule.js', - '__internal/core/localization/ldml/dateParserModule.js', '__internal/viz/core/exportModule.js', '__internal/viz/paletteModule.js', 'viz/axes/base_axis.js', 'viz/axes/tick_generator.js', - 'viz/chart_components/crosshair.js', 'viz/chart_components/layout_manager.js', 'viz/chart_components/scroll_bar.js', 'viz/components/chart_theme_manager.js', @@ -19,23 +16,12 @@ export const NAMESPACE_FACADE_MODULES: readonly string[] = [ 'viz/core/series_family.js', 'viz/core/tooltip.js', 'viz/core/utils_default.js', - 'viz/range_selector/range_view.js', - 'viz/range_selector/series_data_source.js', - 'viz/range_selector/sliders_controller.js', - 'viz/range_selector/tracker.js', 'viz/series/base_series.js', 'viz/series/points/base_point.js', 'viz/series/points/label.js', 'viz/translators/range.js', 'viz/translators/translator1d.js', 'viz/translators/translator2d.js', - 'viz/vector_map/control_bar/control_bar.js', - 'viz/vector_map/data_exchanger.js', - 'viz/vector_map/gesture_handler.js', - 'viz/vector_map/layout.js', - 'viz/vector_map/legend.js', 'viz/vector_map/map_layer.js', - 'viz/vector_map/projection.main.js', - 'viz/vector_map/tooltip_viewer.js', 'viz/vector_map/tracker.js', ]; diff --git a/packages/devextreme/testing/tests/DevExpress.animation/position.tests.js b/packages/devextreme/testing/tests/DevExpress.animation/position.tests.js index 84f4b67bd58c..817c90f1fcd0 100644 --- a/packages/devextreme/testing/tests/DevExpress.animation/position.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.animation/position.tests.js @@ -1,6 +1,7 @@ import $ from 'jquery'; import positionUtils from 'common/core/animation/position'; import translator from '__internal/common/core/animation/translatorModule'; +import { stubSeam } from '../../helpers/moduleSeam.js'; import browser from 'core/utils/browser'; import fixtures from '../../helpers/positionFixtures.js'; import { implementationsMap } from 'core/utils/size'; @@ -1020,7 +1021,7 @@ const testCollision = (name, fixtureName, params, expectedHorzDist, expectedVert // T664522 QUnit.test('setup should call resetPosition with finishTransition argument', function(assert) { - const resetPositionStub = sinon.stub(translator, 'resetPosition').callsFake(($element, finishTransition) => { + const resetPositionStub = stubSeam(translator, 'resetPosition', 'DEBUG_set_resetPosition').callsFake(($element, finishTransition) => { assert.equal(finishTransition, true, 'finishTransition is true'); }); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/datebox.mask.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/datebox.mask.tests.js index 69b3b7bd9bbb..a58a2ede028e 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/datebox.mask.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/datebox.mask.tests.js @@ -1,6 +1,7 @@ import $ from 'jquery'; import { renderDateParts, getDatePartIndexByPosition } from '__internal/ui/date_box/date_box.mask.parts'; import dateParser from '__internal/core/localization/ldml/dateParserModule'; +import { spySeam } from '../../helpers/moduleSeam.js'; import dateLocalization from 'common/core/localization/date'; import localization from 'localization'; import { noop } from 'core/utils/common'; @@ -1761,7 +1762,7 @@ module('Options changed', setupModule, () => { }); test('performance - value change should not lead to recreate regexp and format pattern', function(assert) { - const regExpInfo = sinon.spy(dateParser, 'getRegExpInfo'); + const regExpInfo = spySeam(dateParser, 'getRegExpInfo', 'DEBUG_set_getRegExpInfo'); this.instance.option('displayFormat', 'dd.MM'); assert.strictEqual(regExpInfo.callCount, 1, 'regexpInfo should be called when format changed'); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/chartParts/commons.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/chartParts/commons.js index da30309955ac..24838cbd21b1 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/chartParts/commons.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/chartParts/commons.js @@ -32,6 +32,7 @@ import { } from '../../../helpers/chartMocks.js'; import exportModule from '__internal/viz/core/exportModule'; import { _test_prepareSegmentRectPoints } from 'viz/utils'; +import { stubSeam } from '../../../helpers/moduleSeam.js'; const ThemeManager = stubClass(chartThemeManagerModule.ThemeManager); const LayoutManager = stubClass(layoutManagerModule.LayoutManager); @@ -239,7 +240,7 @@ const environment = { return family; }); this.prepareSegmentRectPoints = _test_prepareSegmentRectPoints(function(x, y, w, h, borderOptions) { return { points: [x, y, w, h], pathType: borderOptions }; }); - this.createCrosshair = sinon.stub(crosshairModule, 'Crosshair').callsFake(function() { + this.createCrosshair = stubSeam(crosshairModule, 'Crosshair', 'DEBUG_set_Crosshair').callsFake(function() { return sinon.createStubInstance(Crosshair); }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/charts.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/charts.tests.js index fdc0508079eb..874346da6d7e 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/charts.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/charts.tests.js @@ -1,7 +1,7 @@ import testGlobalExports from '../../helpers/publicModulesHelper.js'; import * as AdvancedChartModule from '__internal/viz/chart_components/m_advanced_chart'; import * as baseChartModule from '__internal/viz/chart_components/m_base_chart'; -import * as CrosshairModule from 'viz/chart_components/crosshair'; +import CrosshairModule from 'viz/chart_components/crosshair'; import * as LayoutManagerModule from 'viz/chart_components/layout_manager'; import multiAxesSynchronizer from '__internal/viz/chart_components/multi_axes_synchronizer'; import * as ScrollBarModule from 'viz/chart_components/scroll_bar'; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common.part1.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common.part1.tests.js index 3ecc2744688f..3891b97818c0 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common.part1.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common.part1.tests.js @@ -1,5 +1,6 @@ import $ from 'jquery'; import trackerModule from 'viz/range_selector/tracker'; +import { spySeam } from '../../helpers/moduleSeam.js'; import { DataSource } from 'common/data/data_source/data_source'; import seriesDataSourceModule from 'viz/range_selector/series_data_source'; import { @@ -196,7 +197,7 @@ QUnit.test('correct sliders place holder size by values', function(assert) { }); QUnit.test('Tracker creation', function(assert) { - const spy = sinon.spy(trackerModule, 'Tracker'); + const spy = spySeam(trackerModule, 'Tracker', 'DEBUG_set_Tracker'); this.createWidget(); assert.deepEqual(spy.lastCall.args, [{ renderer: this.renderer, controller: this.slidersController }]); @@ -261,7 +262,7 @@ QUnit.test('dataSource is loaded', function(assert) { }); QUnit.test('Update axis canvas before create series dataSorce', function(assert) { - const spy = sinon.spy(seriesDataSourceModule, 'SeriesDataSource'); + const spy = spySeam(seriesDataSourceModule, 'SeriesDataSource', 'DEBUG_set_SeriesDataSource'); this.seriesDataSource.stub('getBoundRange').returns({ arg: new StubRange(), val: new StubRange() @@ -379,7 +380,7 @@ QUnit.test('scale. not valid logarithmBase, string', function(assert) { }); QUnit.test('valueAxis. logarithmic type', function(assert) { - const spy = sinon.spy(seriesDataSourceModule, 'SeriesDataSource'); + const spy = spySeam(seriesDataSourceModule, 'SeriesDataSource', 'DEBUG_set_SeriesDataSource'); this.seriesDataSource.stub('getBoundRange').returns({ arg: new StubRange(), val: new StubRange() @@ -400,7 +401,7 @@ QUnit.test('valueAxis. logarithmic type', function(assert) { }); QUnit.test('valueAxis. not valid logarithmBase', function(assert) { - const spy = sinon.spy(seriesDataSourceModule, 'SeriesDataSource'); + const spy = spySeam(seriesDataSourceModule, 'SeriesDataSource', 'DEBUG_set_SeriesDataSource'); this.seriesDataSource.stub('isShowChart').returns(true); this.seriesDataSource.stub('getBoundRange').returns({ arg: new StubRange(), diff --git a/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common.part2.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common.part2.tests.js index fd2ddaa1be90..1aeaabbf35b1 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common.part2.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common.part2.tests.js @@ -56,10 +56,10 @@ const environmentWithDataSource = $.extend({}, environment, { beforeEach: function() { environment.beforeEach.apply(this, arguments); const test = this; - seriesDataSourceModule.SeriesDataSource = function(params) { + seriesDataSourceModule.DEBUG_set_SeriesDataSource(function(params) { test.seriesDataSource = new _SeriesDataSource(params); return test.seriesDataSource; - }; + }); } }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common.part3.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common.part3.tests.js index 34f401fc6702..6b0d5fe5bad7 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common.part3.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common.part3.tests.js @@ -8,6 +8,7 @@ import { StubRange, } from './rangeSelectorParts/commons.js'; import slidersControllerModule from 'viz/range_selector/sliders_controller'; +import { spySeam } from '../../helpers/moduleSeam.js'; import seriesDataSourceModule from 'viz/range_selector/series_data_source'; import { DataSource } from 'common/data/data_source/data_source'; import dateLocalization from 'common/core/localization/date'; @@ -23,7 +24,7 @@ const formatsAreEqual = function(format1, format2) { QUnit.module('Parsing data', $.extend({}, environment, { beforeEach: function() { environment.beforeEach.apply(this, arguments); - seriesDataSourceModule.SeriesDataSource = _SeriesDataSource; + seriesDataSourceModule.DEBUG_set_SeriesDataSource(_SeriesDataSource); this.dataSource = [ { x: '10', y1: 0, y2: 10 }, { x: '15', y1: 6, y2: 12 }, @@ -400,7 +401,7 @@ QUnit.test('rangeSelector with scale.valueType and dataSourceField and without c QUnit.module('Semidiscrete scale', $.extend({}, environment, { beforeEach: function() { environment.beforeEach.apply(this, arguments); - seriesDataSourceModule.SeriesDataSource = _SeriesDataSource; + seriesDataSourceModule.DEBUG_set_SeriesDataSource(_SeriesDataSource); this.$container.width(1000); } @@ -1299,7 +1300,7 @@ QUnit.test('T214998. scale multi-line text label', function(assert) { }); QUnit.test('range selectedRangeChanged initialization', function(assert) { - const spy = sinon.spy(slidersControllerModule, 'SlidersController'); + const spy = spySeam(slidersControllerModule, 'SlidersController', 'DEBUG_set_SlidersController'); this.createWidget(); assert.strictEqual(typeof spy.lastCall.args[0].updateSelectedRange, 'function'); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/rangeSelectorParts/commons.js b/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/rangeSelectorParts/commons.js index e2d9825cb24c..cbfe91d1f6c1 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/rangeSelectorParts/commons.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/rangeSelectorParts/commons.js @@ -77,10 +77,10 @@ export const environment = { rendererModule.Renderer = returnValue(this.renderer); themeManagerModule.BaseThemeManager = returnValue(this.themeManager); - rangeViewModule.RangeView = returnValue(this.rangeView); - slidersControllerModule.SlidersController = returnValue(this.slidersController); - trackerModule.Tracker = returnValue(this.tracker); - seriesDataSourceModule.SeriesDataSource = returnValue(this.seriesDataSource); + rangeViewModule.DEBUG_set_RangeView(returnValue(this.rangeView)); + slidersControllerModule.DEBUG_set_SlidersController(returnValue(this.slidersController)); + trackerModule.DEBUG_set_Tracker(returnValue(this.tracker)); + seriesDataSourceModule.DEBUG_set_SeriesDataSource(returnValue(this.seriesDataSource)); translator2DModule.Translator2D = returnValue(this.translator); sinon.stub(axisModule, 'Axis'); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/controlBar.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/controlBar.tests.js index 04f7ed9a1ff0..0ef0bf53391e 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/controlBar.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/controlBar.tests.js @@ -3,7 +3,7 @@ import { noop } from 'core/utils/common'; import { Renderer, } from '../../helpers/vizMocks.js'; -import * as controlBarModule from 'viz/vector_map/control_bar/control_bar'; +import controlBarModule from 'viz/vector_map/control_bar/control_bar'; function returnValue(value) { return function() { diff --git a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dataExchanger.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dataExchanger.tests.js index b0d890ba6339..f3832caec158 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dataExchanger.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dataExchanger.tests.js @@ -1,4 +1,4 @@ -import * as dataExchangerModule from 'viz/vector_map/data_exchanger'; +import dataExchangerModule from 'viz/vector_map/data_exchanger'; QUnit.module('DataExchanger', { beforeEach: function() { diff --git a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js index d5831c4793ec..4c621beac87b 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js @@ -18,7 +18,7 @@ import { } from '../../helpers/vizMocks.js'; import typeUtils from 'core/utils/type'; import plaqueModule from 'viz/core/plaque'; -import { stubSeam } from '../../helpers/moduleSeam.js'; +import { stubSeam, spySeam } from '../../helpers/moduleSeam.js'; import '__internal/viz/vector_map/vector_map'; @@ -233,7 +233,7 @@ QUnit.test('Layer collection - object option', function(assert) { }); QUnit.test('Projection', function(assert) { - const spy = sinon.spy(projectionModule, 'Projection'); + const spy = spySeam(projectionModule, 'Projection', 'DEBUG_set_Projection'); this.createMap({ projection: 'projection', @@ -257,7 +257,7 @@ QUnit.test('Projection', function(assert) { }); QUnit.test('DataExchanger', function(assert) { - const spy = sinon.spy(dataExchangerModule, 'DataExchanger'); + const spy = spySeam(dataExchangerModule, 'DataExchanger', 'DEBUG_set_DataExchanger'); this.createMap(); @@ -265,7 +265,7 @@ QUnit.test('DataExchanger', function(assert) { }); QUnit.test('GestureHandler', function(assert) { - const spy = sinon.spy(gestureHandlerModule, 'GestureHandler'); + const spy = spySeam(gestureHandlerModule, 'GestureHandler', 'DEBUG_set_GestureHandler'); this.createMap({ panningEnabled: 1, @@ -283,7 +283,7 @@ QUnit.test('GestureHandler', function(assert) { }); QUnit.test('LayoutControl', function(assert) { - const spy = sinon.spy(layoutModule, 'LayoutControl'); + const spy = spySeam(layoutModule, 'LayoutControl', 'DEBUG_set_LayoutControl'); const map = this.createMap({ layers: {} }); @@ -316,7 +316,7 @@ QUnit.test('Tracker', function(assert) { }); QUnit.test('Control bar', function(assert) { - const spy = sinon.spy(controlBarModule, 'ControlBar'); + const spy = spySeam(controlBarModule, 'ControlBar', 'DEBUG_set_ControlBar'); this.themeManager.theme.withArgs('controlBar').returns({ theme: 'control-bar' }); this.createMap({ @@ -340,7 +340,7 @@ QUnit.test('Control bar', function(assert) { }); QUnit.test('Legends', function(assert) { - const spy = sinon.spy(legendModule, 'LegendsControl'); + const spy = spySeam(legendModule, 'LegendsControl', 'DEBUG_set_LegendsControl'); const map = this.createMap({ legends: { @@ -363,7 +363,7 @@ QUnit.test('Legends', function(assert) { }); QUnit.test('TooltipViewer', function(assert) { - const spy = sinon.spy(tooltipViewerModule, 'TooltipViewer'); + const spy = spySeam(tooltipViewerModule, 'TooltipViewer', 'DEBUG_set_TooltipViewer'); this.createMap(); @@ -438,8 +438,8 @@ QUnit.test('Should created group for annotations', function(assert) { }); QUnit.test('Should created group for annotations before controll bar and legend', function(assert) { - const spyLegend = sinon.spy(legendModule, 'LegendsControl'); - const spyControlBar = sinon.spy(controlBarModule, 'ControlBar'); + const spyLegend = spySeam(legendModule, 'LegendsControl', 'DEBUG_set_LegendsControl'); + const spyControlBar = spySeam(controlBarModule, 'ControlBar', 'DEBUG_set_ControlBar'); this.createMap(); assert.ok(this.renderer.g.returnValues[1].attr.calledBefore(spyControlBar)); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/map.elementsInteraction.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/map.elementsInteraction.tests.js index 817d22978f41..1c89f6bc5f9c 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/map.elementsInteraction.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/map.elementsInteraction.tests.js @@ -6,6 +6,7 @@ import { } from './vectorMapParts/commons.js'; import mapLayerModule from 'viz/vector_map/map_layer'; import projectionModule from 'viz/vector_map/projection.main'; +import { spySeam } from '../../helpers/moduleSeam.js'; import resizeCallbacks from 'core/utils/resize_callbacks'; import { implementationsMap } from 'core/utils/size'; import { @@ -23,7 +24,7 @@ QUnit.module('Map - projection events', $.extend({}, environment, { QUnit.test('On center', function(assert) { const onCenterChanged = sinon.spy(); - const spy = sinon.spy(projectionModule, 'Projection'); + const spy = spySeam(projectionModule, 'Projection', 'DEBUG_set_Projection'); this.createMap({ onCenterChanged: onCenterChanged }); spy.lastCall.args[0].centerChanged('test-center'); @@ -33,7 +34,7 @@ QUnit.test('On center', function(assert) { QUnit.test('On zoom', function(assert) { const onZoomFactorChanged = sinon.spy(); - const spy = sinon.spy(projectionModule, 'Projection'); + const spy = spySeam(projectionModule, 'Projection', 'DEBUG_set_Projection'); this.createMap({ onZoomFactorChanged: onZoomFactorChanged }); spy.lastCall.args[0].zoomChanged('test-zoom'); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/mapLayer_new.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/mapLayer_new.tests.js index ee960f4526c4..a93808020575 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/mapLayer_new.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/mapLayer_new.tests.js @@ -27,9 +27,9 @@ titleModule.DEBUG_set_title(stubClass(titleModule.Title, { })); tooltipModule.DEBUG_set_tooltip(stubClass(tooltipModule.Tooltip)); exportMenuModule.DEBUG_set_ExportMenu(stubClass(exportMenuModule.ExportMenu)); // TODO maybe if you test layer - you should create exact layer? loadingIndicatorModule.DEBUG_set_LoadingIndicator(stubClass(loadingIndicatorModule.LoadingIndicator)); -controlBarModule.ControlBar = stubClass(controlBarModule.ControlBar); -legendModule.LegendsControl = stubClass(legendModule.LegendsControl); -tooltipViewerModule.TooltipViewer = stubClass(tooltipViewerModule.TooltipViewer); +controlBarModule.DEBUG_set_ControlBar(stubClass(controlBarModule.ControlBar)); +legendModule.DEBUG_set_LegendsControl(stubClass(legendModule.LegendsControl)); +tooltipViewerModule.DEBUG_set_TooltipViewer(stubClass(tooltipViewerModule.TooltipViewer)); const simpleProjection = projection({ aspectRatio: 4 / 3, diff --git a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/vectorMapParts/commons.js b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/vectorMapParts/commons.js index 15850d90551d..c63ca623116d 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/vectorMapParts/commons.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/vectorMapParts/commons.js @@ -53,16 +53,16 @@ function stubComponentConstructors(test) { tooltipModule.DEBUG_set_tooltip(returnValue(test.tooltip)); exportModule.DEBUG_set_ExportMenu(returnValue(test.exportMenu)); - projectionModule.Projection = returnValue(test.projection); - controlBarModule.ControlBar = returnValue(test.controlBar); - gestureHandlerModule.GestureHandler = returnValue(test.gestureHandler); + projectionModule.DEBUG_set_Projection(returnValue(test.projection)); + controlBarModule.DEBUG_set_ControlBar(returnValue(test.controlBar)); + gestureHandlerModule.DEBUG_set_GestureHandler(returnValue(test.gestureHandler)); trackerModule.Tracker = returnValue(test.tracker); themeManagerModule.BaseThemeManager = returnValue(test.themeManager); - dataExchangerModule.DataExchanger = returnValue(test.dataExchanger); - legendModule.LegendsControl = returnValue(test.legendsControl); - layoutModule.LayoutControl = returnValue(test.layoutControl); + dataExchangerModule.DEBUG_set_DataExchanger(returnValue(test.dataExchanger)); + legendModule.DEBUG_set_LegendsControl(returnValue(test.legendsControl)); + layoutModule.DEBUG_set_LayoutControl(returnValue(test.layoutControl)); mapLayerModule.MapLayerCollection = returnValue(test.layerCollection); - tooltipViewerModule.TooltipViewer = returnValue(test.tooltipViewer); + tooltipViewerModule.DEBUG_set_TooltipViewer(returnValue(test.tooltipViewer)); } export { stubComponentConstructors }; From b0f90c5091a808f9ca22a1852a5047c6423189dd Mon Sep 17 00:00:00 2001 From: Andrei Vorobev <738482+vorobey@users.noreply.github.com> Date: Tue, 1 Sep 2026 17:48:12 +0300 Subject: [PATCH 07/12] chore: remove from esm-facade viz core and vector map --- .../js/__internal/viz/axes/base_axis.ts | 9 ++++- .../js/__internal/viz/axes/tick_generator.ts | 10 ++++- .../viz/chart_components/layout_manager.ts | 12 +++++- .../viz/chart_components/scroll_bar.ts | 9 ++++- .../viz/components/chart_theme_manager.ts | 10 ++++- .../viz/components/data_validator.ts | 9 ++++- .../__internal/viz/core/base_theme_manager.ts | 10 ++++- .../viz/core/renderers/animation.ts | 12 +++++- .../js/__internal/viz/core/series_family.ts | 11 +++++- .../devextreme/js/__internal/viz/palette.ts | 25 +++++++++--- .../js/__internal/viz/series/base_series.ts | 12 +++++- .../viz/series/points/base_point.ts | 12 +++++- .../js/__internal/viz/series/points/label.ts | 15 ++++++-- .../js/__internal/viz/translators/range.ts | 9 ++++- .../viz/translators/translator1d.ts | 12 +++++- .../js/__internal/viz/vector_map/map_layer.ts | 11 +++++- .../js/__internal/viz/vector_map/tracker.ts | 10 ++++- .../devextreme/testing/helpers/chartMocks.js | 21 +++++++--- .../devextreme/testing/helpers/vizMocks.js | 8 ++-- .../testing/runner/lib/importMap.ts | 26 ------------- .../testing/runner/lib/mutableModuleGroups.ts | 38 ------------------- .../runner/lib/namespaceFacadeModules.ts | 21 ---------- .../chart.integration.tests.js | 7 ++-- .../chart.part7.tests.js | 13 ++++--- .../DevExpress.viz.charts/chart.tests.js | 14 +++---- .../chartAxisDrawing.tests.js | 7 ++-- .../chartParts/commons.js | 12 +++--- .../DevExpress.viz.charts/chartSync.tests.js | 15 ++++---- .../DevExpress.viz.charts/charts.tests.js | 4 +- .../equalPieSize.tests.js | 5 ++- .../DevExpress.viz.charts/pieChart.tests.js | 19 +++++----- .../DevExpress.viz.charts/polarChart.tests.js | 21 +++++----- .../areaSeries.tests.js | 2 +- .../barPoint.tests.js | 5 ++- .../barSeries.tests.js | 2 +- .../basePoint.tests.js | 8 ++-- .../baseSeries.tests.js | 21 +++++----- .../bubblePoint.tests.js | 5 ++- .../bubbleSeries.tests.js | 2 +- .../financialPoint.tests.js | 2 +- .../financialSeries.tests.js | 2 +- .../lineSeries.tests.js | 4 +- .../piePoint.tests.js | 5 ++- .../pieSeries.tests.js | 2 +- .../polarPoint.tests.js | 2 +- .../rangePoint.tests.js | 8 ++-- .../rangeSeries.tests.js | 6 +-- .../scatterSeries.tests.js | 2 +- .../symbolPoint.tests.js | 5 ++- .../annotations.plugins.tests.js | 4 +- .../DevExpress.viz.core/axisDrawing.tests.js | 3 +- .../axisFormatting.tests.js | 3 +- .../DevExpress.viz.core/baseAxis.tests.js | 3 +- .../baseThemeManager.tests.js | 7 ++-- .../DevExpress.viz.core/polarAxes.tests.js | 3 +- .../tests/DevExpress.viz.core/xyAxes.tests.js | 3 +- .../commonParts/label.js | 5 ++- .../funnel.base.tests.js | 5 ++- .../funnel.tracker.tests.js | 3 +- .../barGauge_new.tests.js | 2 +- .../circularGauge.tests.js | 3 +- .../DevExpress.viz.gauges/common.tests.js | 9 +++-- .../linearGauge.tests.js | 3 +- .../common_new.tests.js | 3 +- .../rangeSelectorParts/commons.js | 5 ++- .../Renderer.tests.js | 2 +- .../sankey.base.tests.js | 5 ++- .../bulletTooltip.tests.js | 4 +- .../sparkline.tests.js | 7 ++-- .../sparklineTooltip.tests.js | 4 +- .../dxVectorMap.tests.js | 20 +++++----- .../map.elementsInteraction.tests.js | 2 +- .../vectorMapParts/commons.js | 6 +-- 73 files changed, 357 insertions(+), 269 deletions(-) diff --git a/packages/devextreme/js/__internal/viz/axes/base_axis.ts b/packages/devextreme/js/__internal/viz/axes/base_axis.ts index 66b8919a6f1d..8610ce0dcf6b 100644 --- a/packages/devextreme/js/__internal/viz/axes/base_axis.ts +++ b/packages/devextreme/js/__internal/viz/axes/base_axis.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable prefer-rest-params */ /* eslint-disable @stylistic/no-mixed-operators */ /* eslint-disable max-depth */ @@ -313,7 +314,7 @@ function getConstantLineSharpDirection(coord, axisCanvas) { return Math.max(axisCanvas.start, axisCanvas.end) !== coord ? 1 : -1; } -export const Axis = function (renderSettings) { +export let Axis = function (renderSettings) { const that = this; that._renderer = renderSettings.renderer; @@ -2839,3 +2840,9 @@ Axis.prototype = { shift: _noop, /// #ENDDEBUG }; + +/// #DEBUG +export function DEBUG_set_Axis(value: typeof Axis): void { + Axis = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/axes/tick_generator.ts b/packages/devextreme/js/__internal/viz/axes/tick_generator.ts index 09d459922448..2cac668e83bf 100644 --- a/packages/devextreme/js/__internal/viz/axes/tick_generator.ts +++ b/packages/devextreme/js/__internal/viz/axes/tick_generator.ts @@ -1,4 +1,6 @@ /* eslint-disable prefer-destructuring */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @stylistic/no-mixed-operators */ /* eslint-disable prefer-spread */ @@ -806,7 +808,7 @@ function dateGenerator(options) { ); } -export const tickGenerator = function (options) { +export let tickGenerator = function (options) { let result; if (options.rangeIsEmpty) { @@ -823,3 +825,9 @@ export const tickGenerator = function (options) { return result; }; + +/// #DEBUG +export function DEBUG_set_tickGenerator(value: typeof tickGenerator): void { + tickGenerator = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/chart_components/layout_manager.ts b/packages/devextreme/js/__internal/viz/chart_components/layout_manager.ts index f74d419697b7..86fa69ed7e8c 100644 --- a/packages/devextreme/js/__internal/viz/chart_components/layout_manager.ts +++ b/packages/devextreme/js/__internal/viz/chart_components/layout_manager.ts @@ -1,4 +1,6 @@ /* eslint-disable @stylistic/no-mixed-operators */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable func-names */ /* eslint-disable no-continue */ /* eslint-disable @typescript-eslint/init-declarations */ /* eslint-disable no-plusplus */ @@ -122,8 +124,8 @@ function getInnerRadius({ type, innerRadius }) { return type === 'pie' ? 0 : _isNumber(innerRadius) ? Number(innerRadius) : DEFAULT_INNER_RADIUS; } -function LayoutManager() { -} +let LayoutManager = function () { +}; function getAverageLabelWidth(centerX, radius, canvas, sizeLabels) { return (centerX - radius - RADIAL_LABEL_INDENT - canvas.left) / sizeLabels.outerLabelsCount; @@ -278,3 +280,9 @@ LayoutManager.prototype = { }; export { LayoutManager }; + +/// #DEBUG +export function DEBUG_set_LayoutManager(value: typeof LayoutManager): void { + LayoutManager = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/chart_components/scroll_bar.ts b/packages/devextreme/js/__internal/viz/chart_components/scroll_bar.ts index 449be66e01ea..7c655488d100 100644 --- a/packages/devextreme/js/__internal/viz/chart_components/scroll_bar.ts +++ b/packages/devextreme/js/__internal/viz/chart_components/scroll_bar.ts @@ -1,4 +1,5 @@ /* eslint-disable @stylistic/no-mixed-operators */ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable @typescript-eslint/no-this-alias */ /* eslint-disable @typescript-eslint/init-declarations */ /* eslint-disable func-names */ @@ -23,7 +24,7 @@ const _min = Math.min; const _max = Math.max; const MIN_SCROLL_BAR_SIZE = 10; -export const ScrollBar = function (renderer, group) { +export let ScrollBar = function (renderer, group) { this._translator = new Translator2D({}, {}, {}); this._scroll = renderer.rect().append(group); this._addEvents(); @@ -283,3 +284,9 @@ ScrollBar.prototype = { }); }, }; + +/// #DEBUG +export function DEBUG_set_ScrollBar(value: typeof ScrollBar): void { + ScrollBar = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/components/chart_theme_manager.ts b/packages/devextreme/js/__internal/viz/components/chart_theme_manager.ts index 214be1c8e5fe..426399df779f 100644 --- a/packages/devextreme/js/__internal/viz/components/chart_theme_manager.ts +++ b/packages/devextreme/js/__internal/viz/components/chart_theme_manager.ts @@ -1,4 +1,6 @@ /* eslint-disable prefer-rest-params */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable @stylistic/no-mixed-operators */ /* eslint-disable no-bitwise */ /* eslint-disable prefer-spread */ @@ -26,7 +28,7 @@ import { import { BaseThemeManager } from '@ts/viz/core/base_theme_manager'; import { extractColor, normalizeEnum as _normalizeEnum } from '@ts/viz/core/utils'; -export const ThemeManager = BaseThemeManager.inherit((function () { +export let ThemeManager = BaseThemeManager.inherit((function () { const ctor = function (params) { const that = this; @@ -245,3 +247,9 @@ export const ThemeManager = BaseThemeManager.inherit((function () { }, }; })()); + +/// #DEBUG +export function DEBUG_set_ThemeManager(value: typeof ThemeManager): void { + ThemeManager = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/components/data_validator.ts b/packages/devextreme/js/__internal/viz/components/data_validator.ts index ce855b2f2e60..3b0325eb41ce 100644 --- a/packages/devextreme/js/__internal/viz/components/data_validator.ts +++ b/packages/devextreme/js/__internal/viz/components/data_validator.ts @@ -1,4 +1,5 @@ /* eslint-disable @stylistic/max-len */ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable @typescript-eslint/explicit-function-return-type */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/init-declarations */ @@ -505,7 +506,7 @@ function verifyData(source, incidentOccurred) { return data; } -export function validateData(data, groupsData, incidentOccurred, options) { +export let validateData = function (data, groupsData, incidentOccurred, options) { data = verifyData(data, incidentOccurred); groupsData.argumentType = groupsData.argumentAxisType = null; @@ -524,4 +525,10 @@ export function validateData(data, groupsData, incidentOccurred, options) { const dataByArgumentFields = sortData(data, groupsData, options, getUniqueArgumentFields(groupsData)); return dataByArgumentFields; +}; + +/// #DEBUG +export function DEBUG_set_validateData(value: typeof validateData): void { + validateData = value; } +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/core/base_theme_manager.ts b/packages/devextreme/js/__internal/viz/core/base_theme_manager.ts index f6b3c66ed460..d6cd0127205a 100644 --- a/packages/devextreme/js/__internal/viz/core/base_theme_manager.ts +++ b/packages/devextreme/js/__internal/viz/core/base_theme_manager.ts @@ -1,4 +1,6 @@ /* eslint-disable no-return-assign */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable func-names */ /* eslint-disable @typescript-eslint/no-this-alias */ /* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable no-multi-assign */ @@ -32,7 +34,7 @@ function getThemePart(theme, path) { return _theme; } -export const BaseThemeManager = Class.inherit({ // TODO: test hack +export let BaseThemeManager = Class.inherit({ // TODO: test hack ctor(options) { this._themeSection = options.themeSection; this._fontFields = options.fontFields || []; @@ -115,3 +117,9 @@ export const BaseThemeManager = Class.inherit({ // TODO: test hack _extend(font, this._font, _extend({}, font)); }, }); + +/// #DEBUG +export function DEBUG_set_BaseThemeManager(value: typeof BaseThemeManager): void { + BaseThemeManager = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/core/renderers/animation.ts b/packages/devextreme/js/__internal/viz/core/renderers/animation.ts index eadbcee48f76..0c9d9f165e5a 100644 --- a/packages/devextreme/js/__internal/viz/core/renderers/animation.ts +++ b/packages/devextreme/js/__internal/viz/core/renderers/animation.ts @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/prefer-optional-chain */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable no-restricted-globals */ /* eslint-disable func-names */ /* eslint-disable @typescript-eslint/no-shadow */ @@ -144,13 +146,13 @@ Animation.prototype = { }, }; -export function AnimationController(element) { +export let AnimationController = function (element) { const that = this; that._animationCount = 0; that._timerId = null; that._animations = {}; that.element = element; -} +}; AnimationController.prototype = { _loop() { @@ -239,3 +241,9 @@ AnimationController.prototype = { !hasUnstoppableInAnimations && this.stop(); }, }; + +/// #DEBUG +export function DEBUG_set_AnimationController(value: typeof AnimationController): void { + AnimationController = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/core/series_family.ts b/packages/devextreme/js/__internal/viz/core/series_family.ts index 25ca9ce1c54c..e92f595aaeb1 100644 --- a/packages/devextreme/js/__internal/viz/core/series_family.ts +++ b/packages/devextreme/js/__internal/viz/core/series_family.ts @@ -1,4 +1,5 @@ /* eslint-disable @stylistic/no-mixed-operators */ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable @typescript-eslint/prefer-for-of */ /* eslint-disable @typescript-eslint/no-this-alias */ /* eslint-disable default-case */ @@ -458,7 +459,7 @@ function adjustBubbleSeriesDimensions() { }); } -export function SeriesFamily(options) { +export let SeriesFamily = function (options) { /// #DEBUG debug.assert(options.type, 'type was not passed or empty'); /// #ENDDEBUG @@ -519,7 +520,7 @@ export function SeriesFamily(options) { that.adjustSeriesDimensions = adjustBubbleSeriesDimensions; break; } -} +}; SeriesFamily.prototype = { constructor: SeriesFamily, @@ -543,3 +544,9 @@ SeriesFamily.prototype = { this.series = _map(series, (singleSeries) => (singleSeries.type === type ? singleSeries : null)); }, }; + +/// #DEBUG +export function DEBUG_set_SeriesFamily(value: typeof SeriesFamily): void { + SeriesFamily = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/palette.ts b/packages/devextreme/js/__internal/viz/palette.ts index 6f857efb3b05..44d40f73ae12 100644 --- a/packages/devextreme/js/__internal/viz/palette.ts +++ b/packages/devextreme/js/__internal/viz/palette.ts @@ -1,4 +1,5 @@ /* eslint-disable @stylistic/no-mixed-operators */ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable max-depth */ /* eslint-disable no-continue */ /* eslint-disable @typescript-eslint/init-declarations */ @@ -194,10 +195,10 @@ export function registerPalette(name, palette) { } } -export function getAccentColor(palette, themeDefault) { +export let getAccentColor = function (palette, themeDefault) { palette = getPalette(palette, { themeDefault }); return palette.accentColor || palette[0]; -} +}; function RingBuf(buf) { let ind = 0; @@ -430,7 +431,7 @@ function getColorMixer(palette, parameters) { }; } -export function createPalette(palette, parameters, themeDefaultPalette?) { +export let createPalette = function (palette, parameters, themeDefaultPalette?) { const paletteObj = { dispose() { this._extensionStrategy = null; @@ -469,7 +470,7 @@ export function createPalette(palette, parameters, themeDefaultPalette?) { paletteObj.reset(); return paletteObj; -} +}; function getAlteredPalette(originalPalette, step) { const palette = []; @@ -495,7 +496,7 @@ function getLightness(color) { return color.r * 0.3 + color.g * 0.59 + color.b * 0.11; } -export function getDiscretePalette(source, size, themeDefaultPalette) { +export let getDiscretePalette = function (source, size, themeDefaultPalette) { const palette = size > 0 ? createDiscreteColors(getPalette(source, { type: 'gradientSet', themeDefault: themeDefaultPalette }), size) : []; return { @@ -503,7 +504,7 @@ export function getDiscretePalette(source, size, themeDefaultPalette) { return palette[index] || null; }, }; -} +}; function createDiscreteColors(source, count) { const colorCount = count - 1; @@ -550,3 +551,15 @@ export function getGradientPalette(source, themeDefaultPalette) { /// #DEBUG export const _DEBUG_palettes = palettes; /// #ENDDEBUG + +/// #DEBUG +export function DEBUG_set_getAccentColor(value: typeof getAccentColor): void { + getAccentColor = value; +} +export function DEBUG_set_createPalette(value: typeof createPalette): void { + createPalette = value; +} +export function DEBUG_set_getDiscretePalette(value: typeof getDiscretePalette): void { + getDiscretePalette = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/series/base_series.ts b/packages/devextreme/js/__internal/viz/series/base_series.ts index 3c7a86040693..b9a653445aeb 100644 --- a/packages/devextreme/js/__internal/viz/series/base_series.ts +++ b/packages/devextreme/js/__internal/viz/series/base_series.ts @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable max-depth */ /* eslint-disable @typescript-eslint/no-dynamic-delete */ /* eslint-disable no-bitwise */ @@ -179,7 +181,7 @@ function mergePointOptions(base, extra) { return options; } -export function Series(settings, options) { +export let Series = function (settings, options) { const that = this; that.fullState = 0; that._extGroups = settings; @@ -191,7 +193,7 @@ export function Series(settings, options) { that._legendCallback = _noop; that.updateOptions(options, settings); -} +}; function getData(pointData) { return pointData.data; @@ -1382,3 +1384,9 @@ Series.prototype = { }; // @ts-expect-error export const mixins = seriesNS.mixins; + +/// #DEBUG +export function DEBUG_set_Series(value: typeof Series): void { + Series = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/series/points/base_point.ts b/packages/devextreme/js/__internal/viz/series/points/base_point.ts index ccb51c7e0c34..aaa307a55172 100644 --- a/packages/devextreme/js/__internal/viz/series/points/base_point.ts +++ b/packages/devextreme/js/__internal/viz/series/points/base_point.ts @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/no-dynamic-delete */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable func-names */ /* eslint-disable no-bitwise */ /* eslint-disable @typescript-eslint/no-this-alias */ /* eslint-disable no-restricted-syntax */ @@ -89,7 +91,7 @@ function isNoneMode(mode) { return _normalizeEnum(mode) === 'none'; } -export function Point(series, dataItem, options) { +export let Point = function (series, dataItem, options) { this.fullState = NORMAL_STATE; this.series = series; this.update(dataItem, options); @@ -104,7 +106,7 @@ export function Point(series, dataItem, options) { dashStyle: null, filter: null, }; -} +}; // @ts-expect-error mixins.symbolPoint = symbolPoint; // @ts-expect-error @@ -547,3 +549,9 @@ Point.prototype = { }; }, }; + +/// #DEBUG +export function DEBUG_set_Point(value: typeof Point): void { + Point = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/series/points/label.ts b/packages/devextreme/js/__internal/viz/series/points/label.ts index 1792537c2d71..fb46b47e019d 100644 --- a/packages/devextreme/js/__internal/viz/series/points/label.ts +++ b/packages/devextreme/js/__internal/viz/series/points/label.ts @@ -1,4 +1,6 @@ /* eslint-disable @stylistic/no-mixed-operators */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable func-names */ /* eslint-disable @typescript-eslint/no-this-alias */ /* eslint-disable @typescript-eslint/init-declarations */ /* eslint-disable @typescript-eslint/naming-convention */ @@ -290,13 +292,13 @@ function formatText(data, options) { return options.customizeText ? options.customizeText.call(data, data) : options.displayFormat ? processDisplayFormat(options.displayFormat, data) : data.valueText; } -export function Label(renderSettings) { +export let Label = function (renderSettings) { this._renderer = renderSettings.renderer; this._container = renderSettings.labelsGroup; this._point = renderSettings.point; this._strategy = renderSettings.strategy; this._rowCount = 1; -} +}; Label.prototype = { constructor: Label, @@ -551,5 +553,12 @@ Label.prototype = { }; /// #DEBUG -Label._DEBUG_formatText = formatText; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(Label as any)._DEBUG_formatText = formatText; +/// #ENDDEBUG + +/// #DEBUG +export function DEBUG_set_Label(value: typeof Label): void { + Label = value; +} /// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/translators/range.ts b/packages/devextreme/js/__internal/viz/translators/range.ts index be556c949927..29dda4bd015b 100644 --- a/packages/devextreme/js/__internal/viz/translators/range.ts +++ b/packages/devextreme/js/__internal/viz/translators/range.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-this-alias */ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable func-names */ /* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable no-param-reassign */ @@ -43,7 +44,7 @@ function compareAndReplace(thisValue, otherValue, setValue, compare) { } } -export const Range = function (range?) { +export let Range = function (range?) { range && extend(this, range); }; @@ -156,3 +157,9 @@ _Range.prototype = { } }, }; + +/// #DEBUG +export function DEBUG_set_Range(value: typeof Range): void { + Range = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/translators/translator1d.ts b/packages/devextreme/js/__internal/viz/translators/translator1d.ts index f0caa9bd9a9e..4ab07f343616 100644 --- a/packages/devextreme/js/__internal/viz/translators/translator1d.ts +++ b/packages/devextreme/js/__internal/viz/translators/translator1d.ts @@ -1,4 +1,6 @@ /* eslint-disable prefer-rest-params */ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable func-names */ /* eslint-disable @typescript-eslint/no-this-alias */ /* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable @typescript-eslint/no-unused-expressions */ @@ -9,9 +11,9 @@ const _Number = Number; -export function Translator1D() { +export let Translator1D = function () { this.setDomain(arguments[0], arguments[1]).setCodomain(arguments[2], arguments[3]).setInverted(false); -} +}; Translator1D.prototype = { constructor: Translator1D, @@ -87,3 +89,9 @@ Translator1D.prototype = { return result; }, }; + +/// #DEBUG +export function DEBUG_set_Translator1D(value: typeof Translator1D): void { + Translator1D = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/vector_map/map_layer.ts b/packages/devextreme/js/__internal/viz/vector_map/map_layer.ts index fadc174a8208..631032b1a0b1 100644 --- a/packages/devextreme/js/__internal/viz/vector_map/map_layer.ts +++ b/packages/devextreme/js/__internal/viz/vector_map/map_layer.ts @@ -1,4 +1,5 @@ /* eslint-disable spellcheck/spell-checker */ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable new-cap */ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @stylistic/no-mixed-operators */ @@ -1596,7 +1597,7 @@ function projectLineLabel(coordinates) { return resultData || [[], []]; } -export function MapLayerCollection(params) { +export let MapLayerCollection = function (params) { const that = this; const renderer = params.renderer; that._params = params; @@ -1609,7 +1610,7 @@ export function MapLayerCollection(params) { that._container = renderer.g().attr({ class: 'dxm-layers', 'clip-path': that._clip.id }).append(renderer.root).enableLinks(); that._subscribeToTracker(params.tracker, renderer, params.eventTrigger); that._dataReady = params.dataReady; -} +}; MapLayerCollection.prototype = { constructor: MapLayerCollection, @@ -1745,3 +1746,9 @@ export const _TESTS_stub_groupBySize = function (stub) { export const _TESTS_groupBySize = groupBySize; export const _TESTS_findGroupingIndex = findGroupingIndex; /// #ENDDEBUG + +/// #DEBUG +export function DEBUG_set_MapLayerCollection(value: typeof MapLayerCollection): void { + MapLayerCollection = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/vector_map/tracker.ts b/packages/devextreme/js/__internal/viz/vector_map/tracker.ts index 55be5e250222..afbf4e5e91ad 100644 --- a/packages/devextreme/js/__internal/viz/vector_map/tracker.ts +++ b/packages/devextreme/js/__internal/viz/vector_map/tracker.ts @@ -57,7 +57,7 @@ let Focus; setupEvents(); -export function Tracker(parameters) { +export let Tracker = function (parameters) { const that = this; that._root = parameters.root; that._createEventHandlers(parameters.dataKey); @@ -67,7 +67,7 @@ export function Tracker(parameters) { that._fire(name, arg); }); that._attachHandlers(); -} +}; Tracker.prototype = { constructor: Tracker, @@ -580,3 +580,9 @@ function adjustWheelDelta(delta, lock) { } return sign * _delta; } + +/// #DEBUG +export function DEBUG_set_Tracker(value: typeof Tracker): void { + Tracker = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/testing/helpers/chartMocks.js b/packages/devextreme/testing/helpers/chartMocks.js index f7acef832d79..6d5945d1c21c 100644 --- a/packages/devextreme/testing/helpers/chartMocks.js +++ b/packages/devextreme/testing/helpers/chartMocks.js @@ -16,7 +16,6 @@ import { } from './vizMocks.js'; import { Range } from 'viz/translators/range'; -const mutableSeriesFamilyModule = seriesFamilyModule.default ?? seriesFamilyModule; const LoadingIndicatorOrig = loadingIndicatorModule.LoadingIndicator; @@ -283,16 +282,28 @@ function createAxis(translatorData, orthogonalTranslatorData, allOptions, isHori return axis; } +// Modules that dropped their generated facade expose a DEBUG_set_* seam; the +// rest are still plain mutable objects. +function setItem(itemKey, moduleName, value) { + const setter = moduleName['DEBUG_set_' + itemKey]; + + if(typeof setter === 'function') { + setter(value); + } else { + moduleName[itemKey] = value; + } +} + function mockItem(itemKey, moduleName, mock) { if(sourceItemsToMocking[itemKey]) { throw 'Item ' + itemKey + ' already mocked'; } sourceItemsToMocking[itemKey] = moduleName[itemKey]; - moduleName[itemKey] = mock; + setItem(itemKey, moduleName, mock); } function restoreItem(itemKey, moduleName) { - moduleName[itemKey] = sourceItemsToMocking[itemKey]; + setItem(itemKey, moduleName, sourceItemsToMocking[itemKey]); sourceItemsToMocking[itemKey] = null; } @@ -396,9 +407,9 @@ export const resetMockFactory = function resetMockFactory() { }; export const setupSeriesFamily = function() { - mutableSeriesFamilyModule.SeriesFamily = function(options) { + seriesFamilyModule.DEBUG_set_SeriesFamily(function(options) { return new MockSeriesFamily(options); - }; + }); }; // Translator diff --git a/packages/devextreme/testing/helpers/vizMocks.js b/packages/devextreme/testing/helpers/vizMocks.js index 4f826dea1c89..8709818a1e81 100644 --- a/packages/devextreme/testing/helpers/vizMocks.js +++ b/packages/devextreme/testing/helpers/vizMocks.js @@ -1,14 +1,14 @@ /* global currentAssert, currentTest, sinon */ import $ from 'jquery'; -import * as tooltipModule from 'viz/core/tooltip'; +import tooltipModule from 'viz/core/tooltip'; import titleModule from 'viz/core/title'; import legendModule from 'viz/components/legend'; import axisModule from 'viz/axes/base_axis'; -import * as pointModule from 'viz/series/points/base_point'; +import pointModule from 'viz/series/points/base_point'; import { Series } from 'viz/series/base_series'; -import * as loadingIndicatorModule from 'viz/core/loading_indicator'; -import * as exportMenuModule from 'viz/core/export'; +import loadingIndicatorModule from 'viz/core/loading_indicator'; +import exportMenuModule from 'viz/core/export'; import rendererModule from 'viz/core/renderers/renderer_default'; import errors from 'viz/core/errors_warnings'; import * as baseWidgetUtils from '__internal/viz/core/base_widget.utils'; diff --git a/packages/devextreme/testing/runner/lib/importMap.ts b/packages/devextreme/testing/runner/lib/importMap.ts index 7550bb05ac0e..346e626117d9 100644 --- a/packages/devextreme/testing/runner/lib/importMap.ts +++ b/packages/devextreme/testing/runner/lib/importMap.ts @@ -353,32 +353,6 @@ export function buildQunitImportMap({ // Auto-mutable modules are provided by buildMutableModuleImportMapEntries above. // Hand-written only where composition is custom (themes). - 'viz/core/base_theme_manager': `${ESM_ROOT}/viz/core/base_theme_manager.js`, - 'viz/chart_components/layout_manager': `${ESM_ROOT}/viz/chart_components/layout_manager.js`, - 'viz/chart_components/scroll_bar': `${ESM_ROOT}/viz/chart_components/scroll_bar.js`, - 'viz/components/chart_theme_manager': `${ESM_ROOT}/viz/components/chart_theme_manager.js`, - 'viz/components/data_validator': `${ESM_ROOT}/viz/components/data_validator.js`, - 'viz/series/points/base_point': `${ESM_ROOT}/viz/series/points/base_point.js`, - 'viz/series/base_series': `${ESM_ROOT}/viz/series/base_series.js`, - 'viz/core/series_family': `${ESM_ROOT}/viz/core/series_family.js`, - 'viz/series/points/label': `${ESM_ROOT}/viz/series/points/label.js`, - 'viz/translators/range': `${ESM_ROOT}/viz/translators/range.js`, - 'viz/translators/translator1d': `${ESM_ROOT}/viz/translators/translator1d.js`, - 'viz/vector_map/tracker': `${ESM_ROOT}/viz/vector_map/tracker.js`, - 'viz/vector_map/map_layer': `${ESM_ROOT}/viz/vector_map/map_layer.js`, - '__internal/viz/core/base_theme_manager': `${ESM_ROOT}/__internal/viz/core/base_theme_manager.js`, - '__internal/viz/chart_components/layout_manager': `${ESM_ROOT}/__internal/viz/chart_components/layout_manager.js`, - '__internal/viz/chart_components/scroll_bar': `${ESM_ROOT}/__internal/viz/chart_components/scroll_bar.js`, - '__internal/viz/components/chart_theme_manager': `${ESM_ROOT}/__internal/viz/components/chart_theme_manager.js`, - '__internal/viz/components/data_validator': `${ESM_ROOT}/__internal/viz/components/data_validator.js`, - '__internal/viz/series/points/base_point': `${ESM_ROOT}/__internal/viz/series/points/base_point.js`, - '__internal/viz/series/base_series': `${ESM_ROOT}/__internal/viz/series/base_series.js`, - '__internal/viz/core/series_family': `${ESM_ROOT}/__internal/viz/core/series_family.js`, - '__internal/viz/series/points/label': `${ESM_ROOT}/__internal/viz/series/points/label.js`, - '__internal/viz/translators/range': `${ESM_ROOT}/__internal/viz/translators/range.js`, - '__internal/viz/translators/translator1d': `${ESM_ROOT}/__internal/viz/translators/translator1d.js`, - '__internal/viz/vector_map/tracker': `${ESM_ROOT}/__internal/viz/vector_map/tracker.js`, - '__internal/viz/vector_map/map_layer': `${ESM_ROOT}/__internal/viz/vector_map/map_layer.js`, 'ui/themes': `${SHIMS}/themes.js`, '__internal/ui/themes': `${SHIMS}/themes.js`, diff --git a/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts b/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts index 5115f2dba0d4..f7fd0194c89c 100644 --- a/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts +++ b/packages/devextreme/testing/runner/lib/mutableModuleGroups.ts @@ -23,52 +23,14 @@ export const MUTABLE_MODULE_GROUPS: readonly MutableModuleGroup[] = [ also: ['viz/core/renderers/renderer_default.js'], extraKeys: ['viz/core/renderers/renderer'], }, - { - internal: '__internal/viz/core/renderers/animation.js', - also: ['viz/core/renderers/animation.js'], - }, { internal: '__internal/viz/core/utils.js', also: ['viz/core/utils.js', 'viz/core/utils_default.js'], }, - { - internal: '__internal/viz/axes/base_axis.js', - extraKeys: ['viz/axes/base_axis'], - }, { internal: '__internal/viz/translators/translator2d.js', extraKeys: ['viz/translators/translator2d'], }, - { - internal: '__internal/viz/axes/tick_generator.js', - extraKeys: ['viz/axes/tick_generator'], - }, - { - internal: '__internal/viz/core/tooltip.js', - also: ['viz/core/tooltip.js'], - }, - { - internal: '__internal/viz/core/export.js', - also: [ - '__internal/viz/core/exportModule.js', - 'viz/core/export.js', - ], - }, - { - internal: '__internal/viz/components/legend.js', - also: ['viz/components/legend.js'], - }, - { - internal: '__internal/viz/core/loading_indicator.js', - also: ['viz/core/loading_indicator.js'], - }, - { - // Real named exports live in palette.js; paletteModule.js is only - // `import * as PaletteModule from './palette'; export default PaletteModule`. - internal: '__internal/viz/palette.js', - also: ['__internal/viz/paletteModule.js'], - extraKeys: ['viz/palette'], - }, { internal: '__internal/common/core/animation/frame.js', also: [ diff --git a/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts b/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts index c614590e39b8..279db5d4f659 100644 --- a/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts +++ b/packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts @@ -1,27 +1,6 @@ export const NAMESPACE_FACADE_MODULES: readonly string[] = [ '__internal/common/core/animation/frameModule.js', - '__internal/viz/core/exportModule.js', - '__internal/viz/paletteModule.js', - 'viz/axes/base_axis.js', - 'viz/axes/tick_generator.js', - 'viz/chart_components/layout_manager.js', - 'viz/chart_components/scroll_bar.js', - 'viz/components/chart_theme_manager.js', - 'viz/components/data_validator.js', - 'viz/components/legend.js', - 'viz/core/base_theme_manager.js', - 'viz/core/loading_indicator.js', - 'viz/core/renderers/animation.js', 'viz/core/renderers/renderer_default.js', - 'viz/core/series_family.js', - 'viz/core/tooltip.js', 'viz/core/utils_default.js', - 'viz/series/base_series.js', - 'viz/series/points/base_point.js', - 'viz/series/points/label.js', - 'viz/translators/range.js', - 'viz/translators/translator1d.js', 'viz/translators/translator2d.js', - 'viz/vector_map/map_layer.js', - 'viz/vector_map/tracker.js', ]; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.integration.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.integration.tests.js index ee10eb4db407..c7a8963e952c 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.integration.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.integration.tests.js @@ -13,8 +13,7 @@ import { setupSeriesFamily } from '../../helpers/chartMocks.js'; import pointerMock from '../../helpers/pointerMock.js'; const mutableRendererModule = rendererModule.default ?? rendererModule; -const mutableSeriesFamilyModule = seriesFamilyModule.default ?? seriesFamilyModule; -const seriesFamilyNativeConstructor = mutableSeriesFamilyModule.SeriesFamily; +const seriesFamilyNativeConstructor = seriesFamilyModule.SeriesFamily; setupSeriesFamily(); QUnit.testStart(function() { const markup = @@ -2327,7 +2326,7 @@ QUnit.test('check horizontal alignment === center', function(assert) { QUnit.module('Auto hide point markers', $.extend({}, moduleSetup, { beforeEach: function() { moduleSetup.beforeEach.call(this); - mutableSeriesFamilyModule.SeriesFamily = seriesFamilyNativeConstructor; + seriesFamilyModule.DEBUG_set_SeriesFamily(seriesFamilyNativeConstructor); const dataSource = []; for(let i = 0; i < 500000; i += 250) { const y1 = Math.sin(i); @@ -4903,7 +4902,7 @@ QUnit.test('Reset axes animation before adjusting position of vertical axes (fix QUnit.module('SeriesFamily', $.extend({}, moduleSetup, { beforeEach: function() { moduleSetup.beforeEach.call(this); - mutableSeriesFamilyModule.SeriesFamily = seriesFamilyNativeConstructor; + seriesFamilyModule.DEBUG_set_SeriesFamily(seriesFamilyNativeConstructor); } })); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.part7.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.part7.tests.js index 510f626adffa..201cdb11f90e 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.part7.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.part7.tests.js @@ -15,6 +15,7 @@ import seriesModule from 'viz/series/base_series'; import dataValidatorModule from 'viz/components/data_validator'; import { MockSeries, categories, seriesMockData, MockTranslator } from '../../helpers/chartMocks.js'; import graphicObjects from '__internal/common/m_charts'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const dxErrors = errorsWarnings.ERROR_MESSAGES; @@ -71,7 +72,7 @@ $('
').appendTo('#qunit-fixture'); const stubSeries = new MockSeries({}); seriesMockData.series.push(stubSeries); - seriesModule.Series = function() { return { isUpdated: false }; }; + seriesModule.DEBUG_set_Series(function() { return { isUpdated: false }; }); const chart = this.createChart({ series: { @@ -86,7 +87,7 @@ $('
').appendTo('#qunit-fixture'); QUnit.test('dxChart with single series, series type is unknown in option series', function(assert) { const stubSeries = new MockSeries({}); seriesMockData.series.push(stubSeries); - seriesModule.Series = function() { return { isUpdated: false }; }; + seriesModule.DEBUG_set_Series(function() { return { isUpdated: false }; }); const chart = this.createChart({ series: { @@ -710,7 +711,7 @@ $('
').appendTo('#qunit-fixture'); environment.afterEach.call(this); }, mockValidateData: function() { - this.validateData = sinon.stub(dataValidatorModule, 'validateData').callsFake(function(data) { + this.validateData = stubSeam(dataValidatorModule, 'validateData', 'DEBUG_set_validateData').callsFake(function(data) { return { x: data || [] }; }); }, @@ -983,7 +984,7 @@ $('
').appendTo('#qunit-fixture'); const stubSeries = new MockSeries({}); seriesMockData.series.push(stubSeries); - seriesModule.Series = function() { return { isUpdated: false }; }; + seriesModule.DEBUG_set_Series(function() { return { isUpdated: false }; }); const chart = this.createChart({ series: { @@ -1005,7 +1006,7 @@ $('
').appendTo('#qunit-fixture'); const stubSeries = new MockSeries({}); seriesMockData.series.push(stubSeries); - seriesModule.Series = function() { return { isUpdated: false }; }; + seriesModule.DEBUG_set_Series(function() { return { isUpdated: false }; }); const chart = this.createChart({ series: { @@ -1027,7 +1028,7 @@ $('
').appendTo('#qunit-fixture'); const stubSeries = new MockSeries({}); seriesMockData.series.push(stubSeries); - seriesModule.Series = function() { return { isUpdated: false }; }; + seriesModule.DEBUG_set_Series(function() { return { isUpdated: false }; }); const chart = createChartInstance({ series: { diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.tests.js index 3924a46d5d51..b4cb60bd99d5 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/chart.tests.js @@ -64,12 +64,12 @@ const environment = { return chart; }, _stubLayoutManager: function() { - this.LayoutManager = sinon.stub(layoutManagerModule, 'LayoutManager').callsFake(function() { + this.LayoutManager = stubSeam(layoutManagerModule, 'LayoutManager', 'DEBUG_set_LayoutManager').callsFake(function() { return new LayoutManager(arguments); }); }, _stubLegend: function() { - this.Legend = sinon.stub(legendModule, 'Legend').callsFake(function() { + this.Legend = stubSeam(legendModule, 'Legend', '_setLegend').callsFake(function() { const legend = new Legend(); legend.getTemplatesGroups = sinon.spy(function() { return []; @@ -86,7 +86,7 @@ const environment = { }); }, _stubAxis: function() { - this.Axis = sinon.stub(axisModule, 'Axis').callsFake(function() { + this.Axis = stubSeam(axisModule, 'Axis', 'DEBUG_set_Axis').callsFake(function() { const axis = new Axis(); axis.updateOptions = sinon.spy(function(options) { axis.name = options.name; @@ -106,24 +106,24 @@ const environment = { }); }, _stubRange: function() { - sinon.stub(rangeModule, 'Range').callsFake(function(opt) { + stubSeam(rangeModule, 'Range', 'DEBUG_set_Range').callsFake(function(opt) { const range = new Range(); $.extend(range, opt); return range; }); }, _stubSeriesAndPoint: function() { - sinon.stub(seriesModule, 'Series').callsFake(function() { + stubSeam(seriesModule, 'Series', 'DEBUG_set_Series').callsFake(function() { const series = new Series(); return series; }); - sinon.stub(pointModule, 'Point').callsFake(function() { + stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function() { return new Point(); }); }, _stubValidateData: function() { - this.validateData = sinon.stub(dataValidatorModule, 'validateData'); + this.validateData = stubSeam(dataValidatorModule, 'validateData', 'DEBUG_set_validateData'); }, _restoreValidateData: function() { this.validateData.restore(); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/chartAxisDrawing.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/chartAxisDrawing.tests.js index bd3a9991fa33..9fe674f96aa0 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/chartAxisDrawing.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/chartAxisDrawing.tests.js @@ -14,6 +14,7 @@ import titleModule from 'viz/core/title'; import rendererModule from 'viz/core/renderers/renderer_default'; import multiAxesSynchronizer from '__internal/viz/chart_components/multi_axes_synchronizer'; import { Deferred } from 'core/utils/deferred'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const TitleOrig = titleModule.Title; @@ -33,7 +34,7 @@ const environment = { getMargins: sinon.stub() }; - this.scrollBarStub = sinon.stub(scrollBarModule, 'ScrollBar').callsFake(function(renderer, group) { + this.scrollBarStub = stubSeam(scrollBarModule, 'ScrollBar', 'DEBUG_set_ScrollBar').callsFake(function(renderer, group) { const scrollBar = new originalScrollBar(renderer, group); const originalUpdateSize = scrollBar.updateSize; @@ -49,7 +50,7 @@ const environment = { let axisIndex = 0; const originalAxis = axisModule.Axis; - this.axisStub = sinon.stub(axisModule, 'Axis').callsFake(function(renderingSettings) { + this.axisStub = stubSeam(axisModule, 'Axis', 'DEBUG_set_Axis').callsFake(function(renderingSettings) { const axis = new originalAxis(renderingSettings); for(const stubName in axesStubs[axisIndex]) { @@ -62,7 +63,7 @@ const environment = { this.title = new Title(); this.legend = new Legend(); - this.legendStub = sinon.stub(legendModule, 'Legend').callsFake(() =>{ + this.legendStub = stubSeam(legendModule, 'Legend', '_setLegend').callsFake(() =>{ this.legend.getTemplatesGroups = sinon.spy(function() { return []; }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/chartParts/commons.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/chartParts/commons.js index 24838cbd21b1..0ec9162abe8c 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/chartParts/commons.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/chartParts/commons.js @@ -90,7 +90,7 @@ titleModule.DEBUG_set_title(sinon.spy(function(parameters) { return title; })); -sinon.stub(legendModule, 'Legend').callsFake((parameters) => { +stubSeam(legendModule, 'Legend', '_setLegend').callsFake((parameters) => { const legend = new Legend(parameters); legend.getActionCallback = sinon.spy(function(arg) { return arg; @@ -197,11 +197,11 @@ const environment = { that.layoutManager.layoutElements = sinon.spy(function() { arguments[2](); }); - this.StubLayoutManager = sinon.stub(layoutManagerModule, 'LayoutManager').callsFake(function() { + this.StubLayoutManager = stubSeam(layoutManagerModule, 'LayoutManager', 'DEBUG_set_LayoutManager').callsFake(function() { return that.layoutManager; }); - sinon.stub(scrollBarClassModule, 'ScrollBar').callsFake(function() { + stubSeam(scrollBarClassModule, 'ScrollBar', 'DEBUG_set_ScrollBar').callsFake(function() { const ScrollBar = stubClass(ScrollBarClass); const scrollBar = new ScrollBar(); scrollBar.stub('init').returns(scrollBar); @@ -228,11 +228,11 @@ const environment = { }, options.argumentAxis)); return createChartInstance(options, this.$container); }; - this.createThemeManager = sinon.stub(chartThemeManagerModule, 'ThemeManager').callsFake(function() { + this.createThemeManager = stubSeam(chartThemeManagerModule, 'ThemeManager', 'DEBUG_set_ThemeManager').callsFake(function() { return that.themeManager; }); const family = sinon.createStubInstance(seriesFamilyModule.SeriesFamily); - this.createSeriesFamily = sinon.stub(seriesFamilyModule, 'SeriesFamily').callsFake(function() { + this.createSeriesFamily = stubSeam(seriesFamilyModule, 'SeriesFamily', 'DEBUG_set_SeriesFamily').callsFake(function() { family.pane = 'default'; family.adjustSeriesDimensions = sinon.stub(); family.adjustSeriesValues = sinon.stub(); @@ -288,7 +288,7 @@ const environment = { tooltipModule.DEBUG_set_tooltip(null); }, mockValidateData: function() { - this.validateData = sinon.stub(dataValidatorModule, 'validateData').callsFake(function(data, groupsData) { + this.validateData = stubSeam(dataValidatorModule, 'validateData', 'DEBUG_set_validateData').callsFake(function(data, groupsData) { const categories = []; if(data) { data.forEach(function(item) { diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/chartSync.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/chartSync.tests.js index 86fedbc86f2b..4269e97f7eff 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/chartSync.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/chartSync.tests.js @@ -19,6 +19,7 @@ import { CustomStore } from 'common/data/custom_store'; import chartThemeManagerModule from 'viz/components/chart_theme_manager'; import scrollBarModule from 'viz/chart_components/scroll_bar'; import dxChart from 'viz/chart'; +import { stubSeam } from '../../helpers/moduleSeam.js'; import { MockSeries, MockPoint, @@ -63,7 +64,7 @@ exportModule.DEBUG_set_ExportMenu(sinon.spy(function() { return new ExportMenu(); })); -legendModule.Legend = sinon.spy(function(parameters) { +legendModule._setLegend(sinon.spy(function(parameters) { const legend = new Legend(parameters); legend.update = sinon.spy(function(params, settings) { legend.getPosition = sinon.stub().returns(settings.position); @@ -82,7 +83,7 @@ legendModule.Legend = sinon.spy(function(parameters) { return []; }); return legend; -}); +})); function getLegendStub() { return legendModule.Legend.lastCall.returnValue; @@ -145,7 +146,7 @@ const environment = { return createChartInstance(options, this.$container); }; - this.createThemeManager = sinon.stub(chartThemeManagerModule, 'ThemeManager').callsFake(function() { + this.createThemeManager = stubSeam(chartThemeManagerModule, 'ThemeManager', 'DEBUG_set_ThemeManager').callsFake(function() { return that.themeManager; }); this.layoutManager = new LayoutManager(); @@ -153,7 +154,7 @@ const environment = { arguments[2] && arguments[2](); }); - sinon.stub(layoutManagerModule, 'LayoutManager').callsFake(function() { + stubSeam(layoutManagerModule, 'LayoutManager', 'DEBUG_set_LayoutManager').callsFake(function() { const layoutManager = new LayoutManager(); layoutManager .stub('needMoreSpaceForPanesCanvas') @@ -166,7 +167,7 @@ const environment = { return layoutManager; }); - sinon.stub(tooltipModule, 'Tooltip').callsFake(function(parameters) { + stubSeam(tooltipModule, 'Tooltip', 'DEBUG_set_tooltip').callsFake(function(parameters) { return new StubTooltip(parameters); }); @@ -176,7 +177,7 @@ const environment = { }); }); - validateData = sinon.stub(dataValidatorModule, 'validateData').callsFake(function(data) { + validateData = stubSeam(dataValidatorModule, 'validateData', 'DEBUG_set_validateData').callsFake(function(data) { return { arg: data || [] }; }); }, @@ -674,7 +675,7 @@ const environment = { }); QUnit.test('draw chart when scrollBar is visible', function(assert) { - sinon.stub(scrollBarModule, 'ScrollBar').callsFake(function() { + stubSeam(scrollBarModule, 'ScrollBar', 'DEBUG_set_ScrollBar').callsFake(function() { const stub = sinon.createStubInstance(ScrollBar); stub.init.returns(stub); stub.update.returns(stub); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/charts.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/charts.tests.js index 874346da6d7e..30a315d92ee8 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/charts.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/charts.tests.js @@ -2,9 +2,9 @@ import testGlobalExports from '../../helpers/publicModulesHelper.js'; import * as AdvancedChartModule from '__internal/viz/chart_components/m_advanced_chart'; import * as baseChartModule from '__internal/viz/chart_components/m_base_chart'; import CrosshairModule from 'viz/chart_components/crosshair'; -import * as LayoutManagerModule from 'viz/chart_components/layout_manager'; +import LayoutManagerModule from 'viz/chart_components/layout_manager'; import multiAxesSynchronizer from '__internal/viz/chart_components/multi_axes_synchronizer'; -import * as ScrollBarModule from 'viz/chart_components/scroll_bar'; +import ScrollBarModule from 'viz/chart_components/scroll_bar'; import trackerModule from 'viz/chart_components/tracker'; import 'viz/chart'; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/equalPieSize.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/equalPieSize.tests.js index 68bbc7ed15e0..c4cf13b41b4c 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/equalPieSize.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/equalPieSize.tests.js @@ -6,6 +6,7 @@ import layoutManagerModule from 'viz/chart_components/layout_manager'; import dxPieChart from 'viz/pie_chart'; import { MockSeries, MockPoint, insertMockFactory, restoreMockFactory, resetMockFactory, seriesMockData } from '../../helpers/chartMocks.js'; import { rendererModule, resetModules } from './chartParts/commons.js'; +import { stubSeam } from '../../helpers/moduleSeam.js'; function getContainer(hidden) { const div = $('
').appendTo('#qunit-fixture'); @@ -69,9 +70,9 @@ const environment = { setupMocks.call(this); this.originalLayoutManagerCtor = layoutManagerModule.LayoutManager; - this.LayoutManager = sinon.stub(layoutManagerModule, 'LayoutManager'); + this.LayoutManager = stubSeam(layoutManagerModule, 'LayoutManager', 'DEBUG_set_LayoutManager'); - this.validateData = sinon.stub(dataValidatorModule, 'validateData').callsFake(function(data) { + this.validateData = stubSeam(dataValidatorModule, 'validateData', 'DEBUG_set_validateData').callsFake(function(data) { return { arg: data || [] }; }); }, diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/pieChart.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/pieChart.tests.js index 83d327892827..3a0179fb1005 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/pieChart.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/pieChart.tests.js @@ -19,7 +19,7 @@ import { import exportModule from '__internal/viz/core/exportModule'; import seriesModule from 'viz/series/base_series'; import { BaseChart } from '__internal/viz/chart_components/m_base_chart'; -import * as labelModule from 'viz/series/points/label'; +import labelModule from 'viz/series/points/label'; import dataValidatorModule from 'viz/components/data_validator'; import translator1DModule from 'viz/translators/translator1d'; import { CustomStore } from 'common/data/custom_store'; @@ -35,6 +35,7 @@ import TemplateManagerModule from '__internal/core/m_template_manager'; import graphicObjects from '__internal/common/m_charts'; import eventsEngine from 'common/core/events/core/events_engine'; import devices from '__internal/core/m_devices'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const LabelCtor = new ObjectPool(labelModule.Label); @@ -168,14 +169,14 @@ const environment = { that.layoutManager.needMoreSpaceForPanesCanvas.returns(true); that.layoutManager.applyPieChartSeriesLayout.returns({ radiusInner: 0, radiusOuter: 300, centerX: 100, centerY: 200 }); - that.LayoutManager = sinon.stub(layoutManagerModule, 'LayoutManager').callsFake(function() { + that.LayoutManager = stubSeam(layoutManagerModule, 'LayoutManager', 'DEBUG_set_LayoutManager').callsFake(function() { return that.layoutManager; }); - this.createThemeManager = sinon.stub(chartThemeManagerModule, 'ThemeManager').callsFake(function() { + this.createThemeManager = stubSeam(chartThemeManagerModule, 'ThemeManager', 'DEBUG_set_ThemeManager').callsFake(function() { return that.themeManager; }); - this.validateData = sinon.stub(dataValidatorModule, 'validateData').callsFake(function(data) { + this.validateData = stubSeam(dataValidatorModule, 'validateData', 'DEBUG_set_validateData').callsFake(function(data) { return { arg: data || [] }; }); }, @@ -717,7 +718,7 @@ const overlappingEnvironment = $.extend({}, environment, { QUnit.test('dxChart with single series, series type is unknown', function(assert) { const stubSeries = new MockSeries({}); seriesMockData.series.push(stubSeries); - seriesModule.Series = function() { return { isUpdated: false }; }; + seriesModule.DEBUG_set_Series(function() { return { isUpdated: false }; }); const chart = this.createPieChart({ dataSource: dataSourceTemplate, @@ -832,7 +833,7 @@ const overlappingEnvironment = $.extend({}, environment, { environment.beforeEach.apply(this, arguments); const translatorClass = new stubClass(translator1DModule.Translator1D); - sinon.stub(translator1DModule, 'Translator1D').callsFake(function() { + stubSeam(translator1DModule, 'Translator1D', 'DEBUG_set_Translator1D').callsFake(function() { const translator = new translatorClass(); translator.stub('setDomain').returnsThis(); translator.stub('setCodomain').returnsThis(); @@ -891,7 +892,7 @@ const overlappingEnvironment = $.extend({}, environment, { const translatorClass = new stubClass(translator1DModule.Translator1D); - sinon.stub(translator1DModule, 'Translator1D').callsFake(function() { + stubSeam(translator1DModule, 'Translator1D', 'DEBUG_set_Translator1D').callsFake(function() { const translator = new translatorClass(); translator.stub('setDomain').returnsThis(); translator.stub('setCodomain').returnsThis(); @@ -1073,7 +1074,7 @@ const overlappingEnvironment = $.extend({}, environment, { this.mockSeries2 = new MockSeries({ argumentField: 'arg' }); const translatorClass = new stubClass(translator1DModule.Translator1D); - sinon.stub(translator1DModule, 'Translator1D').callsFake(function() { + stubSeam(translator1DModule, 'Translator1D', 'DEBUG_set_Translator1D').callsFake(function() { const translator = new translatorClass(); translator.stub('setDomain').returnsThis(); translator.stub('setCodomain').returnsThis(); @@ -2046,7 +2047,7 @@ const overlappingEnvironment = $.extend({}, environment, { const translatorClass = new stubClass(translator1DModule.Translator1D); - sinon.stub(translator1DModule, 'Translator1D').callsFake(function() { + stubSeam(translator1DModule, 'Translator1D', 'DEBUG_set_Translator1D').callsFake(function() { const translator = new translatorClass(); translator.stub('setDomain').returnsThis(); translator.stub('setCodomain').returnsThis(); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/polarChart.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/polarChart.tests.js index e947b5b328dc..7f7d2000061d 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/polarChart.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/polarChart.tests.js @@ -17,6 +17,7 @@ import layoutManagerModule from 'viz/chart_components/layout_manager'; import exportModule from '__internal/viz/core/exportModule'; import 'viz/chart'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const { Series } = seriesModule; @@ -32,7 +33,7 @@ QUnit.testStart(function() { chartContainer.appendTo('#qunit-fixture'); }); -legendModule.Legend = sinon.spy(function(parameters) { +legendModule._setLegend(sinon.spy(function(parameters) { const legend = new Legend(parameters); legend.getActionCallback = sinon.spy(function(arg) { return arg; @@ -44,7 +45,7 @@ legendModule.Legend = sinon.spy(function(parameters) { return []; }); return legend; -}); +})); function stubExport() { const exportMenuInstance = new ExportMenu(); @@ -152,7 +153,7 @@ const environment = { that.$container = $('#chartContainer'); - this.createThemeManager = sinon.stub(chartThemeManagerModule, 'ThemeManager').callsFake(function() { + this.createThemeManager = stubSeam(chartThemeManagerModule, 'ThemeManager', 'DEBUG_set_ThemeManager').callsFake(function() { resetStub(stubThemeManager); that.themeManager = stubThemeManager; return stubThemeManager; @@ -176,18 +177,18 @@ const environment = { return stubRenderer; }); - that.createTooltip = sinon.stub(tooltipModule, 'Tooltip').callsFake(function() { + that.createTooltip = stubSeam(tooltipModule, 'Tooltip', 'DEBUG_set_tooltip').callsFake(function() { resetStub(stubTooltip); return stubTooltip; }); - that.range = sinon.stub(rangeModule, 'Range').callsFake(function() { + that.range = stubSeam(rangeModule, 'Range', 'DEBUG_set_Range').callsFake(function() { resetStub(stubRange); stubRange.addRange = function() { this.min = 2; }; return stubRange; }); - that.createSeries = sinon.stub(seriesModule, 'Series').callsFake(function(settings, seriesTheme) { + that.createSeries = stubSeam(seriesModule, 'Series', 'DEBUG_set_Series').callsFake(function(settings, seriesTheme) { resetStub(stubSeries[seriesIndex]); stubSeries[seriesIndex].getValueAxis.returns(settings.valueAxis); if(seriesTheme.valueErrorBar) { @@ -196,7 +197,7 @@ const environment = { return $.extend(true, stubSeries[seriesIndex++], seriesTheme); }); - that.createAxis = sinon.stub(axisModule, 'Axis').callsFake(function() { + that.createAxis = stubSeam(axisModule, 'Axis', 'DEBUG_set_Axis').callsFake(function() { resetStub(stubAxes[axesIndex]); stubAxes[axesIndex].getMargins.returns({ @@ -209,12 +210,12 @@ const environment = { return stubAxes[axesIndex++]; }); - that.createSeriesFamily = sinon.stub(seriesFamilyModule, 'SeriesFamily').callsFake(function() { + that.createSeriesFamily = stubSeam(seriesFamilyModule, 'SeriesFamily', 'DEBUG_set_SeriesFamily').callsFake(function() { resetStub(stubSeriesFamily); return stubSeriesFamily; }); - that.createLayoutManager = sinon.stub(layoutManagerModule, 'LayoutManager').callsFake(function() { + that.createLayoutManager = stubSeam(layoutManagerModule, 'LayoutManager', 'DEBUG_set_LayoutManager').callsFake(function() { resetStub(stubLayoutManager); return stubLayoutManager; }); @@ -345,7 +346,7 @@ QUnit.test('create series with panes', function(assert) { }); QUnit.test('give series in groups to data validator', function(assert) { - const validateData = sinon.stub(dataValidatorModule, 'validateData').callsFake(function(data) { + const validateData = stubSeam(dataValidatorModule, 'validateData', 'DEBUG_set_validateData').callsFake(function(data) { return data || []; }); try { diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/areaSeries.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/areaSeries.tests.js index 7c44e7490fee..ed88d063d135 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/areaSeries.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/areaSeries.tests.js @@ -99,7 +99,7 @@ const environmentWithSinonStubPoint = { beforeEach: function() { environment.beforeEach.call(this); let mockPointIndex = 0; - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function(series, data) { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function(series, data) { const stub = mockPoints[mockPointIndex++]; stub.argument = 1; stub.angle = -data.argument; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/barPoint.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/barPoint.tests.js index 5298fb48ac87..0c9fc618952f 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/barPoint.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/barPoint.tests.js @@ -76,14 +76,15 @@ const environment = { }; this.label = sinon.createStubInstance(labelModule.Label); - this.labelFactory = labelModule.Label = sinon.spy(function() { + this.labelFactory = sinon.spy(function() { return that.label; }); + labelModule.DEBUG_set_Label(this.labelFactory); this.label.getLayoutOptions.returns(this.options.label); this.label.getBoundingRect.returns({ height: 10, width: 20 }); }, afterEach: function() { - labelModule.Label = originalLabel; + labelModule.DEBUG_set_Label(originalLabel); } }; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/barSeries.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/barSeries.tests.js index e2cf41d7b953..ddd054cee7a3 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/barSeries.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/barSeries.tests.js @@ -67,7 +67,7 @@ const environment = { this.renderer = new Renderer(); this.seriesGroup = this.renderer.g(); this.data = [{ arg: 1, val: 10 }, { arg: 2, val: 20 }, { arg: 3, val: 30 }, { arg: 4, val: 40 }]; - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function() { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function() { const stub = mockPoints[mockPointIndex++]; stub.argument = 1; stub.getMarkerCoords.returns({ x: 1, y: 2, width: 20, height: 10 }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/basePoint.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/basePoint.tests.js index 986b07c4157f..2f71dc8c307d 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/basePoint.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/basePoint.tests.js @@ -540,7 +540,7 @@ QUnit.module('Draw', { attributes: { r: 6 }, symbol: 'circle' }; - this.sinonFactory = sinon.stub(labelModule, 'Label').callsFake(function() { + this.sinonFactory = stubSeam(labelModule, 'Label', 'DEBUG_set_Label').callsFake(function() { return sinon.createStubInstance(originalLabel); }); this.series = { @@ -606,7 +606,7 @@ QUnit.module('Label', { this.renderer = new Renderer(); this.group = this.renderer.g(); - this.sinonFactory = sinon.stub(labelModule, 'Label').callsFake(function() { + this.sinonFactory = stubSeam(labelModule, 'Label', 'DEBUG_set_Label').callsFake(function() { return sinon.createStubInstance(originalLabel); }); this.labelsGroup = {}; @@ -1244,7 +1244,7 @@ QUnit.module('Dispose', { attributes: { r: 6 }, symbol: 'circle' }; - this.sinonFactory = sinon.stub(labelModule, 'Label').callsFake(function() { + this.sinonFactory = stubSeam(labelModule, 'Label', 'DEBUG_set_Label').callsFake(function() { return sinon.createStubInstance(originalLabel); }); this.series = { @@ -1355,7 +1355,7 @@ QUnit.module('API', { _argumentChecker: function() { return true; }, _valueChecker: function() { return true; } }; - sinon.spy(labelModule, 'Label'); + spySeam(labelModule, 'Label', 'DEBUG_set_Label'); }, afterEach: function() { labelModule.Label.restore(); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/baseSeries.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/baseSeries.tests.js index 65621c4d4211..90892b53c9ca 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/baseSeries.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/baseSeries.tests.js @@ -8,6 +8,7 @@ import typeUtils from 'core/utils/type'; import pointModule from 'viz/series/points/base_point'; import SeriesModule from 'viz/series/base_series'; import { insertMockFactory, MockTranslator, MockAxis, restoreMockFactory } from '../../helpers/chartMocks.js'; +import { stubSeam, spySeam } from '../../helpers/moduleSeam.js'; const Series = SeriesModule.Series; const mixins = SeriesModule.mixins; @@ -67,12 +68,12 @@ const environment = { this.renderer = new Renderer(); _this.realCreatePoint = pointModule.Point; - pointModule.Point = function() { + pointModule.DEBUG_set_Point(function() { _this.pointsCreatingCount++; const point = _this.realCreatePoint.apply(null, arguments); point.setInvisibility = sinon.stub(); return point; - }; + }); chartSeriesNS['mocktype'] = { stylesHistory: [], @@ -160,7 +161,7 @@ const environment = { mixins.pie['mocktype'] = mixins.chart['mocktype']; }, afterEach: function() { - pointModule.Point = this.realCreatePoint; + pointModule.DEBUG_set_Point(this.realCreatePoint); restoreMockFactory(); } }; @@ -178,7 +179,7 @@ const environmentWithSinonStubPoint = { beforeEach: function() { environment.beforeEach.call(this); let mockPointIndex = 0; - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function(series, data) { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function(series, data) { const stub = mockPoints[mockPointIndex++]; stub.series = series; stub.argument = data.argument || 1; @@ -794,7 +795,7 @@ QUnit.test('Pass errorBars options to point (on update). ErrorBars are visible', QUnit.module('tag to points', { beforeEach: function() { - this.spy = sinon.spy(pointModule, 'Point'); + this.spy = spySeam(pointModule, 'Point', 'DEBUG_set_Point'); this.data = [{ arg: 1, val: 1 }, { arg: 2, val: 2 }, { arg: 3, val: 3 }]; }, afterEach: function() { @@ -2183,7 +2184,7 @@ QUnit.test('Points count > maxLabelCount', function(assert) { QUnit.module('Series states - excludePointsMode', { beforeEach: function() { environment.beforeEach.call(this); - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function() { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function() { const stub = sinon.createStubInstance(originalPoint); stub.argument = 1; stub.hasValue.returns(true); @@ -2551,7 +2552,7 @@ QUnit.test('setHoverState after Selected State in includePointsMode', function(a QUnit.module('Series states - nearestPoint Mode', { beforeEach: function() { environment.beforeEach.call(this); - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function(_, data) { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function(_, data) { const stub = sinon.createStubInstance(originalPoint); stub.argument = 1; @@ -2910,7 +2911,7 @@ QUnit.test('reset nearest point on select', function(assert) { QUnit.module('Series states - includePointsMode', { beforeEach: function() { environment.beforeEach.call(this); - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function() { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function() { const stub = sinon.createStubInstance(originalPoint); stub.argument = 1; stub.hasValue.returns(true); @@ -3269,7 +3270,7 @@ QUnit.test('clear selection hovered', function(assert) { QUnit.module('Series states - none mode', { beforeEach: function() { environment.beforeEach.call(this); - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function() { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function() { const stub = sinon.createStubInstance(originalPoint); stub.argument = 1; stub.hasValue.returns(true); @@ -4877,7 +4878,7 @@ QUnit.module('Legend states', { beforeEach: function() { this.legendCallback = sinon.stub(); environment.beforeEach.call(this); - sinon.stub(pointModule, 'Point').callsFake(function(series) { + stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function(series) { const point = new Point(); point.argument = 1; point.series = series; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/bubblePoint.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/bubblePoint.tests.js index 85ff6594fec9..43f0abdb54b5 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/bubblePoint.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/bubblePoint.tests.js @@ -344,14 +344,15 @@ QUnit.module('Draw Label', { _valueChecker: function() { return true; } }; this.label = sinon.createStubInstance(labelModule.Label); - this.labelFactory = labelModule.Label = sinon.spy(function() { + this.labelFactory = sinon.spy(function() { return that.label; }); + labelModule.DEBUG_set_Label(this.labelFactory); this.label.getLayoutOptions.returns(this.options.label); this.label.getBoundingRect.returns({ height: 10, width: 20 }); }, afterEach: function() { - labelModule.Label = originalLabel; + labelModule.DEBUG_set_Label(originalLabel); } }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/bubbleSeries.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/bubbleSeries.tests.js index 7fee08d47f4d..7b09f8d3d74c 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/bubbleSeries.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/bubbleSeries.tests.js @@ -66,7 +66,7 @@ const environment = { this.seriesGroup = this.renderer.g(); this.data = [{ arg: 1, val: 10, size: 1 }, { arg: 2, val: 20, size: 1 }, { arg: 3, val: 30, size: 1 }, { arg: 4, val: 40, size: 1 }]; - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function() { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function() { const stub = mockPoints[mockPointIndex++]; stub.argument = 1; stub.hasValue.returns(true); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/financialPoint.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/financialPoint.tests.js index b4d7fac27d4a..4521c243b712 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/financialPoint.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/financialPoint.tests.js @@ -1761,7 +1761,7 @@ QUnit.module('Draw label', { failOnWrongData: true }) }; - this.sinonFactory = sinon.stub(labelModule, 'Label').callsFake(function() { + this.sinonFactory = stubSeam(labelModule, 'Label', 'DEBUG_set_Label').callsFake(function() { const label = sinon.createStubInstance(originalLabel); label.getLayoutOptions.returns(that.options.label); label.getBoundingRect.returns({ height: 10, width: 20 }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/financialSeries.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/financialSeries.tests.js index 8000b8eeaadc..b6863fac48f8 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/financialSeries.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/financialSeries.tests.js @@ -29,7 +29,7 @@ const environment = { this.data = [ { date: 'arg1', high: 'high1', low: 'low1', open: 'open1', close: 'close1' } ]; - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function() { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function() { const stub = mockPoints[mockPointIndex++]; stub.argument = 1; stub.hasValue.returns(true); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/lineSeries.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/lineSeries.tests.js index e1b096619b24..c6d6b0590f07 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/lineSeries.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/lineSeries.tests.js @@ -78,7 +78,7 @@ const environmentWithSinonStubPoint = { environment.beforeEach.call(this); let mockPointIndex = 0; - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function(series, data) { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function(series, data) { const stub = mockPoints[mockPointIndex++]; stub.argument = 1; stub.angle = -data.argument; @@ -1350,7 +1350,7 @@ function setDiscreteType(series) { this.options = { type: 'line' }; - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function() { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function() { const stub = sinon.createStubInstance(originalPoint); stub.argument = 1; stub.hasValue.returns(true); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/piePoint.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/piePoint.tests.js index 31b8f88887f6..960879cfd04d 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/piePoint.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/piePoint.tests.js @@ -1348,12 +1348,13 @@ QUnit.module('Connector', { this.label = sinon.createStubInstance(labelModule.Label); this.label.getLayoutOptions.returns(this.options.label); this.label.getBoundingRect.returns({ height: 10, width: 20 }); - this.labelFactory = labelModule.Label = sinon.spy(function() { + this.labelFactory = sinon.spy(function() { return that.label; }); + labelModule.DEBUG_set_Label(this.labelFactory); }, afterEach: function() { - labelModule.Label = originalLabel; + labelModule.DEBUG_set_Label(originalLabel); } }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/pieSeries.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/pieSeries.tests.js index 8fc75f54cf79..9311c3f401bb 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/pieSeries.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/pieSeries.tests.js @@ -78,7 +78,7 @@ const environment = { beforeEach: function() { this.data = [{ arg: 1, val: 10 }, { arg: 2, val: 20 }, { arg: 3, val: 30 }, { arg: 4, val: 40 }]; let mockPointIndex = 0; - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function(series, data) { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function(series, data) { const stub = mockPoints[mockPointIndex++]; stub.argument = data.argument || 1; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/polarPoint.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/polarPoint.tests.js index e6cbb4c97fd5..96791c15b3ce 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/polarPoint.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/polarPoint.tests.js @@ -61,7 +61,7 @@ const environment = { series._argumentChecker.returns(true); series._valueChecker.returns(true); - this.createLabel = sinon.stub(labelModule, 'Label').callsFake(function() { + this.createLabel = stubSeam(labelModule, 'Label', 'DEBUG_set_Label').callsFake(function() { label.getBoundingRect.returns({ x: 1, y: 2, width: 20, height: 10 }); label.getLayoutOptions.returns({ alignment: 'center', radialOffset: 0 }); resetStub(label); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/rangePoint.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/rangePoint.tests.js index 434d377fb08a..54ad00fca54f 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/rangePoint.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/rangePoint.tests.js @@ -7,6 +7,7 @@ import pointModule from 'viz/series/points/base_point'; import labelModule from 'viz/series/points/label'; import { MockTranslator, MockAxis } from '../../helpers/chartMocks.js'; import tooltipModule from 'viz/core/tooltip'; +import { spySeam } from '../../helpers/moduleSeam.js'; const originalLabel = labelModule.Label; @@ -71,12 +72,13 @@ const environment = { attributes: {} } }; - this.labelFactory = labelModule.Label = sinon.spy(function() { + this.labelFactory = sinon.spy(function() { const label = sinon.createStubInstance(originalLabel); label.getLayoutOptions.returns(that.options.label); label.getBoundingRect.returns({ height: 10, width: 20 }); return label; }); + labelModule.DEBUG_set_Label(this.labelFactory); this.series = { name: 'series', _labelsGroup: {}, @@ -92,7 +94,7 @@ const environment = { }; }, afterEach: function() { - labelModule.Label = originalLabel; + labelModule.DEBUG_set_Label(originalLabel); } }; @@ -2129,7 +2131,7 @@ QUnit.module('API', { _argumentChecker: function() { return true; }, _valueChecker: function() { return true; } }; - sinon.spy(labelModule, 'Label'); + spySeam(labelModule, 'Label', 'DEBUG_set_Label'); this.translators = { arg: new MockTranslator({ diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/rangeSeries.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/rangeSeries.tests.js index 6423c169a150..4a3cd4fb57b8 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/rangeSeries.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/rangeSeries.tests.js @@ -79,7 +79,7 @@ const environmentWithSinonStubPoint = { beforeEach: function() { environment.beforeEach.call(this); let mockPointIndex = 0; - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function(params, data) { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function(params, data) { const stub = mockPoints[mockPointIndex++]; stub.argument = 1; stub.hasValue.returns(true); @@ -181,7 +181,7 @@ const environmentWithSinonStubPoint = { QUnit.module('RangeSeries. API', { beforeEach: function() { environment.beforeEach.call(this); - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function() { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function() { const stub = sinon.createStubInstance(originalPoint); stub.argument = 1; stub.hasValue.returns(true); @@ -339,7 +339,7 @@ const environmentWithSinonStubPoint = { this.options = { type: 'rangearea' }; - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function() { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function() { const stub = sinon.createStubInstance(originalPoint); stub.argument = 1; stub.hasValue.returns(true); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/scatterSeries.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/scatterSeries.tests.js index b0ebdb1172b8..7e14f4804f82 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/scatterSeries.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/scatterSeries.tests.js @@ -85,7 +85,7 @@ const environment = { this.renderer = new Renderer(); this.seriesGroup = this.renderer.g(); this.data = [{ arg: 1, val: 10 }, { arg: 2, val: 20 }, { arg: 3, val: 30 }, { arg: 4, val: 40 }]; - this.createPoint = sinon.stub(pointModule, 'Point').callsFake(function(series, data) { + this.createPoint = stubSeam(pointModule, 'Point', 'DEBUG_set_Point').callsFake(function(series, data) { const stub = mockPoints[mockPointIndex++]; data = data || {}; stub.argument = data.argument || 1; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/symbolPoint.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/symbolPoint.tests.js index fcda018b09c2..36cbe03cc342 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/symbolPoint.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/symbolPoint.tests.js @@ -33,9 +33,10 @@ const environment = { return !this.draw.calledWith(false); }); - this.labelFactory = labelModule.Label = sinon.spy(function() { + this.labelFactory = sinon.spy(function() { return that.label; }); + labelModule.DEBUG_set_Label(this.labelFactory); this.options = { widgetType: 'chart', visible: true, @@ -71,7 +72,7 @@ const environment = { }; }, afterEach: function() { - labelModule.Label = originalLabel; + labelModule.DEBUG_set_Label(originalLabel); } }; const translateXData = { 'canvas_position_default': 'x0', 1: 'x1', 2: 'x2', 3: 'x3', 4: 'x4', 5: 'x5' }; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core/annotations.plugins.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core/annotations.plugins.tests.js index 4651ac45599d..1d883e7b9858 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core/annotations.plugins.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core/annotations.plugins.tests.js @@ -1291,14 +1291,14 @@ const environment = { this.renderer = new Renderer(); rendererModule.Renderer = sinon.spy(() => this.renderer); - TooltipModule.Tooltip = sinon.spy((options) => { + TooltipModule.DEBUG_set_tooltip(sinon.spy((options) => { this.tooltip = new Tooltip(options); this.tooltip.show = sinon.stub().returns(true); this.tooltip.hide = sinon.spy(); this.tooltip.move = sinon.spy(); this.tooltip.isCursorOnTooltip = sinon.stub().returns(false); return this.tooltip; - }); + })); }, createChart(options) { const chart = $('
').appendTo('#qunit-fixture').dxChart($.extend(true, { diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core/axisDrawing.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core/axisDrawing.tests.js index a1cc51c986d2..a99de81626a6 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core/axisDrawing.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core/axisDrawing.tests.js @@ -4,6 +4,7 @@ import translator2DModule from 'viz/translators/translator2d'; import { Range } from 'viz/translators/range'; import tickGeneratorModule from 'viz/axes/tick_generator'; import { Axis } from 'viz/axes/base_axis'; +import { stubSeam } from '../../helpers/moduleSeam.js'; import { Renderer, stubClass, @@ -51,7 +52,7 @@ const environment = { }); this.renderer = new Renderer(); - this.tickGenerator = sinon.stub(tickGeneratorModule, 'tickGenerator').callsFake(function() { + this.tickGenerator = stubSeam(tickGeneratorModule, 'tickGenerator', 'DEBUG_set_tickGenerator').callsFake(function() { return function() { return { ticks: that.generatedTicks || [], diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core/axisFormatting.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core/axisFormatting.tests.js index 7138b4ecfdec..8ae893e4379e 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core/axisFormatting.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core/axisFormatting.tests.js @@ -4,6 +4,7 @@ import translator2DModule from 'viz/translators/translator2d'; import { Range } from 'viz/translators/range'; import tickGeneratorModule from 'viz/axes/tick_generator'; import { Axis } from 'viz/axes/base_axis'; +import { stubSeam } from '../../helpers/moduleSeam.js'; import { Renderer, stubClass, @@ -46,7 +47,7 @@ const environment = { }); this.renderer = new Renderer(); - this.tickGenerator = sinon.stub(tickGeneratorModule, 'tickGenerator').callsFake(function() { + this.tickGenerator = stubSeam(tickGeneratorModule, 'tickGenerator', 'DEBUG_set_tickGenerator').callsFake(function() { return function() { return { ticks: that.generatedTicks || [], diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core/baseAxis.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core/baseAxis.tests.js index 344d26c1edce..8240a8fe5b93 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core/baseAxis.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core/baseAxis.tests.js @@ -10,6 +10,7 @@ import translator2DModule from 'viz/translators/translator2d'; import { Range } from 'viz/translators/range'; import xyMethods from '__internal/viz/axes/xy_axes'; import { isFunction, isDeferred } from 'core/utils/type'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const StubTranslator = stubClass(translator2DModule.Translator2D, { updateBusinessRange: function(range) { @@ -29,7 +30,7 @@ const environment = { tickInterval: that.generatedTickInterval }; }); - this.tickGenerator = sinon.stub(tickGeneratorModule, 'tickGenerator').callsFake(function() { + this.tickGenerator = stubSeam(tickGeneratorModule, 'tickGenerator', 'DEBUG_set_tickGenerator').callsFake(function() { return that.tickGeneratorSpy; }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core/baseThemeManager.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core/baseThemeManager.tests.js index 3ed3e29c14cd..850c89478d2d 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core/baseThemeManager.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core/baseThemeManager.tests.js @@ -2,6 +2,7 @@ import $ from 'jquery'; import themeModule from 'viz/themes'; import { BaseThemeManager } from 'viz/core/base_theme_manager'; import paletteModule from '__internal/viz/paletteModule'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const currentTheme = themeModule.currentTheme(); @@ -34,9 +35,9 @@ const environment = { this.themeManager = new BaseThemeManager({ fontFields: [] }); this.callback = sinon.spy(); this.themeManager.setCallback(this.callback); - this.createPalette = sinon.stub(paletteModule, 'createPalette'); - this.getDiscretePalette = sinon.stub(paletteModule, 'getDiscretePalette'); - this.getAccentColor = sinon.stub(paletteModule, 'getAccentColor'); + this.createPalette = stubSeam(paletteModule, 'createPalette', 'DEBUG_set_createPalette'); + this.getDiscretePalette = stubSeam(paletteModule, 'getDiscretePalette', 'DEBUG_set_getDiscretePalette'); + this.getAccentColor = stubSeam(paletteModule, 'getAccentColor', 'DEBUG_set_getAccentColor'); }, afterEach: function() { diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core/polarAxes.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core/polarAxes.tests.js index 7d035cb017b9..0fe0e2464b36 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core/polarAxes.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core/polarAxes.tests.js @@ -8,6 +8,7 @@ import tickGeneratorModule from 'viz/axes/tick_generator'; import rangeModule from 'viz/translators/range'; import { Axis } from 'viz/axes/base_axis'; import { extend } from 'core/utils/extend'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const TranslatorStubCtor = new ObjectPool(translator2DModule.Translator2D); const RangeStubCtor = new ObjectPool(rangeModule.Range); @@ -31,7 +32,7 @@ const environment = { this.renderer = new Renderer(); - this.tickGenerator = sinon.stub(tickGeneratorModule, 'tickGenerator').callsFake(function() { + this.tickGenerator = stubSeam(tickGeneratorModule, 'tickGenerator', 'DEBUG_set_tickGenerator').callsFake(function() { return sinon.spy(function() { return { ticks: that.generatedTicks || [], diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core/xyAxes.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core/xyAxes.tests.js index ddee7066bde7..01097a416c10 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core/xyAxes.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core/xyAxes.tests.js @@ -9,6 +9,7 @@ import rangeModule from 'viz/translators/range'; import { Axis } from 'viz/axes/base_axis'; import { MockSeries } from '../../helpers/chartMocks.js'; import { patchFontOptions } from 'viz/core/utils'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const Translator2D = translator2DModule.Translator2D; @@ -45,7 +46,7 @@ const environment = { breaks: breaks }; }); - this.tickGenerator = sinon.stub(tickGeneratorModule, 'tickGenerator').callsFake(function() { + this.tickGenerator = stubSeam(tickGeneratorModule, 'tickGenerator', 'DEBUG_set_tickGenerator').callsFake(function() { return that.tickGeneratorSpy; }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.funnel/commonParts/label.js b/packages/devextreme/testing/tests/DevExpress.viz.funnel/commonParts/label.js index f2090e457b63..8eb284de2244 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.funnel/commonParts/label.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.funnel/commonParts/label.js @@ -2,10 +2,11 @@ import $ from 'jquery'; import { environment, stubAlgorithm } from './common.js'; import labelModule from 'viz/series/points/label'; import { - stubClass + stubClass, } from '../../../helpers/vizMocks.js'; import * as labels from '__internal/viz/funnel/label'; import dxFunnel from '__internal/viz/funnel/funnel'; +import { stubSeam } from '../../../helpers/moduleSeam.js'; const Label = labelModule.Label; const stubLabel = stubClass(Label); @@ -34,7 +35,7 @@ export const labelEnvironment = $.extend({}, environment, { const that = this; - sinon.stub(labelModule, 'Label').callsFake(function() { + stubSeam(labelModule, 'Label', 'DEBUG_set_Label').callsFake(function() { const stub = new stubLabel(); stub.stub('isVisible').returns(true); stub.stub('getBoundingRect').returns(that.labelBoxes[(labelBoxesIndex++) % that.labelBoxes.length]); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.funnel/funnel.base.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.funnel/funnel.base.tests.js index 1082fd01539c..95752501161f 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.funnel/funnel.base.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.funnel/funnel.base.tests.js @@ -4,6 +4,7 @@ import rendererModule from 'viz/core/renderers/renderer'; import paletteModule from '__internal/viz/paletteModule'; import themeModule from 'viz/themes'; +import { spySeam } from '../../helpers/moduleSeam.js'; themeModule.registerTheme({ name: 'test-theme', @@ -271,7 +272,7 @@ QUnit.test('Resize', function(assert) { }); QUnit.test('palette', function(assert) { - sinon.spy(paletteModule, 'createPalette'); + spySeam(paletteModule, 'createPalette', 'DEBUG_set_createPalette'); stubAlgorithm.normalizeValues.returns([1, 1]); stubAlgorithm.getFigures.returns([ @@ -452,7 +453,7 @@ QUnit.test('Update inverted option', function(assert) { }); QUnit.test('Update palette', function(assert) { - sinon.spy(paletteModule, 'createPalette'); + spySeam(paletteModule, 'createPalette', 'DEBUG_set_createPalette'); stubAlgorithm.normalizeValues.returns([1, 1]); stubAlgorithm.getFigures.returns([ diff --git a/packages/devextreme/testing/tests/DevExpress.viz.funnel/funnel.tracker.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.funnel/funnel.tracker.tests.js index e7a9d31d308d..966ee647702e 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.funnel/funnel.tracker.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.funnel/funnel.tracker.tests.js @@ -8,6 +8,7 @@ import legendModule from 'viz/components/legend'; import { createFunnel, environment } from './commonParts/common.js'; import labelModule from 'viz/series/points/label'; import { stubClass } from '../../helpers/vizMocks.js'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const stubLabel = stubClass(labelModule.Label); const stubLegend = stubClass(legendModule.Legend); @@ -28,7 +29,7 @@ const trackerEnvironment = $.extend({}, environment, { const that = this; environment.beforeEach.apply(this); this.legend = new stubLegend(); - sinon.stub(labelModule, 'Label').callsFake(function() { + stubSeam(labelModule, 'Label', 'DEBUG_set_Label').callsFake(function() { const stub = new stubLabel(); stub.stub('getBoundingRect').returns({ width: 0, diff --git a/packages/devextreme/testing/tests/DevExpress.viz.gauges/barGauge_new.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.gauges/barGauge_new.tests.js index 0a3f0b971eec..19a307dd3057 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.gauges/barGauge_new.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.gauges/barGauge_new.tests.js @@ -49,7 +49,7 @@ $('
') const _LoadingIndicator = loadingIndicatorModule.LoadingIndicator; titleModule.DEBUG_set_title(Title); -tooltipModule.Tooltip = Tooltip; +tooltipModule.DEBUG_set_tooltip(Tooltip); loadingIndicatorModule.DEBUG_set_LoadingIndicator(LoadingIndicator); QUnit.module('Misc', { diff --git a/packages/devextreme/testing/tests/DevExpress.viz.gauges/circularGauge.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.gauges/circularGauge.tests.js index 7aa45225f2d6..70340a91087c 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.gauges/circularGauge.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.gauges/circularGauge.tests.js @@ -8,6 +8,7 @@ import { import dxCircularGauge from 'viz/circular_gauge'; import axisModule from 'viz/axes/base_axis'; import rendererModule from 'viz/core/renderers/renderer_default'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const factory = dxCircularGauge.prototype._factory; @@ -107,7 +108,7 @@ class TestPointerElement extends TestElement { (function circularGauge() { rendererModule.Renderer = sinon.stub(); - sinon.stub(axisModule, 'Axis').callsFake(function(parameters) { + stubSeam(axisModule, 'Axis', 'DEBUG_set_Axis').callsFake(function(parameters) { const axis = new Axis(parameters); axis.measureLabels = sinon.stub().returns({ width: 30, diff --git a/packages/devextreme/testing/tests/DevExpress.viz.gauges/common.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.gauges/common.tests.js index f17fb9d6541c..d8edd23f1b0a 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.gauges/common.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.gauges/common.tests.js @@ -24,12 +24,13 @@ import rangeModule from 'viz/translators/range'; import translator1DModule from 'viz/translators/translator1d'; import rendererModule from 'viz/core/renderers/renderer_default'; import themeManagerModule from '__internal/viz/gauges/theme_manager'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const stubRange = stubClass(rangeModule.Range); $('
').appendTo('#qunit-fixture'); -sinon.stub(rangeModule, 'Range').callsFake(function(parameters) { +stubSeam(rangeModule, 'Range', 'DEBUG_set_Range').callsFake(function(parameters) { return new stubRange(parameters); }); @@ -80,11 +81,11 @@ const factory = dxTestGauge.prototype._factory = objectUtils.clone(dxGauge.proto registerComponent('dxTestGauge', dxTestGauge); const StubTooltip = Tooltip; -tooltipModule.Tooltip = function(parameters) { +tooltipModule.DEBUG_set_tooltip(function(parameters) { return new StubTooltip(parameters); -}; +}); -sinon.stub(axisModule, 'Axis').callsFake(function(parameters) { +stubSeam(axisModule, 'Axis', 'DEBUG_set_Axis').callsFake(function(parameters) { return new Axis(parameters); }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.gauges/linearGauge.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.gauges/linearGauge.tests.js index d04bbcc54d8f..a2ddb6021ef2 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.gauges/linearGauge.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.gauges/linearGauge.tests.js @@ -5,6 +5,7 @@ import { Axis as VizMocksAxis, Renderer as VizMocksRenderer } from '../../helper import dxLinearGauge from 'viz/linear_gauge'; import axisModule from 'viz/axes/base_axis'; import rendererModule from 'viz/core/renderers/renderer_default'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const factory = dxLinearGauge.prototype._factory; @@ -102,7 +103,7 @@ class TestPointerElement extends TestElement { (function linearGauge() { rendererModule.Renderer = sinon.stub(); - sinon.stub(axisModule, 'Axis').callsFake(function(parameters) { + stubSeam(axisModule, 'Axis', 'DEBUG_set_Axis').callsFake(function(parameters) { const axis = new VizMocksAxis(parameters); axis.measureLabels = sinon.stub().returns({ width: 30, diff --git a/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common_new.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common_new.tests.js index 6eb75b4446ea..a61558ab9904 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common_new.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/common_new.tests.js @@ -7,6 +7,7 @@ import rendererModule from 'viz/core/renderers/renderer_default'; import axisModule from 'viz/axes/base_axis'; import translator2DModule from 'viz/translators/translator2d'; import '__internal/viz/range_selector/range_selector'; +import { stubSeam } from '../../helpers/moduleSeam.js'; const StubAxis = stubClass(axisModule.Axis); @@ -30,7 +31,7 @@ QUnit.module('RangeSelector', { rendererModule.Renderer = function() { return renderer; }; this.axis = new StubAxis(); this.axis.stub('getVisibleArea').returns([]); - sinon.stub(axisModule, 'Axis').callsFake(function() { + stubSeam(axisModule, 'Axis', 'DEBUG_set_Axis').callsFake(function() { return that.axis; }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/rangeSelectorParts/commons.js b/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/rangeSelectorParts/commons.js index cbfe91d1f6c1..fab03aaef8c5 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/rangeSelectorParts/commons.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/rangeSelectorParts/commons.js @@ -16,6 +16,7 @@ import { Renderer, } from '../../../helpers/vizMocks.js'; import '__internal/viz/range_selector/range_selector'; +import { stubSeam } from '../../../helpers/moduleSeam.js'; const StubThemeManager = stubClass(themeManagerModule.BaseThemeManager); const StubRangeView = stubClass(rangeViewModule.RangeView); @@ -76,14 +77,14 @@ export const environment = { this.seriesDataSource = new StubSeriesDataSource(); rendererModule.Renderer = returnValue(this.renderer); - themeManagerModule.BaseThemeManager = returnValue(this.themeManager); + themeManagerModule.DEBUG_set_BaseThemeManager(returnValue(this.themeManager)); rangeViewModule.DEBUG_set_RangeView(returnValue(this.rangeView)); slidersControllerModule.DEBUG_set_SlidersController(returnValue(this.slidersController)); trackerModule.DEBUG_set_Tracker(returnValue(this.tracker)); seriesDataSourceModule.DEBUG_set_SeriesDataSource(returnValue(this.seriesDataSource)); translator2DModule.Translator2D = returnValue(this.translator); - sinon.stub(axisModule, 'Axis'); + stubSeam(axisModule, 'Axis', 'DEBUG_set_Axis'); axisModule.Axis.returns(this.axis); }, diff --git a/packages/devextreme/testing/tests/DevExpress.viz.renderers/Renderer.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.renderers/Renderer.tests.js index 78cf7bb4d83b..2a27c73a91bc 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.renderers/Renderer.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.renderers/Renderer.tests.js @@ -55,7 +55,7 @@ function resetMockElements() { }); } -animationModule.AnimationController = stubClass(animationModule.AnimationController); +animationModule.DEBUG_set_AnimationController(stubClass(animationModule.AnimationController)); const Renderer = renderers.Renderer; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.sankey/sankey.base.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.sankey/sankey.base.tests.js index 0dca120df794..0c975a604152 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.sankey/sankey.base.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.sankey/sankey.base.tests.js @@ -3,6 +3,7 @@ import { testData, createSankey, layoutBuilder, spiesLayoutBuilder, environment, import rendererModule from 'viz/core/renderers/renderer'; import paletteModule from '__internal/viz/paletteModule'; import themeModule from 'viz/themes'; +import { spySeam } from '../../helpers/moduleSeam.js'; themeModule.registerTheme({ name: 'test-theme', @@ -558,7 +559,7 @@ QUnit.test('Resize', function(assert) { }); QUnit.test('Palette', function(assert) { - sinon.spy(paletteModule, 'createPalette'); + spySeam(paletteModule, 'createPalette', 'DEBUG_set_createPalette'); createSankey({ dataSource: [{ source: 'A', target: 'Z', weight: 1 }, { source: 'B', target: 'Z', weight: 1 }], @@ -737,7 +738,7 @@ QUnit.test('Update color of links', function(assert) { }); QUnit.test('Update palette', function(assert) { - sinon.spy(paletteModule, 'createPalette'); + spySeam(paletteModule, 'createPalette', 'DEBUG_set_createPalette'); const sankey = createSankey({ dataSource: [{ source: 'A', target: 'Z', weight: 1 }], diff --git a/packages/devextreme/testing/tests/DevExpress.viz.sparklines/bulletTooltip.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.sparklines/bulletTooltip.tests.js index f7b42f70408c..c25bd459b24e 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.sparklines/bulletTooltip.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.sparklines/bulletTooltip.tests.js @@ -30,9 +30,9 @@ rendererModule.Renderer = function() { return currentTest().renderer; }; -baseThemeManagerModule.BaseThemeManager = function() { +baseThemeManagerModule.DEBUG_set_BaseThemeManager(function() { return currentTest().themeManager; -}; +}); StubThemeManager.prototype.setTheme = function() { forceThemeOptions(this); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.sparklines/sparkline.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.sparklines/sparkline.tests.js index 153c243c0412..10b0ee55e5b4 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.sparklines/sparkline.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.sparklines/sparkline.tests.js @@ -16,6 +16,7 @@ import translator2DModule from 'viz/translators/translator2d'; import seriesModule from 'viz/series/base_series'; import { DataSource } from 'common/data/data_source/data_source'; import 'viz/sparkline'; +import { stubSeam } from '../../helpers/moduleSeam.js'; $('
') .attr('id', 'container') @@ -38,9 +39,9 @@ QUnit.begin(function() { return new FakeTranslator(); }); - seriesModule.Series = sinon.spy(function() { + seriesModule.DEBUG_set_Series(sinon.spy(function() { return currentTest().series; - }); + })); tooltipModule.DEBUG_set_tooltip(sinon.spy(function() { return currentTest().tooltip; @@ -95,7 +96,7 @@ QUnit.begin(function() { return $.extend({}, environment, { beforeEach: function() { environment.beforeEach.apply(this, arguments); - this.validateData = sinon.stub(dataValidatorModule, 'validateData').callsFake(function() { + this.validateData = stubSeam(dataValidatorModule, 'validateData', 'DEBUG_set_validateData').callsFake(function() { return { arg: [{ argument: 1, diff --git a/packages/devextreme/testing/tests/DevExpress.viz.sparklines/sparklineTooltip.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.sparklines/sparklineTooltip.tests.js index 2f3ae286da64..ae62318da0a8 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.sparklines/sparklineTooltip.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.sparklines/sparklineTooltip.tests.js @@ -38,9 +38,9 @@ rendererModule.Renderer = function() { return new Renderer(); }; -baseThemeManagerModule.BaseThemeManager = function() { +baseThemeManagerModule.DEBUG_set_BaseThemeManager(function() { return currentTest().themeManager; -}; +}); function getSparklineTooltip(sparkline) { return sparkline._tooltip; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js index 4c621beac87b..84aede50516b 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/dxVectorMap.tests.js @@ -64,7 +64,7 @@ QUnit.test('Background', function(assert) { }); QUnit.test('Layer collection', function(assert) { - const spy = sinon.spy(mapLayerModule, 'MapLayerCollection'); + const spy = spySeam(mapLayerModule, 'MapLayerCollection', 'DEBUG_set_MapLayerCollection'); this.createMap({ layers: [{ tag: 'layer-1', dataSource: 'data-1' }, { tag: 'layer-2', dataSource: 'data-2' }] @@ -91,7 +91,7 @@ QUnit.test('Layer collection', function(assert) { }); QUnit.test('Set bounds when data ready called. Without bounds in options', function(assert) { - const spy = sinon.spy(mapLayerModule, 'MapLayerCollection'); + const spy = spySeam(mapLayerModule, 'MapLayerCollection', 'DEBUG_set_MapLayerCollection'); const layers = [{ proxy: { tag: 'p1', getBounds: function() { return [0, 0, 10, 10]; } }, getData: function() { return { count: function() { return 0; } }; } @@ -114,7 +114,7 @@ QUnit.test('Set bounds when data ready called. Without bounds in options', funct }); QUnit.test('Projection by data. Default bounds are include common bounds', function(assert) { - const spy = sinon.spy(mapLayerModule, 'MapLayerCollection'); + const spy = spySeam(mapLayerModule, 'MapLayerCollection', 'DEBUG_set_MapLayerCollection'); const layers = [{ proxy: { tag: 'p1', getBounds: function() { return [0, 0, 10, 10]; } }, getData: function() { return { count: function() { return 0; } }; } @@ -135,7 +135,7 @@ QUnit.test('Projection by data. Default bounds are include common bounds', funct }); QUnit.test('Projection by data. Without projection in options', function(assert) { - const spy = sinon.spy(mapLayerModule, 'MapLayerCollection'); + const spy = spySeam(mapLayerModule, 'MapLayerCollection', 'DEBUG_set_MapLayerCollection'); const layers = [{ proxy: { tag: 'p1', getBounds: function() { return [0, 0, 10, 10]; } }, getData: function() { return { count: function() { return 0; } }; } @@ -158,7 +158,7 @@ QUnit.test('Projection by data. Without projection in options', function(assert) }); QUnit.test('Projection by data. Projection in options', function(assert) { - const spy = sinon.spy(mapLayerModule, 'MapLayerCollection'); + const spy = spySeam(mapLayerModule, 'MapLayerCollection', 'DEBUG_set_MapLayerCollection'); const layers = [{ proxy: { tag: 'p1', getBounds: function() { return [0, 0, 10, 10]; } }, getData: function() { return { count: function() { return 0; } }; } @@ -179,7 +179,7 @@ QUnit.test('Projection by data. Projection in options', function(assert) { }); QUnit.test('Bounds by data. Empty bbox', function(assert) { - const spy = sinon.spy(mapLayerModule, 'MapLayerCollection'); + const spy = spySeam(mapLayerModule, 'MapLayerCollection', 'DEBUG_set_MapLayerCollection'); const layers = []; this.layerCollection.stub('items').returns(layers); @@ -196,7 +196,7 @@ QUnit.test('Bounds by data. Empty bbox', function(assert) { }); QUnit.test('Set bounds when data ready called. With bounds in options', function(assert) { - const spy = sinon.spy(mapLayerModule, 'MapLayerCollection'); + const spy = spySeam(mapLayerModule, 'MapLayerCollection', 'DEBUG_set_MapLayerCollection'); const layers = [{ proxy: { tag: 'p1', getBounds: function() { return [0, 0, 10, 10]; } }, getData: function() { @@ -298,7 +298,7 @@ QUnit.test('LayoutControl', function(assert) { }); QUnit.test('Tracker', function(assert) { - const spy = sinon.spy(trackerModule, 'Tracker'); + const spy = spySeam(trackerModule, 'Tracker', 'DEBUG_set_Tracker'); this.createMap({ touchEnabled: 0, @@ -549,7 +549,7 @@ QUnit.test('Applying bounds by data', function(assert) { }; } }]; - const spy = sinon.spy(mapLayerModule, 'MapLayerCollection'); + const spy = spySeam(mapLayerModule, 'MapLayerCollection', 'DEBUG_set_MapLayerCollection'); this.createMap({ getBoundsFromData: true }); @@ -1020,7 +1020,7 @@ QUnit.module('drawn', stubLayersEnvironment); QUnit.test('call drawn after layer collection ready', function(assert) { const onDrawn = sinon.spy(); - const spy = sinon.spy(mapLayerModule, 'MapLayerCollection'); + const spy = spySeam(mapLayerModule, 'MapLayerCollection', 'DEBUG_set_MapLayerCollection'); this.createMap({ onDrawn: onDrawn }); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/map.elementsInteraction.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/map.elementsInteraction.tests.js index 1c89f6bc5f9c..93bba032c0f1 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/map.elementsInteraction.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/map.elementsInteraction.tests.js @@ -44,7 +44,7 @@ QUnit.test('On zoom', function(assert) { QUnit.module('Map - event trigger interaction', $.extend({}, environment, { createMap: function() { - const spy = sinon.spy(mapLayerModule, 'MapLayerCollection'); + const spy = spySeam(mapLayerModule, 'MapLayerCollection', 'DEBUG_set_MapLayerCollection'); environment.createMap.apply(this, arguments); this.eventTrigger = spy.lastCall.args[0].eventTrigger; }, diff --git a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/vectorMapParts/commons.js b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/vectorMapParts/commons.js index c63ca623116d..854017192985 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/vectorMapParts/commons.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.vectorMap/vectorMapParts/commons.js @@ -56,12 +56,12 @@ function stubComponentConstructors(test) { projectionModule.DEBUG_set_Projection(returnValue(test.projection)); controlBarModule.DEBUG_set_ControlBar(returnValue(test.controlBar)); gestureHandlerModule.DEBUG_set_GestureHandler(returnValue(test.gestureHandler)); - trackerModule.Tracker = returnValue(test.tracker); - themeManagerModule.BaseThemeManager = returnValue(test.themeManager); + trackerModule.DEBUG_set_Tracker(returnValue(test.tracker)); + themeManagerModule.DEBUG_set_BaseThemeManager(returnValue(test.themeManager)); dataExchangerModule.DEBUG_set_DataExchanger(returnValue(test.dataExchanger)); legendModule.DEBUG_set_LegendsControl(returnValue(test.legendsControl)); layoutModule.DEBUG_set_LayoutControl(returnValue(test.layoutControl)); - mapLayerModule.MapLayerCollection = returnValue(test.layerCollection); + mapLayerModule.DEBUG_set_MapLayerCollection(returnValue(test.layerCollection)); tooltipViewerModule.DEBUG_set_TooltipViewer(returnValue(test.tooltipViewer)); } export { stubComponentConstructors }; From 07dc6c6097baed3b2cf78fd34cd1d67efb175e05 Mon Sep 17 00:00:00 2001 From: Andrei Vorobev <738482+vorobey@users.noreply.github.com> Date: Wed, 2 Sep 2026 11:43:39 +0300 Subject: [PATCH 08/12] chore: remove mutable facade completely --- .../__internal/common/core/animation/frame.ts | 24 +- .../__internal/viz/core/renderers/renderer.ts | 9 +- .../js/__internal/viz/core/utils.ts | 29 +- .../viz/translators/translator2d.ts | 9 +- .../helpers/esm-shims/mutable_facade.js | 50 -- packages/devextreme/testing/runner/README.md | 68 ++- .../testing/runner/lib/autoMutableFacade.ts | 557 ------------------ .../testing/runner/lib/handWrittenShims.ts | 23 + .../testing/runner/lib/importMap.ts | 7 +- .../testing/runner/lib/mutableModuleGroups.ts | 42 -- .../runner/lib/namespaceFacadeModules.ts | 6 - .../devextreme/testing/runner/lib/static.ts | 24 +- .../tests/DevExpress.animation/fx.tests.js | 3 +- .../DevExpress.ui.widgets/animator.tests.js | 3 +- .../DevExpress.ui.widgets/draggable.tests.js | 3 +- .../DevExpress.ui.widgets/gallery.tests.js | 3 +- .../DevExpress.ui.widgets/scrollView.tests.js | 3 +- .../scrollable.actions.tests.js | 3 +- .../scrollable.dynamic.tests.js | 23 +- .../scrollableParts/scrollable.main.tests.js | 3 +- .../scrollable.mouseWheel.tests.js | 3 +- .../scrollableParts/scrollable.rtl.tests.js | 3 +- .../scrollable.scrollbar.tests.js | 3 +- .../scrollable.scrollingByThumb.tests.js | 3 +- .../scrollable.useNative.tests.js | 3 +- .../DevExpress.ui.widgets/sortable.tests.js | 3 +- .../chart.integration.tests.js | 6 +- .../chart.part1.tests.js | 6 +- .../chart.part2.tests.js | 2 +- .../chart.part4.tests.js | 21 +- .../chartAxisDrawing.tests.js | 2 +- .../chartParts/commons.js | 4 +- .../DevExpress.viz.charts/chartSync.tests.js | 8 +- .../equalPieSize.tests.js | 4 +- .../DevExpress.viz.charts/pieChart.tests.js | 4 +- .../DevExpress.viz.charts/polarChart.tests.js | 2 +- .../DevExpress.viz.charts/scrollBar.tests.js | 3 +- .../areaSeries.tests.js | 3 +- .../lineSeries.tests.js | 3 +- .../annotations.plugins.tests.js | 4 +- .../axesTicksGeneration.tests.js | 3 +- .../DevExpress.viz.core/axisDrawing.tests.js | 2 +- .../axisFormatting.tests.js | 2 +- .../DevExpress.viz.core/baseAxis.tests.js | 16 +- .../DevExpress.viz.core/baseWidget.tests.js | 3 +- .../export.integration.tests.js | 4 +- .../DevExpress.viz.core/polarAxes.tests.js | 10 +- .../DevExpress.viz.core/tooltip.tests.js | 8 +- .../tests/DevExpress.viz.core/xyAxes.tests.js | 10 +- .../commonParts/common.js | 3 +- .../funnel.base.tests.js | 2 +- .../DevExpress.viz.gauges/barGauge.tests.js | 4 +- .../barGauge_new.tests.js | 7 +- .../DevExpress.viz.gauges/baseGauge.tests.js | 4 +- .../circularGauge.tests.js | 2 +- .../DevExpress.viz.gauges/common.tests.js | 2 +- .../linearGauge.tests.js | 2 +- .../common_new.tests.js | 2 +- .../rangeSelectorParts/commons.js | 4 +- .../rangeView.tests.js | 3 +- .../slidersController.tests.js | 4 +- .../Animation.tests.js | 7 +- .../Renderer.tests.js | 2 +- .../SvgElement.tests.js | 2 +- .../commonParts/common.js | 3 +- .../sankey.base.tests.js | 2 +- .../baseSparklineTooltipEvents.tests.js | 4 +- .../DevExpress.viz.sparklines/bullet.tests.js | 8 +- .../bulletTooltip.tests.js | 4 +- .../sparkline.tests.js | 8 +- .../sparklineTooltip.tests.js | 4 +- .../commonParts/common.js | 2 +- .../dxVectorMap.tests.js | 2 +- .../mapLayer_new.tests.js | 4 +- .../DevExpress.viz.vectorMap/tracker.tests.js | 5 +- .../vectorMapParts/commons.js | 2 +- 76 files changed, 289 insertions(+), 849 deletions(-) delete mode 100644 packages/devextreme/testing/helpers/esm-shims/mutable_facade.js delete mode 100644 packages/devextreme/testing/runner/lib/autoMutableFacade.ts create mode 100644 packages/devextreme/testing/runner/lib/handWrittenShims.ts delete mode 100644 packages/devextreme/testing/runner/lib/mutableModuleGroups.ts delete mode 100644 packages/devextreme/testing/runner/lib/namespaceFacadeModules.ts diff --git a/packages/devextreme/js/__internal/common/core/animation/frame.ts b/packages/devextreme/js/__internal/common/core/animation/frame.ts index e3c7f7023bb2..a6e907ed06b7 100644 --- a/packages/devextreme/js/__internal/common/core/animation/frame.ts +++ b/packages/devextreme/js/__internal/common/core/animation/frame.ts @@ -1,3 +1,7 @@ +/* eslint-disable import/no-mutable-exports */ +/* eslint-disable @typescript-eslint/naming-convention */ +/* eslint-disable func-names */ + import callOnce from '@js/core/utils/call_once'; import { getWindow, hasWindow } from '@js/core/utils/window'; @@ -46,14 +50,28 @@ const setAnimationFrameMethods = callOnce(() => { }); // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types -export function requestAnimationFrame(...args): number { +export let requestAnimationFrame = function (...args): number { setAnimationFrameMethods(); // @ts-ignore return request.apply(window, args); -} +}; -export function cancelAnimationFrame(requestID: number): void { +export let cancelAnimationFrame = function (requestID: number): void { setAnimationFrameMethods(); cancel.apply(window, [requestID]); +}; + +/// #DEBUG +export function DEBUG_set_requestAnimationFrame( + value: typeof requestAnimationFrame, +): void { + requestAnimationFrame = value; +} + +export function DEBUG_set_cancelAnimationFrame( + value: typeof cancelAnimationFrame, +): void { + cancelAnimationFrame = value; } +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/core/renderers/renderer.ts b/packages/devextreme/js/__internal/viz/core/renderers/renderer.ts index 1f911e926157..9dd0b3b6d9ed 100644 --- a/packages/devextreme/js/__internal/viz/core/renderers/renderer.ts +++ b/packages/devextreme/js/__internal/viz/core/renderers/renderer.ts @@ -1843,7 +1843,7 @@ function unlinkItem(target) { updateIndexes(items, i); } -export function Renderer(options) { +export let Renderer = function (options) { const that = this; that.root = that._createElement('svg', { xmlns: 'http://www.w3.org/2000/svg', @@ -1868,7 +1868,7 @@ export function Renderer(options) { that.root.append({ element: options.container }); that._locker = 0; that._backed = false; -} +}; Renderer.prototype = { constructor: Renderer, @@ -2362,10 +2362,15 @@ const DEBUG_set_ArcSvgElement = function (value) { const DEBUG_set_TextSvgElement = function (value) { TextSvgElement = value; }; + +const DEBUG_set_Renderer = function (value) { + Renderer = value; +}; /// #ENDDEBUG /// #DEBUG exports.DEBUG_set_ArcSvgElement = DEBUG_set_ArcSvgElement; +exports.DEBUG_set_Renderer = DEBUG_set_Renderer; exports.DEBUG_set_PathSvgElement = DEBUG_set_PathSvgElement; exports.DEBUG_set_RectSvgElement = DEBUG_set_RectSvgElement; exports.DEBUG_set_SvgElement = DEBUG_set_SvgElement; diff --git a/packages/devextreme/js/__internal/viz/core/utils.ts b/packages/devextreme/js/__internal/viz/core/utils.ts index fde5ddc1087e..a8fa06edcd6e 100644 --- a/packages/devextreme/js/__internal/viz/core/utils.ts +++ b/packages/devextreme/js/__internal/viz/core/utils.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable @typescript-eslint/prefer-optional-chain */ /* eslint-disable func-names */ /* eslint-disable no-return-assign */ @@ -91,7 +92,7 @@ export const degreesToRadians = function (value) { // Calculates sin and cos for in degrees // Expects number, no validation -export const getCosAndSin = function (angle) { +export let getCosAndSin = function (angle) { const angleInRadians = degreesToRadians(angle); return { cos: _cos(angleInRadians), sin: _sin(angleInRadians) }; }; @@ -276,7 +277,7 @@ export const enumParser = function (values) { }; }; -export const patchFontOptions = function (options) { +export let patchFontOptions = function (options) { const fontOptions = {}; each(options || {}, (key, value) => { if (/^(cursor)$/i.test(key)) { @@ -422,7 +423,7 @@ export function normalizePanesHeight(panes) { } } -export function updatePanesCanvases(panes, canvas, rotated) { +export let updatePanesCanvases = function (panes, canvas, rotated) { let distributedSpace = 0; const padding = PANE_PADDING; const paneSpace = rotated ? canvas.width - canvas.left - canvas.right : canvas.height - canvas.top - canvas.bottom; @@ -441,7 +442,7 @@ export function updatePanesCanvases(panes, canvas, rotated) { distributedSpace = distributedSpace + calcLength + padding; setCanvasValues(pane.canvas); }); -} +}; export const unique = function (array) { const values = {}; @@ -671,7 +672,7 @@ export function pointInCanvas(canvas, x, y) { return x >= canvas.left && x <= canvas.right && y >= canvas.top && y <= canvas.bottom; } -export const getNextDefsSvgId = () => `DevExpress_${numDefsSvgElements++}`; +export let getNextDefsSvgId = () => `DevExpress_${numDefsSvgElements++}`; export function extractColor(color, isBase?) { if (isString(color) || !color) { @@ -681,3 +682,21 @@ export function extractColor(color, isBase?) { } return color.fillId || color.base; } + +/// #DEBUG +export function DEBUG_set_getCosAndSin(value: typeof getCosAndSin): void { + getCosAndSin = value; +} + +export function DEBUG_set_patchFontOptions(value: typeof patchFontOptions): void { + patchFontOptions = value; +} + +export function DEBUG_set_updatePanesCanvases(value: typeof updatePanesCanvases): void { + updatePanesCanvases = value; +} + +export function DEBUG_set_getNextDefsSvgId(value: typeof getNextDefsSvgId): void { + getNextDefsSvgId = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/js/__internal/viz/translators/translator2d.ts b/packages/devextreme/js/__internal/viz/translators/translator2d.ts index a14d04727579..cd0af84c9a88 100644 --- a/packages/devextreme/js/__internal/viz/translators/translator2d.ts +++ b/packages/devextreme/js/__internal/viz/translators/translator2d.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-mutable-exports */ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @stylistic/no-mixed-operators */ /* eslint-disable @typescript-eslint/no-dynamic-delete */ @@ -164,7 +165,7 @@ function getCheckingMethodsAboutBreaks(inverted) { }; } -const _Translator2d = function (businessRange, canvas, options) { +let _Translator2d = function (businessRange, canvas, options) { this.update(businessRange, canvas, options); }; @@ -722,3 +723,9 @@ _Translator2d.prototype = { }; export { _Translator2d as Translator2D }; + +/// #DEBUG +export function DEBUG_set_Translator2D(value: typeof _Translator2d): void { + _Translator2d = value; +} +/// #ENDDEBUG diff --git a/packages/devextreme/testing/helpers/esm-shims/mutable_facade.js b/packages/devextreme/testing/helpers/esm-shims/mutable_facade.js deleted file mode 100644 index 8cc00339e1b3..000000000000 --- a/packages/devextreme/testing/helpers/esm-shims/mutable_facade.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Shared helpers for mutable ESM facades used by QUnit stubbing. - */ -export function wrapCtor(api, name) { - const ExportWrapper = function(...args) { - const Impl = api[name]; - if(new.target) { - return new Impl(...args); - } - return Impl.apply(this, args); - }; - Object.defineProperty(ExportWrapper, 'name', { value: name, configurable: true }); - // Point at the live implementation prototype so stubClass(import { X }) - // sees real methods (e.g. vizMocks Tooltip/Title/ExportMenu). - // Also inherit statics (Class.inherit / redefine / parent / …) so - // `BaseThemeManager.inherit(...)` keeps working under the facade. - const Impl = api[name]; - if(typeof Impl === 'function') { - Object.setPrototypeOf(ExportWrapper, Impl); - if(Impl.prototype) { - ExportWrapper.prototype = Impl.prototype; - } - } - return ExportWrapper; -} - -/** - * @param {object} original - * @param {string} globalKey - * @param {Record} [debugSets] map DEBUG_set_* → api property name - */ -export function createMutableApi(original, globalKey, debugSets = {}) { - if(globalThis[globalKey]) { - return globalThis[globalKey]; - } - - const api = { ...original }; - Object.entries(debugSets).forEach(([debugName, propName]) => { - const originalDebugSet = api[debugName]; - api[debugName] = (value) => { - api[propName] = value; - if(typeof originalDebugSet === 'function') { - originalDebugSet(value); - } - }; - }); - - globalThis[globalKey] = api; - return api; -} diff --git a/packages/devextreme/testing/runner/README.md b/packages/devextreme/testing/runner/README.md index e35639ae1ce2..b1ea2acfb29c 100644 --- a/packages/devextreme/testing/runner/README.md +++ b/packages/devextreme/testing/runner/README.md @@ -25,9 +25,7 @@ HTTP static file server for the QUnit runner. - `aspnet.js` UMD artifact → `cjsInterop.rewriteAspnetArtifactToEsm` - Vendor / Globalize / Intl / VectorMap bundles → wrap as ESM modules - JSON (`?esm-export=1`) → `export default …` -- Serve **generated** mutable facades for modules in `MUTABLE_MODULE_GROUPS` / viz namespace-reexports; redirect only special hand-written cases (e.g. themes). -- For pure `import * as X; export default X` viz reexports, generate facades on the fly via `autoMutableFacade.tryBuildAutoMutableFacade`. -- Support `?dx-original=1` so a shim can import the **real** artifact without being redirected back to itself. +- Redirect the few artifact URLs that have a hand-written shim (themes) — see `handWrittenShims.ts`. This module is the integration point: almost every special-case rewrite for QUnit ESM loading goes through `tryServeStatic`. @@ -51,40 +49,54 @@ Serve-time **CJS → ESM** source rewrites for QUnit tests, helpers, and bundle --- -## `lib/autoMutableFacade.ts` +## Stubbing a module from a test -Generates **mutable ESM facades** at request time so QUnit can `sinon.stub` module APIs without editing `packages/devextreme/js`. +Modules are served as plain ESM artifacts. A module namespace object is frozen, so +`sinon.stub(module, 'name')` and `module.name = fn` both throw — the exporting module +is the only thing that can reassign its own binding. -**Two sources of facades:** +The house pattern is a **`DEBUG_set_*` seam**: turn the export into a `let` and add a +setter inside a `/// #DEBUG` block, which `-c qunit` builds keep and production builds +strip. -1. **`MUTABLE_MODULE_GROUPS`** ([`mutableModuleGroups.ts`](./lib/mutableModuleGroups.ts)) — explicit list of stub-able modules (animation frame, viz renderer, exporter, …). All aliases share one `globalThis` api; named exports use `wrapCtor` / live forwards. Import map points at the ESM artifact URL; `static.ts` serves the generated facade unless `?dx-original=1`. Codegen lives in `autoMutableFacade.ts`. -2. **Namespace-default reexports** (`import * as X; export default X`) under `viz/` — discovered automatically. +```ts +export let Renderer = function (options) { /* … */ }; + +/// #DEBUG +export function DEBUG_set_Renderer(value: typeof Renderer): void { + Renderer = value; +} +/// #ENDDEBUG +``` -Hand-written files under `esm-shims/` remain only for **non-generic** cases (themes composition, CSS inject, jquery/knockout globals, vendor stubs). +Product code that does `import { Renderer } from '…'` sees the new value, because ESM +named exports are live bindings. -Typical generated shape: +In tests, drive the seam through [`testing/helpers/moduleSeam.js`](../helpers/moduleSeam.js), +which re-attaches the `.restore()` that an anonymous `sinon.stub()` lacks: ```js -import * as original from '.../module.js?dx-original=1'; -import { createMutableApi, wrapCtor } from '.../mutable_facade.js'; +import { stubSeam, spySeam } from '../../helpers/moduleSeam.js'; -const api = createMutableApi(original, '__dxAutoMutable_…'); -export const Foo = wrapCtor(api, 'Foo'); -export default api; +// was: sinon.stub(rendererModule, 'Renderer') +const stub = stubSeam(rendererModule, 'Renderer', 'DEBUG_set_Renderer'); +// … +stub.restore(); + +// was: rendererModule.Renderer = fn; +rendererModule.DEBUG_set_Renderer(fn); ``` -To stub a new module, add a group entry in [`mutableModuleGroups.ts`](./lib/mutableModuleGroups.ts): +**Import the barrel that has a default export.** `cjsInterop` rewrites a default import +from a bare specifier to `('default' in ns ? ns.default : { ...ns })`. A barrel with no +default (`viz/core/utils.js`, `viz/core/renderers/renderer.js`) therefore hands the test +a dead **copy** — seams installed elsewhere stay invisible. Use the `_default` barrel +(`viz/core/utils_default`, `viz/core/renderers/renderer_default`), which is +`import * as X; export default X`. -```ts -{ - internal: '__internal/viz/core/title.js', // real module under esm/ - also: ['viz/core/title.js'], // extra artifact URLs → same facade - extraKeys: ['animation/frame'], // optional bare import-map keys - apiFromDefault: true, // when default export is the stub target -} -``` +Older sources use `exports.DEBUG_set_X = DEBUG_set_X` instead of `export function`; +`static.ts` rewrites that to a real ESM export at serve time, so both spellings work. -Import-map keys are derived as `strip(.js)` of `internal`/`also`, plus `extraKeys`. Prefer this over a new hand-written shim. --- ## `testing/helpers/esm-shims/` @@ -93,10 +105,10 @@ Browser modules that the import map (and/or `static.ts` artifact redirects) subs **Why they exist:** -- **Stubbing / mutation** — prefer `MUTABLE_MODULE_GROUPS` in `mutableModuleGroups.ts` (serve-time generated facades via `autoMutableFacade.ts`). Keep a hand-written shim only for custom composition (e.g. themes). +- **Custom composition** — e.g. `themes.js`, which the import map and `static.ts` both point at. Stubbing is *not* a reason to add a shim; use a `DEBUG_set_*` seam instead. - **Globals bridge** — e.g. `jquery.js` / `knockout.js` re-export the classic `