@qooxdoo/framework
Version:
The JS Framework for Coders
1,110 lines (878 loc) • 42.4 kB
JavaScript
/* ************************************************************************
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 : function() {
this.base(arguments);
// define a test class
qx.Class.define("qx.test.TreeNode",
{
extend : qx.core.Object,
construct : function() {
this.base(arguments);
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 : function()
{
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 : function()
{
// 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 : function()
{
this.__controller.dispose();
this.__model.dispose();
this.__tree.dispose();
// clear the stub
this.getSandbox().restore();
},
testRemoveBindingsRecursive: function(){
// 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: function(){
// 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: function() {
// 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: function() {
// 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: function() {
// 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: function() {
// 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: function() {
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: function() {
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: function() {
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: function() {
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: function() {
// 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: function() {
// 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: function() {
// 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: function() {
// 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: function() {
// 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: function() {
// 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: function() {
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: function() {
// 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: function() {
// 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: function() {
// 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: function() {
// 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: function() {
// 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: function() {
// 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: function() {
// create the options
var options = {
converter: function(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: function() {
// create the options
var options = {
converter: function(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: function() {
// 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: function() {
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: function() {
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: function() {
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: function() {
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: function() {
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: function() {
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: function() {
// 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 : function()
{
// clear up the setup
this.__controller.dispose();
var controller = new qx.data.controller.Tree(null, this.__tree, "children", "name");
var delegate = {
configureItem: function(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: function () {
var delegate = {
createItem : function() {
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: function () {
this.__controller.dispose();
this.__controller = new qx.data.controller.Tree();
var delegate = {
createItem : function() {
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: function () {
var delegate = {
bindItem : function(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: function () {
var delegate = {
bindItem : function(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: function () {
var delegate = {
bindItem : function(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: function() {
var a = new qx.test.TreeNode();
a.setName("new");
// set a delegate
this.__controller.setDelegate({
createItem : function() {
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: function() {
this.__controller.resetModel();
this.assertNull(this.__tree.getRoot(), "Tree is not empty.");
},
testChangeChildrenArray : function() {
// 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 : function()
{
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 : function()
{
// 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: function(){
var delegate = {
bindItem : function(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: function(){
var delegate = {
bindItem : function(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);
}
}
});