UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

1,332 lines (1,000 loc) 41 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2009 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: * Martin Wittemann (martinwittemann) ************************************************************************ */ /** * @ignore(qx.demo.Kid, qx.demo.Parent) */ qx.Class.define("qx.test.data.controller.List", { extend : qx.test.ui.LayoutTestCase, include : qx.dev.unit.MMock, members : { __list: null, __controller: null, __data: null, __model : null, setUp : function() { // prevent the icon load error with this stub this.stub(qx.io.ImageLoader, "load"); this.__list = new qx.ui.form.List(); }, tearDown : function() { this.__controller ? this.__controller.dispose() : null; this.__model ? this.__model.dispose() : null; for (var i=0; i<this.__list.getChildren().length; i++) { this.__list.getChildren()[i].destroy(); } this.__list.destroy(); this.flush(); this.__controller = null; this.__model = null; this.__data = null; this.base(arguments); // clear the stub this.getSandbox().restore(); }, __setUpString: function(attribute) { this.__data = ["a", "b", "c", "d", "e"]; // create a new array this.__model = new qx.data.Array(this.__data); // create the controller this.__controller = new qx.data.controller.List(this.__model, this.__list); }, testChangeSelectionOnPush : function() { var selectBox = new qx.ui.form.SelectBox(); var model = new qx.data.Array(["a", "b", "c"]); var controller = new qx.data.controller.List(model, selectBox); var change = false; controller.getSelection().addListener("change", function() { change = true; }); model.push("d"); this.wait(function() { this.assertFalse(change, "Change event has been fired."); selectBox.destroy(); model.dispose(); controller.dispose(); }, 200, this); }, testNumberModel : function() { var selectBox = new qx.ui.form.SelectBox(); var model = qx.data.marshal.Json.createModel([1, 0]); var controller = new qx.data.controller.List(model, selectBox); controller.getSelection().push(0); this.assertEquals(1, controller.getSelection().length); this.assertEquals(0, controller.getSelection().getItem(0)); selectBox.destroy(); model.dispose(); controller.dispose(); }, testModelChangeCombobox : function() { var model2 = new qx.data.Array(["A", "B"]); var box = new qx.ui.form.ComboBox(); var controller = new qx.data.controller.List(this.__model, box); // change the model controller.setModel(model2); this.assertEquals("A", box.getChildControl("list").getChildren()[0].getLabel()); this.assertEquals("B", box.getChildControl("list").getChildren()[1].getLabel()); model2.dispose(); box.dispose(); controller.dispose(); }, testStringArray: function() { this.__setUpString(); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } }, testEmptyList: function() { this.__setUpString(); this.__controller.setModel(null); // check that the list is empty this.assertEquals(0, this.__list.getChildren().length); }, testStringElementRemove: function() { this.__setUpString(); // remove the last elements this.__data.shift(); this.__model.shift(); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } // check the length this.assertEquals(this.__data.length, this.__list.getChildren().length, "Wrong length!"); }, testStringElementAdd: function() { this.__setUpString(); // remove the last elements this.__data.unshift("A"); this.__model.unshift("A"); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } // check the length this.assertEquals(this.__data.length, this.__list.getChildren().length, "Wrong length!"); }, testChangeElement: function() { this.__setUpString(); // change one element this.__data[0] = "A"; this.__model.setItem(0, "A"); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } }, testChangeModelSmaller: function() { this.__setUpString(); this.__model.dispose(); // change one element this.__data = ["f", "g", "h", "i"]; this.__model = new qx.data.Array(this.__data); this.__controller.setModel(this.__model); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } // check the length this.assertEquals(this.__data.length, this.__list.getChildren().length, "Wrong length!"); }, testChangeModelBigger: function() { this.__setUpString(); this.__model.dispose(); // change one element this.__data = ["f", "g", "h", "i", "j", "k"]; this.__model = new qx.data.Array(this.__data); this.__controller.setModel(this.__model); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } // check the length this.assertEquals(this.__data.length, this.__list.getChildren().length, "Wrong length!"); }, testChangeTarget: function() { this.__setUpString(); var list = new qx.ui.form.List(); // change the target this.__controller.setTarget(list); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } // check the length of the old list this.assertEquals(0, this.__list.getChildren().length, "Wrong length!"); list.dispose(); }, testReverse: function() { this.__setUpString(); // reverse the datas this.__data.reverse(); this.__model.reverse(); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } }, testBooleanArray: function() { this.__data = [true, false, false]; // create a new array this.__model = new qx.data.Array(this.__data); // create the controller this.__controller = new qx.data.controller.List(this.__model, this.__list); var checkArray = ["true", "false", "false"]; // check the binding for (var i = 0; i < checkArray.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(checkArray[i], label, "Boolean-Binding " + i + " is wrong!"); } }, testNumberArray: function() { this.__data = [10, 20, -1, 50]; // create a new array this.__model = new qx.data.Array(this.__data); // create the controller this.__controller = new qx.data.controller.List(this.__model, this.__list); var checkArray = ["10", "20", "-1", "50"]; // check the binding for (var i = 0; i < checkArray.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(checkArray[i], label, "Boolean-Binding " + i + " is wrong!"); } }, testSelectBox: function() { this.__data = ["10", "20", "-1", "50"]; // create a new array this.__model = new qx.data.Array(this.__data); // create the controller var box = new qx.ui.form.SelectBox(); this.__controller = new qx.data.controller.List(this.__model, box); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = box.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "SelectBox-Binding " + i + " is wrong!"); } box.dispose(); }, testComboBox: function() { this.__data = ["10", "20", "-1", "50"]; // create a new array this.__model = new qx.data.Array(this.__data); // create the controller var box = new qx.ui.form.ComboBox(); this.__controller = new qx.data.controller.List(this.__model, box); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = box.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "ComboBox-Binding " + i + " is wrong!"); } box.dispose(); }, testResetSelectionSingle: function(){ this.__setUpString(); var box = new qx.ui.form.SelectBox(); this.__controller.setTarget(box); var model = new qx.data.Array(["x", "y", "z"]); this.__controller.getSelection().push("b"); // change the model (should reset the selection) this.__controller.setModel(model); // first element should be selected because its a select box this.wait(100, function() { this.assertEquals("x", this.__controller.getSelection().getItem(0)); model.dispose(); box.destroy(); }, this); }, testSelectionSingle: function() { this.__setUpString(); // select the first object this.__list.addToSelection(this.__list.getChildren()[0]); // test the selection this.assertEquals(this.__model.getItem(0), this.__controller.getSelection().getItem(0), "Selection does not work."); // test for the length this.assertEquals(1, this.__controller.getSelection().length, "Selection length is wrong."); // select the second object this.__list.addToSelection(this.__list.getChildren()[1]); // test the selection this.assertEquals(this.__model.getItem(1), this.__controller.getSelection().getItem(0), "Selection does not work."); // test for the length this.assertEquals(1, this.__controller.getSelection().length, "Selection length is wrong."); }, testSelectionSingleRemoveFirst: function() { this.__setUpString(); var model = this.__model; this.__list.setSelectionMode("one"); var selection = this.__controller.getSelection(); this.assertEquals(model.getItem(0), this.__list.getSelection()[0].getModel()); this.assertEventFired(selection, "change", function() { model.removeAt(0); }); }, testSelectionMultiple: function() { this.__setUpString(); // select the second and third object this.__list.setSelectionMode("multi"); this.__list.addToSelection(this.__list.getChildren()[1]); this.__list.addToSelection(this.__list.getChildren()[2]); // test the selection this.assertEquals(this.__model.getItem(1), this.__controller.getSelection().getItem(0), "Selection does not work."); this.assertEquals(this.__model.getItem(2), this.__controller.getSelection().getItem(1), "Selection does not work."); // test for the selection length this.assertEquals(2, this.__controller.getSelection().length, "Selection length is wrong."); }, testSelectionBackSingle: function() { this.__setUpString(); // add the first element to the selection this.__controller.getSelection().push(this.__model.getItem(0)); // test the selection this.assertEquals(this.__model.getItem(0), this.__controller.getSelection().getItem(0), "addToSelection does not work."); }, testSelectionBackMultiple: function() { this.__setUpString(); // select the second and third object this.__list.setSelectionMode("multi"); // add the some elements to the selection this.__controller.getSelection().push(this.__model.getItem(1)); this.__controller.getSelection().push(this.__model.getItem(2)); // test the selection this.assertEquals(this.__model.getItem(1), this.__controller.getSelection().getItem(0), "addToSelection does not work."); this.assertEquals(this.__model.getItem(2), this.__controller.getSelection().getItem(1), "addToSelection does not work."); }, testSelectionArrayChange: function() { this.__setUpString(); // set a new selection array this.__controller.setSelection(new qx.data.Array([this.__model.getItem(0)])); // test the selection this.assertEquals( this.__model.getItem(0), this.__list.getSelection()[0].getLabel(), "Change the selection array does not work." ); this.__controller.getSelection().dispose(); }, testSelectionArrayChangeItem: function() { this.__setUpString(); // set the selection in the array this.__controller.getSelection().push(this.__model.getItem(0)); // test the selection this.assertEquals(this.__model.getItem(0), this.__list.getSelection()[0].getLabel(), "Change the selection array does not work."); }, testSelectionArrayReverse: function() { this.__setUpString(); // set the selection in the array this.__controller.getSelection().push(this.__model.getItem(0)); // test the selection this.assertEquals(this.__model.getItem(0), this.__list.getSelection()[0].getLabel(), "Change the selection array does not work."); // reverse the model this.__model.reverse(); // test the selection (the selection is async in that case) var self = this; this.wait(100, function() { self.assertEquals( self.__model.getItem(self.__model.getLength() - 1), self.__list.getSelection()[0].getLabel(), "Can not handle reverse." ); }); }, testSelectionAfterDelete: function() { this.__setUpString(); // add b to the selection this.__controller.getSelection().push("b"); // remove the first element of the controller 'a' this.__model.shift(); // check if the selected item in the list is "b" this.assertTrue(this.__controller.getSelection().contains("b"), "Selection array wrong!"); // selection updates work with the widget pool and can be async this.wait(100, function() { this.assertEquals("b", this.__list.getSelection()[0].getLabel(), "Remove from selection does not work!"); }, this); }, testSelectionAfterDeleteEmpty: function() { this.__setUpString(); // add c to the selection this.__controller.getSelection().push("c"); // remove the c this.__model.splice(2, 1); // selection updates work with the widget pool and can be async this.wait(100, function() { // check if the selection is empty this.assertEquals(0, this.__controller.getSelection().length, "Remove from selection does not work!"); }, this); }, testResetBug: function() { this.__setUpString(); // create the test label var label = new qx.ui.basic.Label(); this.__controller.bind("selection[0]", label, "value"); // add stuff to the selection this.__controller.getSelection().push("c"); // remove the first element of the controller 'a' this.__model.shift(); this.__model.shift(); // check for the label this.assertEquals("c", label.getValue(), "Label has not the right value."); // remove the selected element this.__model.shift(); // check for null var self = this; this.wait(100, function() { self.assertNull(label.getValue(), "Label does still contain something!"); }, this); }, testDates: function() { this.__data = [new Date(0), new Date(100)]; // create a new array this.__model = new qx.data.Array(this.__data); // create the controller this.__controller = new qx.data.controller.List(this.__model, this.__list); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i].toString(), label, "Date-Binding " + i + " is wrong!"); } }, testConversionLabel: function() { this.__setUpString(); // create the options map with the converter var options = {}; options.converter = function(data) { return data + " Converted"; }; this.__controller.setLabelOptions(options); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i] + " Converted", label, "Binding " + i + " is wrong!"); } }, testOnUpdateLabel: function() { this.__data = ["a", "b", "c", "d", "e"]; // create a new array this.__model = new qx.data.Array(this.__data); // create the options map with the converter var options = {}; var flag = false; options.onUpdate = function() { flag = true; }; // create the controller this.__controller = new qx.data.controller.List(this.__model, this.__list); this.__controller.setLabelOptions(options); // change something to invoke a change of a binding this.__data.pop(); this.__model.pop(); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } // check if the flag is set this.assertTrue(flag, "onUpdate not executed"); }, testSelectBoxSelectionSingle: function() { this.__data = ["10", "20", "-1", "50"]; // create a new array this.__model = new qx.data.Array(this.__data); // create the controller var box = new qx.ui.form.SelectBox(); this.__controller = new qx.data.controller.List(this.__model, box); // add 10 to the selection this.__controller.getSelection().push("10"); // check for the Selection this.assertEquals("10", box.getSelection()[0].getLabel(), "Wrong selection"); box.dispose(); }, testSelectionWithModelChange: function() { this.__setUpString(); // select the first object this.__list.addToSelection(this.__list.getChildren()[0]); // test the selection this.assertEquals(this.__model.getItem(0), this.__controller.getSelection().getItem(0), "Selection does not work."); // change the model this.__controller.setModel(new qx.data.Array(["x", "y", "z"])); // test for an empty selection this.assertEquals(0, this.__controller.getSelection().length, "Selection is not empty."); // select an item this.__controller.getSelection().push("x"); // test for the selection this.assertEquals("x", this.__controller.getSelection().getItem(0), "Selection is wrong."); this.__controller.getModel().dispose(); }, testSelectionWithModelChangeSelectBox: function() { this.__data = ["a", "b", "c", "d", "e"]; // create a new array this.__model = new qx.data.Array(this.__data); var selectBox = new qx.ui.form.SelectBox(); // create the controller this.__controller = new qx.data.controller.List(this.__model, selectBox); // first object is selected (one selection mode) // test the selection this.assertEquals(this.__model.getItem(0), selectBox.getSelection()[0].getModel()); this.assertEquals(this.__model.getItem(0), this.__controller.getSelection().getItem(0), "Selection does not work."); // change the model this.__controller.setModel(new qx.data.Array(["x", "y", "z"])); // select an item this.__controller.getSelection().push("y"); // test for the selection this.assertEquals(1, this.__controller.getSelection().length, "Selection has a wrong length."); this.assertEquals("y", this.__controller.getSelection().getItem(0), "Selection is wrong."); this.__controller.setModel(new qx.data.Array(["1", "2", "3"])); this.__controller.addListener("changeSelection", function() { this.resume(function() { // test for the first selected item (one selection) this.assertEquals(1, this.__controller.getSelection().length, "Selection has a wrong length."); this.assertEquals("1", this.__controller.getSelection().getItem(0), "Selection does not work."); selectBox.dispose(); }, this); }, this); this.wait(); }, testFilterApply: function() { this.__setUpString(); var delegate = {}; delegate.filter = function(data) { return data == "b" || data == "c" || data == "d"; }; this.__controller.setDelegate(delegate); // check the binding for (var i = 0; i < this.__data.length - 2; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i + 1], label, "Binding " + i + " is wrong!"); } }, testFilterChange: function() { this.__setUpString(); var delegate1 = {}; delegate1.filter = function(data) { return data == "b" || data == "c" || data == "d"; }; var delegate2 = {}; delegate2.filter = function(data) { return data == "a" || data == "b" || data == "c"; }; this.__controller.setDelegate(delegate1); this.__controller.setDelegate(delegate2); // check the binding for (var i = 0; i < this.__data.length - 2; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } }, testFilterChangeModel: function() { this.__setUpString(); var delegate = {}; delegate.filter = function(data) { return data == "B" || data == "C" || data == "D"; }; this.__controller.setDelegate(delegate); // check for the right length this.assertEquals(0, this.__list.getChildren().length, "Some list items created."); var model = new qx.data.Array("A", "B", "C", "D", "E"); this.__controller.setModel(model); // check the length this.assertEquals(3, this.__list.getChildren().length, "Wrong number of list items"); // check the labels this.assertEquals("B", this.__list.getChildren()[0].getLabel(), "Binding is wrong!"); this.assertEquals("C", this.__list.getChildren()[1].getLabel(), "Binding is wrong!"); this.assertEquals("D", this.__list.getChildren()[2].getLabel(), "Binding is wrong!"); model.dispose(); }, testFilterReverseModel: function() { this.__setUpString(); var delegate = {}; delegate.filter = function(data) { return data == "a" || data == "b" || data == "c"; }; this.__controller.setDelegate(delegate); // check for the right length this.assertEquals(3, this.__list.getChildren().length, "Some list items created."); // check the labels this.assertEquals("a", this.__list.getChildren()[0].getLabel(), "Binding is wrong!"); this.assertEquals("b", this.__list.getChildren()[1].getLabel(), "Binding is wrong!"); this.assertEquals("c", this.__list.getChildren()[2].getLabel(), "Binding is wrong!"); // reverse the order of the model this.__model.reverse(); // check for the right length this.assertEquals(3, this.__list.getChildren().length, "Some list items created."); // check the labels this.assertEquals("c", this.__list.getChildren()[0].getLabel(), "Binding is wrong!"); this.assertEquals("b", this.__list.getChildren()[1].getLabel(), "Binding is wrong!"); this.assertEquals("a", this.__list.getChildren()[2].getLabel(), "Binding is wrong!"); }, testFilterRemove: function() { this.__setUpString(); var delegate = {}; delegate.filter = function(data) { return data == "a" || data == "b" || data == "c"; }; this.__controller.setDelegate(delegate); // check for the right length this.assertEquals(3, this.__list.getChildren().length, "Some list items created."); // check the labels this.assertEquals("a", this.__list.getChildren()[0].getLabel(), "Binding is wrong!"); this.assertEquals("b", this.__list.getChildren()[1].getLabel(), "Binding is wrong!"); this.assertEquals("c", this.__list.getChildren()[2].getLabel(), "Binding is wrong!"); // remove the filter this.__controller.setDelegate(null); // check for the right length this.assertEquals(5, this.__list.getChildren().length, "Some list items created."); // check the labels this.assertEquals("a", this.__list.getChildren()[0].getLabel(), "Binding is wrong!"); this.assertEquals("b", this.__list.getChildren()[1].getLabel(), "Binding is wrong!"); this.assertEquals("c", this.__list.getChildren()[2].getLabel(), "Binding is wrong!"); this.assertEquals("d", this.__list.getChildren()[3].getLabel(), "Binding is wrong!"); this.assertEquals("e", this.__list.getChildren()[4].getLabel(), "Binding is wrong!"); }, testFilterChangeTarget: function() { this.__setUpString(); var list = new qx.ui.form.List(); var delegate = {}; delegate.filter = function(data) { return data == "b" || data == "d"; }; this.__controller.setDelegate(delegate); // check the length of the first list this.assertEquals(2, this.__list.getChildren().length, "Wrong number of list items"); // change the target this.__controller.setTarget(null); // check if everything is cleaned up this.assertEquals(0, this.__list.getChildren().length, "Wrong number of list items"); // set the new target this.__controller.setTarget(list); // check the new target this.assertEquals(2, list.getChildren().length, "Wrong number of list items"); this.assertEquals("b", list.getChildren()[0].getLabel(), "Binding is wrong!"); this.assertEquals("d", list.getChildren()[1].getLabel(), "Binding is wrong!"); this.__controller.dispose(); list.dispose(); }, testFilterWithSelection: function() { this.__setUpString(); var delegate = {}; delegate.filter = function(data) { return data == "a" || data == "e"; }; this.__controller.setDelegate(delegate); // select the first object this.__list.addToSelection(this.__list.getChildren()[0]); // test the selection this.assertEquals(this.__model.getItem(0), this.__controller.getSelection().getItem(0), "Selection does not work."); // test for the length this.assertEquals(1, this.__controller.getSelection().length, "Selection length is wrong."); // select the second object this.__list.addToSelection(this.__list.getChildren()[1]); // test the selection this.assertEquals(this.__model.getItem(4), this.__controller.getSelection().getItem(0), "Selection does not work."); // test for the length this.assertEquals(1, this.__controller.getSelection().length, "Selection length is wrong."); }, testFilterAfterSelection: function() { this.__setUpString(); // select the first object this.__list.addToSelection(this.__list.getChildren()[1]); // apply the filter var delegate = {}; delegate.filter = function(data) { return data == "b" || data == "c" || data == "d"; }; this.__controller.setDelegate(delegate); this.assertEquals("b", this.__controller.getSelection().getItem(0), "Selection does not work."); this.assertEquals("b", this.__list.getSelection()[0].getLabel(), "Selection does not work."); }, testDelegateLate: function() { this.__setUpString(); // create the delegate var delegate = {}; delegate.configureItem = function(item) { item.setRich(true); }; this.__controller.setDelegate(delegate); // check the binding for (var i = 0; i < this.__data.length; i++) { var item = this.__list.getChildren()[i]; this.assertTrue(item.getRich(), "Delegate " + i + " is wrong!"); } }, testDelegateFirst: function() { this.__data = ["a", "b", "c", "d", "e"]; // create a new array this.__model = new qx.data.Array(this.__data); // create the controller this.__controller = new qx.data.controller.List(); // create the delegate var delegate = {}; delegate.configureItem = function(item) { item.setRich(true); }; this.__controller.setDelegate(delegate); this.__controller.setTarget(this.__list); this.__controller.setModel(this.__model); // check the binding for (var i = 0; i < this.__data.length; i++) { var item = this.__list.getChildren()[i]; this.assertTrue(item.getRich(), "Delegate " + i + " is wrong!"); } }, testDelegateBindItem: function() { this.__data = [true, true, false, true, false]; // create a new array this.__model = new qx.data.Array(this.__data); this.__controller = new qx.data.controller.List(); var delegate = {}; delegate.createItem = function() { return new qx.ui.form.CheckBox(); }; delegate.bindItem = function(controller, item, id) { controller.bindProperty(null, "enabled", null, item, id); }; this.__controller.setDelegate(delegate); this.__controller.setTarget(this.__list); this.__controller.setModel(this.__model); // check the binding // check the binding for (var i = 0; i < this.__data.length; i++) { this.assertEquals("qx.ui.form.CheckBox", this.__list.getChildren()[i].classname); var label = this.__list.getChildren()[i].getEnabled(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } }, testDelegateBindItemLate: function() { this.__data = [true, true, false, true, false]; // create a new array this.__model = new qx.data.Array(this.__data); this.__controller = new qx.data.controller.List(); this.__controller.setTarget(this.__list); this.__controller.setModel(this.__model); var delegate = {}; delegate.createItem = function() { return new qx.ui.form.CheckBox(); }; delegate.bindItem = function(controller, item, id) { controller.bindProperty(null, "enabled", null, item, id); }; this.__controller.setDelegate(delegate); // check the binding for (var i = 0; i < this.__data.length; i++) { this.assertEquals("qx.ui.form.CheckBox", this.__list.getChildren()[i].classname); var label = this.__list.getChildren()[i].getEnabled(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } }, testDelegateBindDefaultProperties : function() { this.__setUpString(); this.__controller.setModel(null); var delegate = {}; delegate.bindItem = function(controller, item, id) { controller.bindDefaultProperties(item, id); }; this.__controller.setDelegate(delegate); this.__controller.setModel(this.__model); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(this.__data[i], label, "Binding " + i + " is wrong!"); } }, testDelegateBindDefaultPropertiesLate : function() { this.__setUpString(); var delegate = {}; delegate.bindItem = function(controller, item, id) { controller.bindDefaultProperties(item, id); }; this.__controller.setDelegate(delegate); // check the binding for (var i = 0; i < this.__data.length; i++) { this.__model.setItem(i, i + ""); var label = this.__list.getChildren()[i].getLabel(); this.assertEquals(i + "", label, "Binding " + i + " is wrong!"); } }, testSelectionSequence: function() { // "a", "b", "c", "d", "e" this.__setUpString(); this.__list.setSelectionMode("multi"); var selList = new qx.ui.form.List(); var selController = new qx.data.controller.List(null, selList); // add the last two to the selection of the first list this.__list.addToSelection(this.__list.getChildren()[4]); this.__list.addToSelection(this.__list.getChildren()[3]); // special hack for chrome because his selection order is different selController.setModel(this.__controller.getSelection()); var labels = []; for (var i = 0; i < selList.getChildren().length; i++) { labels.push(selList.getChildren()[i].getLabel()); }; // check if the second list is filled right this.assertNotEquals(-1, labels.indexOf("e"), "e is not in the selection list."); this.assertNotEquals(-1, labels.indexOf("d"), "d is not in the selection list."); selList.addToSelection(selList.getChildren()[1]); this.assertEquals(selList.getChildren()[1].getLabel(), selController.getSelection().getItem(0), "d not selected in the second list."); // remove the last element of the first list this.__model.pop(); this.wait(100, function() { // is d still in the list? this.assertEquals("d", selList.getChildren()[0].getLabel(), "d is not in the selection list anymore."); // get rid of that old stuff this.flush(); selList.dispose(); selController.dispose(); }, this); }, testGetVisibleModels : function() { this.__setUpString(); var delegate = {}; delegate.filter = function(data) { return data == "b" || data == "c" || data == "d"; }; this.__controller.setDelegate(delegate); var visibleModels = this.__controller.getVisibleModels(); this.assertEquals(visibleModels.classname, "qx.data.Array"); this.assertEquals(3, visibleModels.getLength()); this.assertEquals("b", visibleModels.getItem(0)); this.assertEquals("c", visibleModels.getItem(1)); this.assertEquals("d", visibleModels.getItem(2)); visibleModels.dispose(); }, testBindIconWithStringArray : function() { this.__setUpString(); this.__controller.setIconPath(""); // check the binding for (var i = 0; i < this.__data.length; i++) { var icon = this.__list.getChildren()[i].getIcon(); this.assertEquals(this.__data[i], icon, "Binding " + i + " is wrong!"); } }, testScrollBySelection : function() { this.__setUpString(); // set a smal hight (list has to scroll) this.__list.setHeight(40); this.getRoot().add(this.__list); var selectables = this.__list.getSelectables(); // select the first item this.__list.setSelection([selectables[0]]); // scroll a bit down (scrollY is 40) this.__list.scrollByY(40); // select the current visible item this.__list.addToSelection(selectables[2]); // check that it has not been scrolled this.assertEquals(40, this.__list.getScrollY()); }, testScrollBySelectionMulti : function() { this.__setUpString(); // set a smal hight (list has to scroll) this.__list.setHeight(40); this.__list.setSelectionMode("multi"); this.getRoot().add(this.__list); var selectables = this.__list.getSelectables(); // select the first item this.__list.setSelection([selectables[0]]); // scroll a bit down (scrollY is 40) this.__list.scrollByY(40); // select the current visible item this.__list.addToSelection(selectables[2]); // check that it has not been scrolled this.assertEquals(40, this.__list.getScrollY()); }, testBug1947: function() { qx.Class.define("qx.demo.Kid", { extend : qx.core.Object, properties : { name : { check : "String", event : "changeName", init : null } } }); var kid = new qx.demo.Kid(); qx.Class.define("qx.demo.Parent", { extend : qx.core.Object, construct : function() { this.base(arguments); this.setKid(kid); }, properties : { name : { check : "String", event : "changeName", init : null }, kid : { check : "qx.demo.Kid", event : "changeKid" } } }); var parentA = new qx.demo.Parent(); parentA.setName("parentA"); parentA.getKid().setName("kidA"); var parentB = new qx.demo.Parent(); parentB.setName("parentB"); parentB.getKid().setName("kidB"); var parents = new qx.data.Array(); parents.push(parentA); parents.push(parentB); var list = new qx.ui.form.List(); var ctrl = new qx.data.controller.List(parents, list, "name"); var label = new qx.ui.basic.Label(); label.setDecorator("main"); ctrl.bind("selection[0].Kid.Name", label, "value"); ctrl.getSelection().push(parentA); parentA.dispose(); parentB.dispose(); kid.dispose(); list.dispose(); ctrl.dispose(); label.dispose(); parents.dispose(); }, testBug1988: function() { qx.Class.define("qx.demo.Kid", { extend : qx.core.Object, properties : { name : { check : "String", event : "changeName", init : null, nullable : true } } }); //var kid = new qx.demo.Kid(); qx.Class.define("qx.demo.Parent", { extend : qx.core.Object, construct : function() { this.base(arguments); this.setKid(new qx.demo.Kid()); }, properties : { name : { check : "String", event : "changeName", init : null }, kid : { check : "qx.demo.Kid", event : "changeKid" } } }); var parentA = new qx.demo.Parent(); parentA.setName("parentA"); parentA.getKid().setName("kidA"); var parentB = new qx.demo.Parent(); parentB.setName("parentB"); //parentB.getKid().setName("kidB"); var parents = new qx.data.Array(); parents.push(parentA); parents.push(parentB); var list = new qx.ui.form.List(); var ctrl = new qx.data.controller.List(parents, list, "name"); var label = new qx.ui.basic.Label(); ctrl.bind("selection[0].kid.name", label, "value"); // select the first child of the list list.addToSelection(list.getChildren()[0]); // check the label this.assertEquals("kidA", label.getValue(), "Wrong name in the label."); // select the second label list.addToSelection(list.getChildren()[1]); this.assertNull(label.getValue(), "Label has not been reseted."); parentA.getKid().dispose(); parentA.dispose(); parentB.getKid().dispose(); parentB.dispose(); list.dispose(); ctrl.dispose(); label.dispose(); parents.dispose(); }, testSpliceAll : function() { this.__setUpString(); this.__model.splice(0, 5, "A", "B", "C", "D", "E"); this.assertEquals("E", this.__list.getChildren()[4].getLabel()); } } });