@qooxdoo/framework
Version:
The JS Framework for Coders
664 lines (565 loc) • 17 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.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!");
}
}
});