UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

1,946 lines (1,629 loc) 47.9 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.MyTreeNode) * @ignore(qx.test.TreeEndNode) * @ignore(qx.test.TreeNode) */ qx.Class.define("qx.test.data.controller.Tree", { extend: qx.dev.unit.TestCase, include: qx.dev.unit.MMock, construct() { super(); // define a test class qx.Class.define("qx.test.TreeNode", { extend: qx.core.Object, construct() { super(); this.setChildren(new qx.data.Array()); this.setAltChildren(new qx.data.Array()); }, properties: { children: { check: "qx.data.Array", event: "changeChild", nullable: true }, altChildren: { check: "qx.data.Array", event: "changeChild", nullable: true }, name: { check: "String", init: "root", event: "changeName" }, name2: { check: "String", init: "root2", event: "changeName" }, icon: { check: "String", event: "changeIcon", nullable: true }, icon2: { check: "String", event: "changeIcon2", nullable: true }, color: { check: "String", event: "changeColor", init: "green", nullable: true } }, destruct() { if (this.getChildren()) { this.getChildren().setAutoDisposeItems(true); this.getChildren().dispose(); } if (this.getAltChildren()) { this.getAltChildren().setAutoDisposeItems(true); this.getAltChildren().dispose(); } } }); }, members: { __tree: null, __model: null, __controller: null, __a: null, __b: null, __c: null, setUp() { // prevent the icon load error with this stub this.stub(qx.io.ImageLoader, "load"); this.__tree = new qx.ui.tree.Tree(); // create a model // this.__model // / | \ // this.__a this.__b this.__c this.__model = new qx.test.TreeNode(); this.__a = new qx.test.TreeNode(); this.__a.set({ name: "a", name2: "a2", icon: "icon a", icon2: "icon a2", color: "red" }); this.__b = new qx.test.TreeNode(); this.__b.set({ name: "b", name2: "b2", icon: "icon b", icon2: "icon b2", color: "blue" }); this.__c = new qx.test.TreeNode(); this.__c.set({ name: "c", name2: "c2", icon: "icon c", icon2: "icon c2", color: "white" }); this.__model.getChildren().push(this.__a, this.__b, this.__c); this.__model.getAltChildren().push(this.__c, this.__b, this.__a); // create the controller this.__controller = new qx.data.controller.Tree( this.__model, this.__tree, "children", "name" ); this.__controller.setIconPath("icon"); }, tearDown() { this.__controller.dispose(); this.__model.dispose(); this.__tree.dispose(); // clear the stub this.getSandbox().restore(); }, testRemoveBindingsRecursive() { // reform the model tree this.__model.getChildren().remove(this.__c); this.__a.getChildren().push(this.__c); var cFolder = this.__tree.getRoot().getChildren()[0].getChildren()[0]; this.assertNotNull(cFolder, "Third node does not exist"); this.assertEquals("c", cFolder.getLabel()); // remove the model node this.__a.getChildren().remove(this.__c); // check if its disposed and the bindings have been removed this.__c.setName("affe"); this.assertEquals("c", cFolder.getLabel()); // destroy is async --> wait for it! this.wait( 100, function () { this.assertTrue(cFolder.isDisposed()); }, this ); }, testModelChange() { // set model to null this.__controller.setModel(null); // set the same model again (forces the tree to redraw) this.__controller.setModel(this.__model); var d = new qx.test.TreeNode(); d.setName("d"); var model = this.__model; // add the new model this.wait(100, function () { model.getChildren().push(d); }); // d will be disposed by the model }, testFolderCreation() { // Test if the tree nodes exist this.assertNotNull(this.__tree.getRoot(), "Root node does not exist"); this.assertNotNull( this.__tree.getRoot().getChildren()[0], "First node does not exist" ); this.assertNotNull( this.__tree.getRoot().getChildren()[1], "Second node does not exist" ); this.assertNotNull( this.__tree.getRoot().getChildren()[2], "Third node does not exist" ); }, testFolderLabelInitial() { // check the initial Labels this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); }, testFolderLabelChangeName() { // change the names this.__model.setName("ROOT"); this.__a.setName("A"); this.__b.setName("B"); this.__c.setName("C"); // check the initial Labels this.assertEquals( "ROOT", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "A", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "B", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "C", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); }, testFolderLabelPropertyChange() { // change the label path this.__controller.setLabelPath("name2"); // check the initial Labels this.assertEquals( "root2", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a2", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b2", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c2", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); }, testChildPush() { var d = new qx.test.TreeNode(); d.setName("d"); var children = this.__model.getChildren(); children.push(d); // Test if the tree nodes exist this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); this.assertEquals( "d", this.__tree.getRoot().getChildren()[3].getLabel(), "New node has a wrong name" ); }, testChildPop() { var children = this.__model.getChildren(); children.pop(); this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertUndefined( this.__tree.getRoot().getChildren()[2], "There is still a third node!" ); }, testChildShift() { var children = this.__model.getChildren(); children.shift(); this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertUndefined( this.__tree.getRoot().getChildren()[2], "There is still a third node!" ); }, testChildUnshift() { var d = new qx.test.TreeNode(); d.setName("d"); var children = this.__model.getChildren(); children.unshift(d); // Test if the tree nodes exist this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "d", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[3].getLabel(), "Fourth node has a wrong name" ); }, testTreeDeep() { // remove all children this.__model.getChildren().pop(); this.__model.getChildren().pop(); this.__model.getChildren().pop(); // create a straight tree // this.__model // \ // this.__a // \ // this.__b // \ // this.__c this.__model.getChildren().push(this.__a); this.__a.getChildren().push(this.__b); this.__b.getChildren().push(this.__c); // test for the model this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[0].getChildren()[0].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree .getRoot() .getChildren()[0] .getChildren()[0] .getChildren()[0] .getLabel(), "Third node has a wrong name" ); }, testBig() { // build up the model instances var aa = new qx.test.TreeNode(); aa.setName("aa"); var bb = new qx.test.TreeNode(); bb.setName("bb"); var cc = new qx.test.TreeNode(); cc.setName("cc"); var bbb = new qx.test.TreeNode(); bbb.setName("bbb"); var AA = new qx.test.TreeNode(); AA.setName("AA"); // tie the model together // this.__model // / | \ // this.__a this.__b this.__c // / \ | | // aa AA bb cc // | // bbb bb.getChildren().push(bbb); this.__b.getChildren().push(bb); this.__a.getChildren().push(aa, AA); this.__c.getChildren().push(cc); // check the initial Labels // root layer this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); // first layer this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "a node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "b node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "c node has a wrong name" ); // second layer this.assertEquals( "aa", this.__tree.getRoot().getChildren()[0].getChildren()[0].getLabel(), "aa node has a wrong name" ); this.assertEquals( "AA", this.__tree.getRoot().getChildren()[0].getChildren()[1].getLabel(), "AA node has a wrong name" ); this.assertEquals( "bb", this.__tree.getRoot().getChildren()[1].getChildren()[0].getLabel(), "bb node has a wrong name" ); this.assertEquals( "cc", this.__tree.getRoot().getChildren()[2].getChildren()[0].getLabel(), "cc node has a wrong name" ); // third layer this.assertEquals( "bbb", this.__tree .getRoot() .getChildren()[1] .getChildren()[0] .getChildren()[0] .getLabel(), "bbb node has a wrong name" ); }, testChildReverse() { // reverse the children this.__model.getChildren().reverse(); // check the labels this.assertEquals( "a", this.__tree.getRoot().getChildren()[2].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[0].getLabel(), "Third node has a wrong name" ); }, testChangeChildPath() { // change the child path this.__controller.setChildPath("altChildren"); // check the labels this.assertEquals( "c", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); }, testChangeTarget() { // create a new tree var tree = new qx.ui.tree.Tree(); // set the new tree as target this.__controller.setTarget(tree); // check the new folders this.assertEquals( "a", tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); // check if the old tree is empty this.assertNull(this.__tree.getRoot(), "Former tree is not empty."); tree.dispose(); }, testChangeModel() { // create a new model // this.__model // / \ // this.__a this.__b var model = new qx.test.TreeNode(); var a = new qx.test.TreeNode(); a.setName("A"); var b = new qx.test.TreeNode(); b.setName("B"); model.getChildren().push(a, b); // set the new model this.__controller.setModel(model); // check the folders this.assertEquals( "A", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "B", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.__controller.setModel(null); model.dispose(); }, testIconPath() { this.assertEquals( null, this.__tree.getRoot().getIcon(), "Root node has a wrong icon" ); this.assertEquals( "icon a", this.__tree.getRoot().getChildren()[0].getIcon(), "First node has a wrong icon" ); this.assertEquals( "icon b", this.__tree.getRoot().getChildren()[1].getIcon(), "Second node has a wrong icon" ); this.assertEquals( "icon c", this.__tree.getRoot().getChildren()[2].getIcon(), "Third node has a wrong icon" ); }, testIconPathChange() { // change the icon path this.__controller.setIconPath("icon2"); // test the binding this.assertEquals( null, this.__tree.getRoot().getIcon(), "Root node has a wrong icon" ); this.assertEquals( "icon a2", this.__tree.getRoot().getChildren()[0].getIcon(), "First node has a wrong icon" ); this.assertEquals( "icon b2", this.__tree.getRoot().getChildren()[1].getIcon(), "Second node has a wrong icon" ); this.assertEquals( "icon c2", this.__tree.getRoot().getChildren()[2].getIcon(), "Third node has a wrong icon" ); }, testIconChange() { // change the icon values this.__model.setIcon("AFFE"); this.__a.setIcon("ICON A"); this.__b.setIcon("ICON B"); this.__c.setIcon("ICON C"); // test the new icon values this.assertEquals( "AFFE", this.__tree.getRoot().getIcon(), "Root node has a wrong icon" ); this.assertEquals( "ICON A", this.__tree.getRoot().getChildren()[0].getIcon(), "First node has a wrong icon" ); this.assertEquals( "ICON B", this.__tree.getRoot().getChildren()[1].getIcon(), "Second node has a wrong icon" ); this.assertEquals( "ICON C", this.__tree.getRoot().getChildren()[2].getIcon(), "Third node has a wrong icon" ); }, testSelection() { // open the tree so that the selection can be done this.__tree.getRoot().setOpen(true); // select the first object this.__tree.addToSelection(this.__tree.getRoot().getChildren()[0]); // test the selection this.assertEquals( this.__a, 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.__tree.addToSelection(this.__tree.getRoot().getChildren()[1]); // test the selection this.assertEquals( this.__b, 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() { // open the tree so that the selection can be done this.__tree.getRoot().setOpen(true); // select the second and third object this.__tree.setSelectionMode("multi"); // add the some elements to the selection this.__controller.getSelection().push(this.__a); this.__controller.getSelection().push(this.__b); // test the selection this.assertEquals( this.__a, this.__controller.getSelection().getItem(0), "Add to selection does not work." ); this.assertEquals( this.__b, this.__controller.getSelection().getItem(1), "Add to selection does not work." ); }, testSelectionAfterDelete() { // open the tree so that the selection can be done this.__tree.getRoot().setOpen(true); // add c to the selection this.__controller.getSelection().push(this.__c); // remove the c node var temp = this.__model.getChildren().splice(2, 1); temp.setAutoDisposeItems(true); temp.dispose(); // check if the selection is empty this.assertEquals( 0, this.__controller.getSelection().length, "Remove from selection does not work!" ); // add b to the selection this.__controller.getSelection().push(this.__b); // remove the first element of the controller 'this.__a' temp = this.__model.getChildren().shift(); temp.dispose(); // check if the selected item in the list is "b" this.assertTrue( this.__controller.getSelection().contains(this.__b), "Selection array wrong!" ); this.assertEquals( "b", this.__tree.getSelection()[0].getLabel(), "Remove from selection does not work!" ); }, testSelectInvisible() { // add c to the selection this.__controller.getSelection().push(this.__c); // check if the selection worked this.assertEquals( 1, this.__controller.getSelection().length, "Adding of an non visible element should not work." ); }, testLabelOptions() { // create the options var options = { converter(data, model) { return data + model.getName2(); } }; // create the controller this.__controller.dispose(); this.__controller = new qx.data.controller.Tree( this.__model, this.__tree, "children", "name" ); this.__controller.setLabelOptions(options); // test the converter this.assertEquals( "rootroot2", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "aa2", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "bb2", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "cc2", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); }, testIconOptions() { // create the options var options = { converter(data, model) { if (data != null) { return data + model.getName(); } return null; } }; // create the controller this.__controller.dispose(); this.__controller = new qx.data.controller.Tree( this.__model, this.__tree, "children", "name" ); this.__controller.setIconPath("icon"); this.__controller.setIconOptions(options); // test the converter this.assertNull( this.__tree.getRoot().getIcon(), "Root node has a wrong icon" ); this.assertEquals( "icon aa", this.__tree.getRoot().getChildren()[0].getIcon(), "First node has a wrong icon" ); this.assertEquals( "icon bb", this.__tree.getRoot().getChildren()[1].getIcon(), "Second node has a wrong icon" ); this.assertEquals( "icon cc", this.__tree.getRoot().getChildren()[2].getIcon(), "Third node has a wrong icon" ); }, testItemWithoutChildren() { // create new Object qx.Class.define("qx.test.TreeEndNode", { extend: qx.core.Object, properties: { name: { check: "String", init: "root", event: "changeName" }, icon: { check: "String", event: "changeIcon", nullable: true } } }); var endNode = new qx.test.TreeEndNode(); endNode.setName("ENDE"); this.__model.getChildren().push(endNode); this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); this.assertEquals( "ENDE", this.__tree.getRoot().getChildren()[3].getLabel(), "Fourth node has a wrong name" ); }, testSetLateModel() { this.__controller.dispose(); // create the controller this.__controller = new qx.data.controller.Tree( null, this.__tree, "children", "name" ); this.__controller.setModel(this.__model); // check the initial Labels this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); }, testSetLateTarget() { this.__controller.dispose(); // create the controller this.__controller = new qx.data.controller.Tree( this.__model, null, "children", "name" ); this.__controller.setTarget(this.__tree); // check the initial Labels this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); }, testSetLateTargetAndModel() { this.__controller.dispose(); this.__controller = new qx.data.controller.Tree( null, null, "children", "name" ); this.__controller.setTarget(this.__tree); this.__controller.setModel(this.__model); // check the initial Labels this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); // redo the test and set the modeln and target in different order this.__controller.dispose(); this.__controller = new qx.data.controller.Tree( null, null, "children", "name" ); this.__controller.setModel(this.__model); this.__controller.setTarget(this.__tree); // check the initial Labels this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); }, testSetLateChildPath() { this.__controller.dispose(); this.__controller = new qx.data.controller.Tree( this.__model, this.__tree, null, "name" ); this.__controller.setChildPath("children"); // check the initial Labels this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); }, testSetLateLabelPath() { this.__controller.dispose(); this.__controller = new qx.data.controller.Tree( this.__model, this.__tree, "children" ); this.__controller.setLabelPath("name"); // check the initial Labels this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); }, testSetLateAll() { this.__controller.dispose(); this.__controller = new qx.data.controller.Tree(); // set the needed properties this.__controller.setLabelPath("name"); this.__controller.setChildPath("children"); this.__controller.setModel(this.__model); this.__controller.setTarget(this.__tree); // check the initial Labels this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); }, testDelegateConfigure() { // create the delegate var delegate = new qx.core.Object(); delegate.configureItem = function (item) { item.setUserData("a", true); }; this.__controller.setDelegate(delegate); // check the initial Labels this.assertTrue( this.__tree.getRoot().getUserData("a"), "Delegation not working." ); this.assertTrue( this.__tree.getRoot().getChildren()[0].getUserData("a"), "Delegation not working." ); this.assertTrue( this.__tree.getRoot().getChildren()[1].getUserData("a"), "Delegation not working." ); this.assertTrue( this.__tree.getRoot().getChildren()[2].getUserData("a"), "Delegation not working." ); this.__controller.setDelegate(null); delegate.dispose(); }, testDelegateConfigureLate() { // clear up the setup this.__controller.dispose(); var controller = new qx.data.controller.Tree( null, this.__tree, "children", "name" ); var delegate = { configureItem(item) { item.setUserData("a", true); } }; controller.setDelegate(delegate); controller.setModel(this.__model); // check the initial Labels this.assertTrue( this.__tree.getRoot().getUserData("a"), "Delegation not working." ); this.assertTrue( this.__tree.getRoot().getChildren()[0].getUserData("a"), "Delegation not working." ); this.assertTrue( this.__tree.getRoot().getChildren()[1].getUserData("a"), "Delegation not working." ); this.assertTrue( this.__tree.getRoot().getChildren()[2].getUserData("a"), "Delegation not working." ); controller.dispose(); }, testDelegateCreateLate() { var delegate = { createItem() { var folder = new qx.ui.tree.TreeFolder(); folder.setUserData("my", true); return folder; } }; this.__controller.setDelegate(delegate); // check the initial Labels this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); // check if the folders are the self created folders this.assertTrue( this.__tree.getRoot().getUserData("my"), "Default folders found." ); this.assertTrue( this.__tree.getRoot().getChildren()[0].getUserData("my"), "Default folders found." ); this.assertTrue( this.__tree.getRoot().getChildren()[1].getUserData("my"), "Default folders found." ); this.assertTrue( this.__tree.getRoot().getChildren()[2].getUserData("my"), "Default folders found." ); }, testDelegateCreateFirst() { this.__controller.dispose(); this.__controller = new qx.data.controller.Tree(); var delegate = { createItem() { var folder = new qx.ui.tree.TreeFolder(); folder.setUserData("my", true); return folder; } }; var tree = new qx.ui.tree.Tree(); this.__controller.setDelegate(delegate); this.__controller.setChildPath("children"); this.__controller.setLabelPath("name"); this.__controller.setModel(this.__model); this.__controller.setTarget(tree); // check the initial Labels this.assertEquals( "root", tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); // check if the folders are the self created folders this.assertTrue( tree.getRoot().getUserData("my"), "Default folders found." ); this.assertTrue( tree.getRoot().getChildren()[0].getUserData("my"), "Default folders found." ); this.assertTrue( tree.getRoot().getChildren()[1].getUserData("my"), "Default folders found." ); this.assertTrue( tree.getRoot().getChildren()[2].getUserData("my"), "Default folders found." ); tree.destroy(); }, testDelegateBindLate() { var delegate = { bindItem(controller, item, id) { controller.bindDefaultProperties(item, id); controller.bindProperty("color", "textColor", null, item, id); } }; this.__controller.setDelegate(delegate); // check the initial Labels this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); // check the names this.assertEquals( "green", this.__tree.getRoot().getTextColor(), "Root node has a wrong name" ); this.assertEquals( "red", this.__tree.getRoot().getChildren()[0].getTextColor(), "First node has a wrong name" ); this.assertEquals( "blue", this.__tree.getRoot().getChildren()[1].getTextColor(), "Second node has a wrong name" ); this.assertEquals( "white", this.__tree.getRoot().getChildren()[2].getTextColor(), "Third node has a wrong name" ); this.__model.setColor("black"); this.assertEquals( "black", this.__tree.getRoot().getTextColor(), "Root node has a wrong name" ); }, testDelegateBindFirst() { var delegate = { bindItem(controller, item, id) { controller.bindDefaultProperties(item, id); controller.bindProperty("color", "textColor", null, item, id); } }; var tree = new qx.ui.tree.Tree(); this.__controller.setDelegate(delegate); this.__controller.setChildPath("children"); this.__controller.setLabelPath("name"); this.__controller.setModel(this.__model); this.__controller.setTarget(tree); // check the initial Labels this.assertEquals( "root", tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); // check the names this.assertEquals( "green", tree.getRoot().getTextColor(), "Root node has a wrong name" ); this.assertEquals( "red", tree.getRoot().getChildren()[0].getTextColor(), "First node has a wrong name" ); this.assertEquals( "blue", tree.getRoot().getChildren()[1].getTextColor(), "Second node has a wrong name" ); this.assertEquals( "white", tree.getRoot().getChildren()[2].getTextColor(), "Third node has a wrong name" ); this.__model.setColor("black"); this.assertEquals( "black", tree.getRoot().getTextColor(), "Root node has a wrong name" ); tree.dispose(); }, testDelegateBindPropertyReverse() { var delegate = { bindItem(controller, item, id) { controller.bindProperty("name", "appearance", null, item, id); controller.bindPropertyReverse("name", "appearance", null, item, id); controller.bindPropertyReverse( "color", "backgroundColor", null, item, id ); } }; this.__controller.setDelegate(delegate); // check the initial Labels this.assertEquals( "root", this.__tree.getRoot().getAppearance(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getAppearance(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getAppearance(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getAppearance(), "Third node has a wrong name" ); // check the reverse binding this.__tree.getRoot().setAppearance("ROOT"); this.assertEquals( "ROOT", this.__model.getName(), "Reverse binding not ok!" ); this.__tree.getRoot().getChildren()[0].setBackgroundColor("#123456"); this.assertEquals( "#123456", this.__a.getColor(), "Reverse binding not ok!" ); // invoke a removing and setting of the bindings with the new bindItem delegate.bindItem = function (controller, item, id) { controller.bindProperty("name", "appearance", null, item, id); }; this.__controller.setDelegate(null); this.__controller.setDelegate(delegate); this.__tree.getRoot().setAppearance("123"); this.assertEquals("ROOT", this.__model.getName(), "Removing not ok"); this.__tree.getRoot().getChildren()[0].setBackgroundColor("#654321"); this.assertEquals("#123456", this.__a.getColor(), "Removing not ok"); }, testDelegateAddItem() { var a = new qx.test.TreeNode(); a.setName("new"); // set a delegate this.__controller.setDelegate({ createItem() { return new qx.ui.tree.TreeFolder(); } }); // flush the dispose queue qx.ui.core.queue.Dispose.flush(); // add the new model this.__model.getChildren().push(a); }, testResetModel() { this.__controller.resetModel(); this.assertNull(this.__tree.getRoot(), "Tree is not empty."); }, testChangeChildrenArray() { // create the new children array var children = new qx.data.Array(); var a = new qx.test.TreeNode(); a.setName("new"); children.push(a); var oldChildren = this.__a.getChildren(); // change the children array // this.__model // / | \ // this.__a this.__b this.__c // | // a this.__a.setChildren(children); oldChildren.dispose(); // Test if the tree nodes exist this.assertNotUndefined( this.__tree.getRoot(), "Root node does not exist" ); this.assertNotUndefined( this.__tree.getRoot().getChildren()[0], "First node does not exist" ); this.assertNotUndefined( this.__tree.getRoot().getChildren()[0].getChildren()[0], "New node does not exist" ); // test if its the proper node this.assertEquals( "new", this.__tree.getRoot().getChildren()[0].getChildren()[0].getLabel() ); }, testInheritedChildren() { qx.Class.define("qx.test.MyTreeNode", { extend: qx.test.TreeNode }); // init (copy of setUp) this.__tree.dispose(); this.__model.dispose(); this.__a.dispose(); this.__b.dispose(); this.__c.dispose(); this.__tree = new qx.ui.tree.Tree(); // create a model // this.__model // / | \ // this.__a this.__b this.__c this.__model = new qx.test.MyTreeNode(); this.__a = new qx.test.MyTreeNode(); this.__a.set({ name: "a", name2: "a2", icon: "icon a", icon2: "icon a2", color: "red" }); this.__b = new qx.test.MyTreeNode(); this.__b.set({ name: "b", name2: "b2", icon: "icon b", icon2: "icon b2", color: "blue" }); this.__c = new qx.test.MyTreeNode(); this.__c.set({ name: "c", name2: "c2", icon: "icon c", icon2: "icon c2", color: "white" }); this.__model.getChildren().push(this.__a, this.__b, this.__c); this.__model.getAltChildren().push(this.__c, this.__b, this.__a); // create the controller this.__controller.dispose(); this.__controller = new qx.data.controller.Tree( this.__model, this.__tree, "children", "name" ); // check the initial Labels this.assertEquals( "root", this.__tree.getRoot().getLabel(), "Root node has a wrong name" ); this.assertEquals( "a", this.__tree.getRoot().getChildren()[0].getLabel(), "First node has a wrong name" ); this.assertEquals( "b", this.__tree.getRoot().getChildren()[1].getLabel(), "Second node has a wrong name" ); this.assertEquals( "c", this.__tree.getRoot().getChildren()[2].getLabel(), "Third node has a wrong name" ); }, testRemoveEvents() { // BUG #3566 var nodes = []; for (var i = 0; i < 50; ++i) { nodes[i] = new qx.test.TreeNode(); if (i != 0) { nodes[parseInt(Math.random() * i, 10)].getChildren().push(nodes[i]); } } var tree = new qx.ui.tree.Tree(); var controller = new qx.data.controller.Tree( nodes[0], tree, "children", "name" ); for (var i = 0; i < nodes.length; ++i) { nodes[i].getChildren().removeAll(); // THIS THROWS AN EXCEPTION ON 2ND ELEMENT... } controller.dispose(); tree.dispose(); for (var i = 0; i < nodes.length; ++i) { nodes[i].dispose(); } }, testBindItemDouble() { var delegate = { bindItem(controller, item, id) { controller.bindProperty("color", "textColor", null, item, id); controller.bindProperty("color", "textColor", null, item, id); } }; var self = this; this.assertException( function () { self.__controller.setDelegate(delegate); }, Error, /textColor/.g ); }, testBindItemDoubleReverse() { var delegate = { bindItem(controller, item, id) { controller.bindPropertyReverse("color", "textColor", null, item, id); controller.bindPropertyReverse("color", "textColor", null, item, id); } }; var self = this; this.assertException( function () { self.__controller.setDelegate(delegate); }, Error, /textColor/.g ); } } });