UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

274 lines (225 loc) 7.04 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2007-2008 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Fabian Jakobs (fjakobs) ************************************************************************ */ /** * @use(qx.theme.Classic) */ qx.Class.define("qx.test.ui.LayoutTestCase", { extend: qx.dev.unit.TestCase, type: "abstract", statics: { $$clazz: null, $$args: null }, members: { setUp() { this.getRoot(); }, tearDown() { this.getRoot() .removeAll() .forEach(function (widget) { widget.dispose(); }); var cls = qx.test.ui.LayoutTestCase; if (cls._root) { cls._root.destroy(); cls._root = null; qx.core.Init.getApplication = cls.__oldGetApp; } }, getRoot() { var cls = qx.test.ui.LayoutTestCase; if (cls._root) { return cls._root; } qx.theme.manager.Meta.getInstance().initialize(); cls._root = new qx.ui.root.Application(document); cls.__oldApplication = qx.core.Init.getApplication(); cls.__oldGetApp = qx.core.Init.getApplication; qx.core.Init.getApplication = function () { return { getRoot() { return cls._root; }, close() {}, terminate() {} }; }; return cls._root; }, getRunnerApplication() { return ( qx.test.ui.LayoutTestCase.__oldApplication || qx.core.Init.getApplication() ); }, flush() { qx.ui.core.queue.Manager.flush(); }, assertDestroy(fcn, context, msg) { // call function fcn.call(context); this.flush(); this.flush(); // copy object registry var regCopy = qx.lang.Object.clone(qx.core.ObjectRegistry.getRegistry()); // copy event listener structure var eventMgr = qx.event.Registration.getManager(window); var listeners = eventMgr.getAllListeners(); var listenersCopy = {}; for (var hash in listeners) { listenersCopy[hash] = {}; for (var key in listeners[hash]) { listenersCopy[hash][key] = qx.lang.Array.clone(listeners[hash][key]); } } // call function fcn.call(context); this.flush(); this.flush(); // measure increase in object counts // check object registry var reg = qx.core.ObjectRegistry.getRegistry(); for (key in reg) { var obj = reg[key]; // skip pooled objects + DeferredCall which cleans the event listener blacklist if (obj.$$pooled || obj.$$blackListCleaner) { continue; } this.assertNotUndefined( regCopy[key], msg + ": The object '" + obj.classname + "' has not been disposed!" ); } listeners = eventMgr.getAllListeners(); for (var hash in listeners) { if (!listenersCopy[hash]) { listenersCopy[hash] = {}; } for (key in listeners[hash]) { if (!listenersCopy[hash][key]) { listenersCopy[hash][key] = []; } for (var i = 0; i < listeners[hash][key].length; i++) { if ( listenersCopy[hash][key].indexOf(listeners[hash][key][i]) == -1 ) { this.fail( msg + ": The event listener '" + key + ":" + listeners[hash][key][i] + "'for the object '" + hash + ":" + qx.core.ObjectRegistry.fromHashCode(hash) + "' has not been removed." ); } } } } // check root children length this.assertIdentical( 0, this.getRoot().getChildren().length, msg + ": The root Children array must be empty but found: " + this.getRoot().getChildren().join(", ") ); }, /** * @lint ignoreDeprecated(eval) */ assertWidgetDispose(clazz, args, msg) { this.assertDestroy( function () { var argStr = []; for (var i = 0; i < args.length; i++) { argStr.push("qx.test.ui.LayoutTestCase.$$args" + "[" + i + "]"); } qx.test.ui.LayoutTestCase.$$clazz = clazz; qx.test.ui.LayoutTestCase.$$args = args; var str = "new qx.test.ui.LayoutTestCase.$$clazz" + "(" + argStr.join(", ") + ");"; var widget = eval(str); this.getRoot().add(widget); this.flush(); widget.destroy(); }, this, msg ); }, _getFixedWidget() { var widget = new qx.ui.core.Widget(); widget.set({ width: 200, height: 100, maxWidth: "pref", minWidth: "pref", maxHeight: "pref", minHeight: "pref" }); return widget; }, assertSize(widget, width, height, msg) { this.flush(); var el = widget.getContentElement().getDomElement(); var elHeight = parseInt(el.style.height, 10); var elWidth = parseInt(el.style.width, 10); this.assertEquals(width, elWidth, msg); this.assertEquals(height, elHeight, msg); }, assertPadding(widget, top, right, bottom, left, msg) { this.flush(); this.assertNotNull(widget.getContentElement()); this.assertNotNull(widget.getContentElement().getDomElement()); var content = widget.getContentElement().getDomElement(); var paddingTop = parseInt(qx.bom.element.Style.get(content, "paddingTop"), 10) || 0; var paddingRight = parseInt(qx.bom.element.Style.get(content, "paddingRight"), 10) || 0; var paddingBottom = parseInt(qx.bom.element.Style.get(content, "paddingBottom"), 10) || 0; var paddingLeft = parseInt(qx.bom.element.Style.get(content, "paddingLeft"), 10) || 0; this.assertEquals(top, paddingTop, msg); this.assertEquals(right, paddingRight, msg); this.assertEquals(bottom, paddingBottom, msg); this.assertEquals(left, paddingLeft, msg); }, assertStyle(widget, style, value, msg) { this.flush(); var element = widget.getContentElement().getDomElement(); var computedStyle = qx.bom.element.Style.get(element, style); if (value && style.match(/color/i)) { this.assertCssColor(value, computedStyle, msg); } else { this.assertEquals(value, computedStyle, msg); } }, tapOn(widget) { widget.fireEvent("tap", qx.event.type.Tap, [ {}, widget, widget, false, true ]); } } });