UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

664 lines (565 loc) 17 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.test.ListWithObject, qx.demo.Parent, qx.demo.Kid) */ qx.Class.define("qx.test.data.controller.ListWithObjects", { extend: qx.test.ui.LayoutTestCase, construct() { super(); // define a test class qx.Class.define("qx.test.ListWithObject", { extend: qx.core.Object, properties: { name: { check: "String", event: "changeName" }, icon: { check: "String", init: "Juhu", event: "changeIcon" } } }); }, members: { __list: null, __controller: null, __data: null, __model: null, setUp() { this.__list = new qx.ui.form.List(); // create the model this.__data = []; for (var i = 0; i < 5; i++) { var obj = new qx.test.ListWithObject(); obj.setName("name" + i); obj.setIcon("icon" + i); this.__data.push(obj); } // create a new array this.__model = new qx.data.Array(this.__data); }, tearDown() { this.flush(); this.__controller.dispose(); this.__controller = null; this.__model.setAutoDisposeItems(true); this.__model.dispose(); this.__model = null; this.__data = null; this.__list.dispose(); }, testRead() { // create the controller this.__controller = new qx.data.controller.List( this.__model, this.__list, "name" ); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals( this.__data[i].getName(), label, "Binding " + i + " is wrong!" ); } }, testChangeLablePath() { // create the controller this.__controller = new qx.data.controller.List( this.__model, this.__list, "name" ); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals( this.__data[i].getName(), label, "Binding " + i + " is wrong!" ); } this.__controller.setLabelPath("icon"); // check the binding again for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals( this.__data[i].getIcon(), label, "Binding " + i + " is wrong!" ); } }, testSelection() { // create the controller this.__controller = new qx.data.controller.List( this.__model, this.__list, "name" ); // 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." ); }, testSelectionBackMultiple() { // create the controller this.__controller = new qx.data.controller.List( this.__model, this.__list, "name" ); // 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." ); }, testChangeModelSmaller() { // create the controller this.__controller = new qx.data.controller.List( this.__model, this.__list, "name" ); // create the model this.__data = []; for (var i = 0; i < 2; i++) { var obj = new qx.test.ListWithObject(); obj.setName("name"); obj.setIcon("icon"); this.__data.push(obj); } // create a new array this.__model.setAutoDisposeItems(true); this.__model.dispose(); 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].getName(), label, "Binding " + i + " is wrong!" ); } // check the length this.assertEquals( this.__data.length, this.__list.getChildren().length, "Wrong length!" ); }, testIcon() { // create the controller this.__controller = new qx.data.controller.List( this.__model, this.__list, "name" ); this.__controller.setIconPath("icon"); // check the label binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals( this.__data[i].getName(), label, "Binding " + i + " is wrong!" ); } // check the icon binding for (var i = 0; i < this.__data.length; i++) { var icon = this.__list.getChildren()[i].getIcon(); this.assertEquals( this.__data[i].getIcon(), icon, "Binding " + i + " is wrong!" ); } }, testChangeIconPath() { // create the controller this.__controller = new qx.data.controller.List( this.__model, this.__list, "name" ); this.__controller.setIconPath("icon"); // check the binding for (var i = 0; i < this.__data.length; i++) { var icon = this.__list.getChildren()[i].getIcon(); this.assertEquals( this.__data[i].getIcon(), icon, "Binding " + i + " is wrong!" ); } this.__controller.setIconPath("name"); // check the binding again for (var i = 0; i < this.__data.length; i++) { var icon = this.__list.getChildren()[i].getIcon(); this.assertEquals( this.__data[i].getName(), icon, "Binding " + i + " is wrong!" ); } }, testConversionLabelAndIcon() { // create the label options var labelOptions = { converter(value) { return "Dr. " + value; } }; // create the icon options var iconOptions = { converter(value) { return value + ".png"; } }; // create the controller this.__controller = new qx.data.controller.List( this.__model, this.__list, "name" ); this.__controller.setIconPath("icon"); this.__controller.setLabelOptions(labelOptions); this.__controller.setIconOptions(iconOptions); // check the label binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals( "Dr. " + this.__data[i].getName(), label, "Binding " + i + " is wrong!" ); } // check the icon binding for (var i = 0; i < this.__data.length; i++) { var icon = this.__list.getChildren()[i].getIcon(); this.assertEquals( this.__data[i].getIcon() + ".png", icon, "Binding " + i + " is wrong!" ); } }, testSetModelLate() { // create the controller this.__controller = new qx.data.controller.List( null, this.__list, "name" ); 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].getName(), label, "Binding " + i + " is wrong!" ); } }, testSetTargetLate() { // create the controller this.__controller = new qx.data.controller.List( this.__model, null, "name" ); this.__controller.setTarget(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].getName(), label, "Binding " + i + " is wrong!" ); } }, testFilter() { // create the controller this.__controller = new qx.data.controller.List( this.__model, this.__list, "name" ); this.__controller.setIconPath("icon"); var delegate = {}; delegate.filter = function (data) { return data.getName() == "name2" ? true : false; }; // set the filter this.__controller.setDelegate(delegate); // check for the length this.assertEquals( 1, this.__list.getChildren().length, "Too much list items." ); // check the label binding var label = this.__list.getChildren()[0].getLabel(); this.assertEquals("name2", label, "Label binding is wrong!"); // check the icon binding var icon = this.__list.getChildren()[0].getIcon(); this.assertEquals("icon2", icon, "Icon binding is wrong!"); }, testOnUpdateLabel() { // 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, "name" ); this.__controller.setLabelOptions(options); // change something to invoke a change of a binding this.__data.pop().dispose(); this.__model.pop().dispose(); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals( this.__data[i].getName(), label, "Binding " + i + " is wrong!" ); } // check if the flag is set this.assertTrue(flag, "onUpdate not executed"); }, // [BUG #2088] testDeepSelection() { qx.Class.define("qx.demo.Kid", { extend: qx.core.Object, properties: { name: { check: "String", event: "changeName", init: null } } }); qx.Class.define("qx.demo.Parent", { extend: qx.core.Object, construct() { super(); 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 parentC = new qx.demo.Parent(); parentC.setName("parentC"); parentC.getKid().setName("kidC"); var parents = new qx.data.Array(); parents.push(parentA); parents.push(parentB); parents.push(parentC); this.__controller = new qx.data.controller.List( parents, this.__list, "name" ); this.assertEquals( parentC.getName(), this.__list.getChildren()[2].getModel().getName(), "Wrong model stored before the splice." ); var temp = parents.splice(parents.indexOf(parentB), 1); temp.getItem(0).getKid().dispose(); temp.setAutoDisposeItems(true); temp.dispose(); this.assertEquals( "parentC", this.__list.getChildren()[1].getLabel(), "Wrong name of the parent." ); this.assertEquals( parentC, this.__list.getChildren()[1].getModel(), "Wrong model stored after the splice." ); // clean up for (var i = 0; i < parents.length; i++) { parents.getItem(i).getKid().dispose(); } parents.setAutoDisposeItems(true); parents.dispose(); }, testModelProperty() { // create the controller this.__controller = new qx.data.controller.List( null, this.__list, "name" ); // filter only the first item var delegate = {}; delegate.filter = function (data) { return data.getName() == "name0" || data.getName() == "name2" ? false : true; }; delegate.bindItem = function (c, item, index) { c.bindProperty("", "model", null, item, index); }; // set the filter this.__controller.setDelegate(delegate); this.__controller.setModel(this.__model); this.assertEquals(3, this.__list.getChildren().length); // check the binding this.assertEquals( this.__model.getItem(1), this.__list.getChildren()[0].getModel() ); this.assertEquals( this.__model.getItem(3), this.__list.getChildren()[1].getModel() ); this.assertEquals( this.__model.getItem(4), this.__list.getChildren()[2].getModel() ); // add another item var item = new qx.test.ListWithObject().set({ name: "name5", icon: "icon5" }); this.__model.push(item); this.assertEquals( this.__model.getItem(5), this.__list.getChildren()[3].getModel() ); item.dispose(); }, testModelPropertyBinding() { // create the controller this.__controller = new qx.data.controller.List( null, this.__list, "name" ); // filter only the first item var delegate = {}; delegate.bindItem = function (c, item, index) { c.bindProperty("icon", "model", null, item, index); }; // set the filter this.__controller.setDelegate(delegate); this.__controller.setModel(this.__model); // test the right set model properties for (var i = 0; i < this.__list.getChildren().length; i++) { var child = this.__list.getChildren()[i]; this.assertEquals("icon" + i, child.getModel()); } // test selection this.__controller.getSelection().push("icon1"); this.assertEquals("icon1", this.__list.getSelection()[0].getModel()); }, testModelInConverter() { // create the controller this.__controller = new qx.data.controller.List( this.__model, this.__list, "name" ); this.__controller.setLabelOptions({ converter(value, model) { return model.getIcon(); } }); // add a new object after the options are set var obj = new qx.test.ListWithObject(); obj.setName("namex"); obj.setIcon("iconx"); this.__model.push(obj); // check the binding for (var i = 0; i < this.__data.length; i++) { var label = this.__list.getChildren()[i].getLabel(); this.assertEquals( this.__data[i].getIcon(), label, "Binding " + i + " is wrong!" ); } var label = this.__list.getChildren()[this.__data.length].getLabel(); this.assertEquals("iconx", label, "New binding is wrong!"); } } });