From 63beb01c94d178b156fd1748b2ff5fdebc28eb26 Mon Sep 17 00:00:00 2001 From: Alexander Ziborov <1420883+San4es@users.noreply.github.com> Date: Fri, 31 Jan 2020 18:03:52 +0300 Subject: [PATCH] QUnit: Clean up extensions (#11645) (#11813) # Conflicts: # testing/.eslintrc # testing/tests/DevExpress.viz.sparklines/baseSparklineTooltipEvents.tests.js --- testing/.eslintrc | 3 +- testing/helpers/qunitExtensions.js | 235 ++++++++---------- .../chartAxisDrawing.tests.js | 5 +- .../DevExpress.viz.gauges/barGauge.tests.js | 2 +- .../circularGauge.tests.js | 2 +- .../DevExpress.viz.gauges/common.tests.js | 2 +- .../linearGauge.tests.js | 2 +- .../rangeSelectorParts/commons.js | 4 +- .../DevExpress.viz.sparklines/bullet.tests.js | 2 +- .../bulletTooltip.tests.js | 2 +- .../sparkline.tests.js | 2 +- .../sparklineTooltip.tests.js | 2 +- 12 files changed, 122 insertions(+), 141 deletions(-) diff --git a/testing/.eslintrc b/testing/.eslintrc index ad332cd86cd0..362fb6727790 100644 --- a/testing/.eslintrc +++ b/testing/.eslintrc @@ -20,6 +20,7 @@ "qunit/no-commented-tests": "warn", "qunit/no-identical-names": "warn", "qunit/no-ok-equality": "warn", - "qunit/no-only": "error" + "qunit/no-only": "error", + "qunit/no-setup-teardown": "error" } } diff --git a/testing/helpers/qunitExtensions.js b/testing/helpers/qunitExtensions.js index ed4838b6efc5..7cc5bd2bda0e 100644 --- a/testing/helpers/qunitExtensions.js +++ b/testing/helpers/qunitExtensions.js @@ -2,18 +2,10 @@ /* global jQuery */ !function() { - var module = QUnit.module; - - QUnit.module = function(_, testEnvironment) { - if(testEnvironment && (testEnvironment.setup || testEnvironment.teardown)) { - throw Error('Rename module hooks: The module hooks \'setup\' and \'teardown\' have been renamed to \'beforeEach\' and \'afterEach\'\nhttp://qunitjs.com/upgrade-guide-2.x/#rename-module-hooks'); - } - return module.apply(this, arguments); - }; // compares two float/double numbers with some acceptable epsilon QUnit.assert.roughEqual = function(actual, expected, epsilon, message) { - var delta = Math.abs(expected - actual); + const delta = Math.abs(expected - actual); this.pushResult({ result: delta < epsilon, actual: actual, @@ -22,31 +14,17 @@ }); }; - QUnit.assert.assertPerformance = function(action, limit) { - var start = new Date(); - action(); - var ms = new Date() - start; - this.pushResult({ - result: ms < limit, - actual: ms + ' ms', - expected: limit + ' ms or less', - message: 'Performance test (Limit ' + limit + ' ms, took ' + ms + ' ms)' - }); - }; - - var confirmWindowActive = function() { - var $input; + const confirmWindowActive = function() { + let input; try { - $input = jQuery('') - .appendTo('body') - .click() - .focus(); - - return $input.is(':focus'); + input = document.createElement('input'); + document.body.appendChild(input); + input.click(); + input.focus(); + return document.activeElement === input; } finally { - $input - .blur() - .remove(); + input.blur(); + document.body.removeChild(input); } }; @@ -54,7 +32,7 @@ if(confirmWindowActive()) { QUnit.test.apply(this, arguments); } else { - var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; + const iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; if(iOS) { // do not test // do not skip @@ -72,70 +50,65 @@ }; - var waitFor = window.waitFor = function(predicate, timeout, interval) { + window.waitFor = function(predicate, timeout, interval) { timeout = timeout || 30000; interval = interval || 15; - var d = jQuery.Deferred(), - startTime = jQuery.now(); + let doneCallback; + const startTime = Date.now(); - var checkInterval = setInterval(function() { + const checkIntervalId = setInterval(function() { if(predicate()) { - d.resolve(); + clearInterval(checkIntervalId); + doneCallback(); } - if(jQuery.now() - startTime > timeout) { + if(Date.now() - startTime > timeout) { + clearInterval(checkIntervalId); if(window.console) { - if(jQuery.isFunction(window.console.error)) { + if(typeof window.console.error === 'function') { console.error('waitFor: Timeout is expired'); - } else if(jQuery.isFunction(window.console.log)) { + } else if(typeof window.console.log === 'function') { console.log('waitFor: Timeout is expired'); } } - d.reject(); } }, interval); - d.always(function() { - clearInterval(checkInterval); - }); - - return d.promise(); - }; - - window.waitTimeout = function(timeout, callback) { - var startTime = jQuery.now(); - return waitFor(function() { - return (jQuery.now() - startTime) >= timeout; - }).done(callback); + return { + done: function(callback) { + doneCallback = callback; + } + }; }; - if(window.console) { - if(!console.time) { - console._timers = {}; - console.time = function(st) { - console.info('start ' + st); - console._timers[st] = new Date(); - }; - console.timeEnd = function(st) { - var time = new Date() - console._timers[st]; - console.info('end ' + st + ': ' + time + ' ms'); - }; - } - } - - window.createTestContainer = function(parent, css) { + window.createTestContainer = function(parentSelector, css) { function dashCase(str) { return str.replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g, function(s, i) { return (i > 0 ? '-' : '') + s.toLowerCase(); }); } - var uniqueName = dashCase(QUnit.config.current.testName), - $container = jQuery('
').attr('id', uniqueName); - css && $container.css(css); - parent && $container.appendTo(parent); - return $container; + const uniqueName = dashCase(QUnit.config.current.testName); + const container = document.createElement('div'); + container.setAttribute('id', uniqueName); + + if(css) { + for(const prop in css) { + if(Object.prototype.hasOwnProperty.call(css, prop)) { + container.style[prop] = css[prop]; + } + } + } + + const parent = document.querySelector(parentSelector); + if(parent) { + parent.appendChild(container); + } else { + throw 'Parent element with "' + parentSelector + '" is not found'; + } + + return container; }; window.currentTest = function() { @@ -149,17 +122,26 @@ }; window.includeThemesLinks = function() { - jQuery('head') - .append('') - .append('') - .append(''); + const head = document.head; + + [ + 'generic.light', + 'ios7.default', + 'material.blue.light' + ].forEach(function(theme) { + const link = document.createElement('link'); + link.setAttribute('rel', 'dx-theme'); + link.setAttribute('data-theme', theme); + link.setAttribute('href', SystemJS.normalizeSync(theme.replace(/./g, '_') + '.css')); + head.appendChild(link); + }); }; }(); (function clearQUnitFixtureByJQuery() { - var isMsEdge = 'CollectGarbage' in window && !('ActiveXObject' in window); + const isMsEdge = 'CollectGarbage' in window && !('ActiveXObject' in window); QUnit.testDone(function(options) { if(!jQuery) { @@ -183,7 +165,7 @@ }); QUnit.timerIgnoringCheckers = (function() { - var noop = function() { }; + const noop = function() { }; return { register: noop, @@ -194,15 +176,15 @@ }; })(); - var createMethodWrapper = function(method, callbacks) { - var originalMethod = method, - beforeCall = callbacks['beforeCall'], - afterCall = callbacks['afterCall'], - info = { - originalMethod: originalMethod - }; + const createMethodWrapper = function(method, callbacks) { + const originalMethod = method; + const beforeCall = callbacks['beforeCall']; + const afterCall = callbacks['afterCall']; + const info = { + originalMethod: originalMethod + }; - var wrapper = function() { + const wrapper = function() { info['context'] = this; info['args'] = Array.prototype.slice.call(arguments); @@ -225,29 +207,29 @@ return wrapper; }; - var getStack = function() { - var stack = ''; + const getStack = function() { + let stack = ''; try { throw Error(''); } catch(ex) { stack = ex.stack; } return stack; }; - var saveTimerInfo = function(logObject, id, info) { + const saveTimerInfo = function(logObject, id, info) { info.stack = getStack(); info.callback = info.callback.toString(); logObject[id] = info; }; - var spyWindowMethods = function(windowObj) { - var log, - logEnabled, - timeouts, - intervals, - animationFrames; + const spyWindowMethods = function(windowObj) { + let log; + let logEnabled; + let timeouts; + let intervals; + let animationFrames; windowObj = windowObj || window; - var methodHooks = { + const methodHooks = { 'setTimeout': { 'beforeCall': function(info) { if(!logEnabled) { @@ -255,7 +237,7 @@ } info.originalCallback = info.args[0]; - var callbackWrapper = info.args[0] = createMethodWrapper(info.originalCallback, { + const callbackWrapper = info.args[0] = createMethodWrapper(info.originalCallback, { afterCall: function() { if(!logEnabled) { return; @@ -315,7 +297,7 @@ } info.originalCallback = info.args[0]; - var callBackWrapper = info.args[0] = createMethodWrapper(info.originalCallback, { + const callBackWrapper = info.args[0] = createMethodWrapper(info.originalCallback, { afterCall: function() { if(!logEnabled) { return; @@ -347,11 +329,12 @@ } }; - for(var name in methodHooks) { + let name; + for(name in methodHooks) { windowObj[name] = createMethodWrapper(windowObj[name], methodHooks[name]); } - var initLog = function() { + const initLog = function() { log = {}; timeouts = log['timeouts'] = {}, intervals = log['intervals'] = {}, @@ -388,42 +371,42 @@ return; } - var suppressLogOnTest = function() { + const suppressLogOnTest = function() { return /Not cleared timers detected/.test(QUnit.config.current.testName); }; - var log = spyWindowMethods(); + const log = spyWindowMethods(); QUnit.timerIgnoringCheckers = (function() { - var checkers = [], - checkersToUnregister = []; + let checkers = []; + let checkersToUnregister = []; - var register = function() { + const register = function() { Array.prototype.push.apply(checkers, arguments); }; - var unregister = function() { + const unregister = function() { Array.prototype.push.apply(checkersToUnregister, arguments); }; - var unregisterSingle = function(checker) { - var index = checkers.indexOf(checker); + const unregisterSingle = function(checker) { + const index = checkers.indexOf(checker); checkers.splice(index, 1); }; - var applyUnregister = function() { + const applyUnregister = function() { checkersToUnregister.forEach(unregisterSingle); checkersToUnregister = []; }; - var clear = function() { + const clear = function() { checkers = []; checkersToUnregister = []; }; - var needSkip = function(timerInfo) { - var skip = false; + const needSkip = function(timerInfo) { + let skip = false; checkers.forEach(function(checker) { if(checker(timerInfo)) { @@ -456,12 +439,12 @@ return; } - var logGlobalFailure = function(details) { - var timerInfo = details.timerInfo, - timeoutString = timerInfo.timeout ? ', timeout: ' + timerInfo.timeout : '', - message = ['Timer type: ', timerInfo.timerType, ', Id: ', timerInfo.timerId, timeoutString, '\nCallback:\n', timerInfo.callback].join(''); + const logGlobalFailure = function(details) { + const timerInfo = details.timerInfo; + const timeoutString = timerInfo.timeout ? ', timeout: ' + timerInfo.timeout : ''; + const message = ['Timer type: ', timerInfo.timerType, ', Id: ', timerInfo.timerId, timeoutString, '\nCallback:\n', timerInfo.callback].join(''); - var testCallback = function() { + const testCallback = function() { QUnit.pushFailure(message, timerInfo.stack || '1 timer'); }; @@ -471,11 +454,11 @@ QUnit.test(details.testName, testCallback); }; - var isThirdPartyLibraryTimer = function(timerInfo) { + const isThirdPartyLibraryTimer = function(timerInfo) { if(!timerInfo || !timerInfo.callback) { return false; } - var callback = String(timerInfo.callback).replace(/\s|"use strict";/g, ''); + const callback = String(timerInfo.callback).replace(/\s|"use strict";/g, ''); if(timerInfo.timerType === 'animationFrames' && [ @@ -505,12 +488,12 @@ log.stop(); ['timeouts', 'intervals', 'animationFrames'].forEach(function(type) { - var currentInfo = log.get()[type]; + const currentInfo = log.get()[type]; if(Object.keys(currentInfo).length) { - var timerId = Object.keys(currentInfo)[0]; + const timerId = Object.keys(currentInfo)[0]; - var normalizedTimerInfo = { + const normalizedTimerInfo = { timerType: type, timerId: timerId, callback: currentInfo[timerId].callback || currentInfo.callback, @@ -542,8 +525,8 @@ (function checkSinonFakeTimers() { QUnit.testStart(function() { - var dateOnTestStart = Date, - after = QUnit.config.current.after; + const dateOnTestStart = Date; + const after = QUnit.config.current.after; QUnit.config.current.after = function() { if(dateOnTestStart !== Date) { diff --git a/testing/tests/DevExpress.viz.charts/chartAxisDrawing.tests.js b/testing/tests/DevExpress.viz.charts/chartAxisDrawing.tests.js index 7de267bd42b0..e2d9386814cc 100644 --- a/testing/tests/DevExpress.viz.charts/chartAxisDrawing.tests.js +++ b/testing/tests/DevExpress.viz.charts/chartAxisDrawing.tests.js @@ -10,14 +10,12 @@ import titleModule from 'viz/core/title'; import rendererModule from 'viz/core/renderers/renderer'; import multiAxesSynchronizer from 'viz/chart_components/multi_axes_synchronizer'; -$('
').appendTo('#qunit-fixture'); - rendererModule.Renderer = sinon.stub(); const environment = { beforeEach: function() { this.renderer = new vizMocks.Renderer(); - this.container = createTestContainer('#test-container', { width: 800, height: 600 }); + this.container = $(createTestContainer('#qunit-fixture', { width: '800px', height: '600px' })); rendererModule.Renderer.onCall(0).returns(this.renderer); rendererModule.Renderer.onCall(1).returns(new vizMocks.Renderer()); rendererModule.Renderer.onCall(2).returns(new vizMocks.Renderer()); @@ -66,7 +64,6 @@ const environment = { }); }, afterEach: function() { - this.container.remove(); this.renderer = null; rendererModule.Renderer.reset(); this.axisStub.restore(); diff --git a/testing/tests/DevExpress.viz.gauges/barGauge.tests.js b/testing/tests/DevExpress.viz.gauges/barGauge.tests.js index 7b36964ffa31..37510c9a38c0 100644 --- a/testing/tests/DevExpress.viz.gauges/barGauge.tests.js +++ b/testing/tests/DevExpress.viz.gauges/barGauge.tests.js @@ -93,7 +93,7 @@ QUnit.begin(function() { const environment = { beforeEach: function() { - this.$container = createTestContainer('#test-container', { width: 400, height: 300 }); + this.$container = $(createTestContainer('#test-container', { width: '400px', height: '300px' })); }, afterEach: function() { this.$container.remove(); diff --git a/testing/tests/DevExpress.viz.gauges/circularGauge.tests.js b/testing/tests/DevExpress.viz.gauges/circularGauge.tests.js index fde49f3a6617..f474b7c6319f 100644 --- a/testing/tests/DevExpress.viz.gauges/circularGauge.tests.js +++ b/testing/tests/DevExpress.viz.gauges/circularGauge.tests.js @@ -123,7 +123,7 @@ var TestPointerElement = TestElement.inherit({ const environment = { beforeEach: function() { this.renderer = new vizMocks.Renderer(); - this.container = createTestContainer('#test-container', { width: 800, height: 600 }); + this.container = $(createTestContainer('#test-container', { width: '800px', height: '600px' })); rendererModule.Renderer.onCall(0).returns(this.renderer); const tooltipRender = new vizMocks.Renderer(); rendererModule.Renderer.onCall(1).returns(tooltipRender); diff --git a/testing/tests/DevExpress.viz.gauges/common.tests.js b/testing/tests/DevExpress.viz.gauges/common.tests.js index 6487ed5a52e4..dc9f0b23cb7f 100644 --- a/testing/tests/DevExpress.viz.gauges/common.tests.js +++ b/testing/tests/DevExpress.viz.gauges/common.tests.js @@ -183,7 +183,7 @@ const environment = { rangeModule.Range.reset(); axisModule.Axis.reset(); this.renderer = new vizMocks.Renderer(); - this.container = createTestContainer('#test-container', { width: 800, height: 600 }); + this.container = $(createTestContainer('#test-container', { width: '800px', height: '600px' })); }, createTestGauge: function(options) { return new dxTestGauge(this.container, $.extend(true, {}, { diff --git a/testing/tests/DevExpress.viz.gauges/linearGauge.tests.js b/testing/tests/DevExpress.viz.gauges/linearGauge.tests.js index 808f79f7d42c..75fcbfa220f1 100644 --- a/testing/tests/DevExpress.viz.gauges/linearGauge.tests.js +++ b/testing/tests/DevExpress.viz.gauges/linearGauge.tests.js @@ -121,7 +121,7 @@ var TestPointerElement = TestElement.inherit({ const environment = { beforeEach: function() { this.renderer = new vizMocks.Renderer(); - this.container = createTestContainer('#test-container', { width: 800, height: 600 }); + this.container = $(createTestContainer('#test-container', { width: '800px', height: '600px' })); rendererModule.Renderer.onCall(0).returns(this.renderer); const tooltipRenderer = new vizMocks.Renderer(); rendererModule.Renderer.onCall(1).returns(tooltipRenderer); diff --git a/testing/tests/DevExpress.viz.rangeSelector/rangeSelectorParts/commons.js b/testing/tests/DevExpress.viz.rangeSelector/rangeSelectorParts/commons.js index d079a1e0c48c..6b90e45cd149 100644 --- a/testing/tests/DevExpress.viz.rangeSelector/rangeSelectorParts/commons.js +++ b/testing/tests/DevExpress.viz.rangeSelector/rangeSelectorParts/commons.js @@ -1,5 +1,6 @@ /* global createTestContainer */ +const $ = require('jquery'); const themeManagerModule = require('viz/core/base_theme_manager'); const rangeViewModule = require('viz/range_selector/range_view'); const slidersControllerModule = require('viz/range_selector/sliders_controller'); @@ -56,7 +57,7 @@ exports.returnValue = returnValue; exports.environment = { beforeEach: function() { - this.$container = createTestContainer('#test-container', { width: 300, height: 150 }); + this.$container = $(createTestContainer('#qunit-fixture', { width: '300px', height: '150px' })); this.StubAxis = StubAxis; this.renderer = new vizMocks.Renderer(); @@ -85,7 +86,6 @@ exports.environment = { }, afterEach: function() { - this.$container.remove(); axisModule.Axis.restore(); }, diff --git a/testing/tests/DevExpress.viz.sparklines/bullet.tests.js b/testing/tests/DevExpress.viz.sparklines/bullet.tests.js index aa17ea5bd23b..dfde8aa1b98f 100644 --- a/testing/tests/DevExpress.viz.sparklines/bullet.tests.js +++ b/testing/tests/DevExpress.viz.sparklines/bullet.tests.js @@ -42,7 +42,7 @@ tooltipModule.Tooltip = sinon.spy(function() { const environment = { beforeEach: function() { - this.$container = createTestContainer('#container'); + this.$container = $(createTestContainer('#container')); this.resetTranslators(); this.tooltip = new StubTooltip(); }, diff --git a/testing/tests/DevExpress.viz.sparklines/bulletTooltip.tests.js b/testing/tests/DevExpress.viz.sparklines/bulletTooltip.tests.js index 43d71102fad1..de66f705a358 100644 --- a/testing/tests/DevExpress.viz.sparklines/bulletTooltip.tests.js +++ b/testing/tests/DevExpress.viz.sparklines/bulletTooltip.tests.js @@ -46,7 +46,7 @@ const environment = { font: {} }); this.renderer = new vizMocks.Renderer(); - this.$container = createTestContainer('#container'); + this.$container = $(createTestContainer('#container')); this.createBullet = function(options) { return this.$container.dxBullet($.extend(true, { tooltip: { diff --git a/testing/tests/DevExpress.viz.sparklines/sparkline.tests.js b/testing/tests/DevExpress.viz.sparklines/sparkline.tests.js index 5d5baada179d..af56cf628ff3 100644 --- a/testing/tests/DevExpress.viz.sparklines/sparkline.tests.js +++ b/testing/tests/DevExpress.viz.sparklines/sparkline.tests.js @@ -51,7 +51,7 @@ QUnit.begin(function() { beforeEach: function() { this.clock = sinon.useFakeTimers(); - this.$container = createTestContainer('#container'); + this.$container = $(createTestContainer('#container')); this.renderer = new vizMocks.Renderer(); this.translator = new FakeTranslator(); this.series = new StubSeries(); diff --git a/testing/tests/DevExpress.viz.sparklines/sparklineTooltip.tests.js b/testing/tests/DevExpress.viz.sparklines/sparklineTooltip.tests.js index 1977298a00f7..046bb564e9ff 100644 --- a/testing/tests/DevExpress.viz.sparklines/sparklineTooltip.tests.js +++ b/testing/tests/DevExpress.viz.sparklines/sparklineTooltip.tests.js @@ -48,7 +48,7 @@ const environment = { font: {} }); - this.$container = createTestContainer('#container'); + this.$container = $(createTestContainer('#container')); this.createSparkline = function(options) { return this.$container.dxSparkline($.extend(true, { tooltip: {