UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

448 lines (362 loc) 12.2 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-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) ************************************************************************ */ qx.Class.define("qx.test.ui.virtual.Axis", { extend: qx.dev.unit.TestCase, members: { setUp() { this.defaultSize = 10; this.count = 1000; this.axis = new qx.ui.virtual.core.Axis(this.defaultSize, this.count); }, tearDown() { this.axis.dispose(); }, assertItem(expectedItemIndex, expectedOffset, cellData, msg) { this.assertEquals( expectedItemIndex, cellData.index, msg + ": invalid item index" ); this.assertEquals( expectedOffset, cellData.offset, msg + ": invalid item offset" ); }, testDefaultItemSize() { this.assertEquals(this.defaultSize, this.axis.getDefaultItemSize()); this.axis.setDefaultItemSize(20); this.assertEquals(20, this.axis.getDefaultItemSize()); }, testItemCount() { this.assertEquals(this.count, this.axis.getItemCount()); this.axis.setItemCount(this.count * 2); this.assertEquals(this.count * 2, this.axis.getItemCount()); }, testItemSize() { var sizes = {}; sizes[100] = 2; sizes[200] = 30; sizes[600] = this.defaultSize; for (var key in sizes) { this.axis.setItemSize(parseInt(key, 10), sizes[key]); } for (var i = 0; i < this.count; i++) { this.assertEquals( sizes[i] || this.defaultSize, this.axis.getItemSize(i) ); } this.axis.setDefaultItemSize(this.defaultSize * 2); for (var i = 0; i < this.count; i++) { this.assertEquals( sizes[i] || this.defaultSize * 2, this.axis.getItemSize(i) ); } }, testItemAtPosition() { this.axis.setItemCount(1000); this.axis.setDefaultItemSize(10); // in the middle this.assertItem(500, 5, this.axis.getItemAtPosition(10 * 500 + 5)); // position at the edge this.assertItem(0, 0, this.axis.getItemAtPosition(0)); this.assertItem(999, 9, this.axis.getItemAtPosition(10 * 1000 - 1)); // position outside of the range this.assertNull(this.axis.getItemAtPosition(-10)); this.assertNull(this.axis.getItemAtPosition(10 * 1000)); this.assertNull(this.axis.getItemAtPosition(10 * 1000 + 100)); // special case: no items in the axis this.axis.setItemCount(0); this.assertNull(this.axis.getItemAtPosition(0)); }, testEmptyAxis() { this.axis.setItemSize(1, 10); this.axis.setItemCount(0); this.assertEquals(0, this.axis.getTotalSize()); }, testGetItemAtPositionCustomSizes() { var d = this.defaultSize; var sizes = {}; sizes[100] = d - 8; sizes[200] = d + 20; sizes[600] = d; for (var key in sizes) { this.axis.setItemSize(parseInt(key, 10), sizes[key]); } // exact start position this.assertItem(0, 0, this.axis.getItemAtPosition(0 * d)); this.assertItem(10, 0, this.axis.getItemAtPosition(10 * d)); this.assertItem(101, 0, this.axis.getItemAtPosition(101 * d - 8)); this.assertItem(201, 0, this.axis.getItemAtPosition(201 * d - 8 + 20)); this.assertItem(601, 0, this.axis.getItemAtPosition(601 * d - 8 + 20)); // in the middle this.assertItem(0, 4, this.axis.getItemAtPosition(0 * d + 4)); this.assertItem(10, 4, this.axis.getItemAtPosition(10 * d + 4)); this.assertItem(101, 4, this.axis.getItemAtPosition(101 * d - 8 + 4)); this.assertItem( 201, 4, this.axis.getItemAtPosition(201 * d - 8 + 20 + 4) ); this.assertItem( 601, 4, this.axis.getItemAtPosition(601 * d - 8 + 20 + 4) ); //before end this.assertItem(0, d - 1, this.axis.getItemAtPosition(0 * d + d - 1)); this.assertItem(10, d - 1, this.axis.getItemAtPosition(10 * d + d - 1)); this.assertItem( 101, d - 1, this.axis.getItemAtPosition(101 * d - 8 + d - 1) ); this.assertItem( 201, d - 1, this.axis.getItemAtPosition(201 * d - 8 + 20 + d - 1) ); this.assertItem( 601, d - 1, this.axis.getItemAtPosition(601 * d - 8 + 20 + d - 1) ); }, ITEM_POS_ITER: 5, ITEM_POS_COUNT: 10000, testGetItemAtPositionStress() { for (var j = 0; j < this.ITEM_POS_ITER; j++) { var total = 0; this.axis.setItemCount(this.ITEM_POS_COUNT); for (var i = 0; i < this.ITEM_POS_COUNT; i++) { if (i == this.ITEM_POS_COUNT - 10) { var pos = total + 20; } var itemSize = 50 + Math.round(Math.random() * 80); total += itemSize; this.axis.setItemSize(i, itemSize); } this.assertItem( this.ITEM_POS_COUNT - 10, 20, this.axis.getItemAtPosition(pos) ); } }, testGetTotalSize() { var d = this.defaultSize; var count = this.count; this.assertEquals(d * count, this.axis.getTotalSize()); var correction = 0; for (var i = 1; i <= 10; i++) { this.axis.setItemSize(i * 10, d + i * 2); correction += i * 2; } this.assertEquals(d * count + correction, this.axis.getTotalSize()); }, TOTAL_SIZE_ITER: 5, // was 50 TOTAL_SIZE_ITEMS: 100, // was 1000 testGetTotalSizeStress() { for (var j = 0; j < this.TOTAL_SIZE_ITER; j++) { var total = 0; this.axis.setItemCount(this.TOTAL_SIZE_ITEMS); for (var i = 0; i < this.TOTAL_SIZE_ITEMS; i++) { var itemSize = 50 + Math.round(Math.random() * 80); total += itemSize; this.axis.setItemSize(i, itemSize); } this.assertEquals(total, this.axis.getTotalSize()); } }, testGetItemSizes() { this.axis.setDefaultItemSize(10); this.assertArrayEquals([10, 10, 10, 10], this.axis.getItemSizes(0, 40)); this.assertArrayEquals([10, 10, 10, 10], this.axis.getItemSizes(20, 40)); this.assertArrayEquals([10, 10, 10, 10], this.axis.getItemSizes(0, 31)); this.axis.setItemSize(1, 5); this.axis.setItemSize(3, 25); this.assertArrayEquals([10, 5, 10, 25], this.axis.getItemSizes(0, 50)); this.assertArrayEquals([10, 5, 10, 25], this.axis.getItemSizes(0, 26)); this.assertArrayEquals([5, 10, 25, 10], this.axis.getItemSizes(1, 41)); // test at the end of the scale this.axis.setDefaultItemSize(10); this.axis.setItemCount(10); this.assertArrayEquals([10, 10], this.axis.getItemSizes(8, 25)); this.assertArrayEquals([10], this.axis.getItemSizes(9, 30)); }, testGetItemPosition() { var d = this.defaultSize; // item in the middle this.assertEquals(d * 20, this.axis.getItemPosition(20)); // item at the edges this.assertEquals(0, this.axis.getItemPosition(0)); this.assertEquals( d * (this.count - 1), this.axis.getItemPosition(this.count - 1) ); // item outside the range this.assertEquals(null, this.axis.getItemPosition(-1)); this.assertEquals(null, this.axis.getItemPosition(this.count)); this.assertEquals(null, this.axis.getItemPosition(this.count + 100)); }, testGetItemPositionCustomSizes() { var d = this.defaultSize; var sizes = {}; sizes[100] = d - 8; sizes[200] = d + 20; sizes[600] = d; for (var key in sizes) { this.axis.setItemSize(parseInt(key, 10), sizes[key]); } this.assertEquals(0 * d, this.axis.getItemPosition(0)); this.assertEquals(10 * d, this.axis.getItemPosition(10)); this.assertEquals(101 * d - 8, this.axis.getItemPosition(101)); this.assertEquals(201 * d - 8 + 20, this.axis.getItemPosition(201)); this.assertEquals(601 * d - 8 + 20, this.axis.getItemPosition(601)); }, testChangeEvents() { var self = this; var listener = function () {}; this.assertEventFired( this.axis, "change", function () { self.axis.setDefaultItemSize(23); }, listener ); this.assertEventNotFired( this.axis, "change", function () { self.axis.setDefaultItemSize(23); }, listener ); this.assertEventFired( this.axis, "change", function () { self.axis.setItemCount(123); }, listener ); this.assertEventNotFired( this.axis, "change", function () { self.axis.setItemCount(123); }, listener ); this.assertEventFired( this.axis, "change", function () { self.axis.setItemSize(10, 66); }, listener ); this.assertEventNotFired( this.axis, "change", function () { self.axis.setItemSize(10, 66); }, listener ); this.assertEventFired( this.axis, "change", function () { self.axis.setItemSize(10, null); }, listener ); this.assertEventNotFired( this.axis, "change", function () { self.axis.setItemSize(11, null); }, listener ); this.assertEventFired( this.axis, "change", function () { self.axis.resetItemSizes(); }, listener ); }, SETUP_ITER: 10, // was 100 testPerformanceSetupBestCase() { //window.top.console.profile("setup (best case)"); var start = new Date(); for (var i = 0; i < this.SETUP_ITER; i++) { this.axis.__ranges = null; this.axis.getItemAtPosition(0); } var end = new Date(); //window.top.console.profileEnd(); // this.warn("setup time (best case): " + ((end - start) / this.SETUP_ITER) + "ms"); }, testPerformanceSetupWorstCase() { // each cell has a custom size for (var i = 0; i < this.count; i++) { this.axis.setItemSize(i, this.defaultSize + (i % 20) + 1); } //window.top.console.profile("setup (worst case)"); var start = new Date(); for (var i = 0; i < this.SETUP_ITER; i++) { this.axis.__ranges = null; this.axis.getItemAtPosition(0); } var end = new Date(); //window.top.console.profileEnd(); // this.warn("setup time (worst case): " + ((end - start) / this.SETUP_ITER) + "ms"); }, FIND_ITER: 100, // was 10000 testPerformanceFindBestCase() { var max = this.axis.getTotalSize(); //window.top.console.profile("find (best case)"); var start = new Date(); for (var i = 0; i < this.FIND_ITER; i++) { this.axis.getItemAtPosition((i * 17) % max); } var end = new Date(); //window.top.console.profileEnd(); // this.warn("find time (best case): " + ((end - start) / this.FIND_ITER) + "ms"); }, testPerformanceFindWorstCase() { // each cell has a custom size for (var i = 0; i < this.count; i++) { this.axis.setItemSize(i, this.defaultSize + (i % 20) + 1); } var max = this.axis.getTotalSize(); //window.top.console.profile("find (worst case)"); var start = new Date(); for (var i = 0; i < this.FIND_ITER; i++) { this.axis.getItemAtPosition((i * 17) % max); } var end = new Date(); //window.top.console.profileEnd(); // this.warn("find time (worst case): " + ((end - start) / this.FIND_ITER) + "ms"); } }, destruct() { this.axis = null; } });