@qooxdoo/framework
Version:
The JS Framework for Coders
472 lines (376 loc) • 13.4 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2011 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:
* Christian Hagendorn (chris_schmidt)
************************************************************************ */
qx.Class.define("qx.test.ui.tree.virtual.WidgetProvider", {
extend: qx.dev.unit.TestCase,
implement: qx.ui.tree.core.IVirtualTree,
include: qx.dev.unit.MMock,
properties: {
openProperty: {
check: "String",
init: null
}
},
members: {
model: null,
provider: null,
lookupTable: null,
selection: null,
setUp() {
var rawData = {
name: "Root",
icon: "Root",
kids: [
{ name: "Node1", icon: "Node1", kids: [] },
{ name: "Node2", icon: "Node2", kids: [] },
{ name: "Leaf1", icon: "Leaf1" },
{ name: "Leaf2", icon: "Leaf2" }
]
};
this.model = qx.data.marshal.Json.createModel(rawData);
this.provider = new qx.ui.tree.provider.WidgetProvider(this);
this.provider.setLabelPath("name");
this.provider.setIconPath("icon");
this.provider.setChildProperty("kids");
},
tearDown() {
this.provider.dispose();
this.provider = null;
for (var i = 0; i < this.model.getKids().getLength(); i++) {
this.model.getKids().getItem(i).dispose();
}
this.model.dispose();
this.model = null;
if (this.lookupTable != null) {
this.lookupTable.dispose();
this.lookupTable = null;
}
if (this.selection != null) {
this.selection.dispose();
this.selection = null;
}
},
testCreation() {
this.provider.dispose();
this.provider = new qx.ui.tree.provider.WidgetProvider(this);
this.assertNull(
this.provider.getChildProperty(),
"Initial 'childProperty' property value is wrong!"
);
this.assertNull(
this.provider.getLabelPath(),
"Initial 'labelPath' property value is wrong!"
);
this.assertNull(
this.provider.getIconPath(),
"Initial 'iconPath' property value is wrong!"
);
},
testCreateLayer() {
var layer = this.provider.createLayer();
this.assertInstance(layer, qx.ui.virtual.layer.WidgetCell);
layer.dispose();
},
testGetRootNodeWidget() {
var spyBinding = this.spy(this.provider, "_bindItem");
var spySelection = this.spy(this.provider, "_styleUnselectabled");
var widget = this.provider.getCellWidget(0, 0);
this.assertInstance(widget, qx.ui.tree.VirtualTreeItem);
this.assertTrue(widget.hasChildren());
this.assertTrue(widget.getUserData("cell.showLeafs"));
this.assertTrue(widget.getUserData("cell.showLeafs"));
this.assertEquals(0, widget.getUserData("cell.level"));
this.assertTrue(widget.isOpen());
this.assertTrue(widget.hasListener("changeOpen"));
this.assertCalledOnce(spyBinding);
this.assertCalledWith(spyBinding, widget, 0);
this.assertCalledOnce(spySelection);
this.assertCalledWith(spySelection, widget);
widget.dispose();
},
testGetNodeWidget() {
var spyBinding = this.spy(this.provider, "_bindItem");
var spySelection = this.spy(this.provider, "_styleUnselectabled");
var widget = this.provider.getCellWidget(1, 0);
this.assertInstance(widget, qx.ui.tree.VirtualTreeItem);
this.assertFalse(widget.hasChildren());
this.assertTrue(widget.getUserData("cell.showLeafs"));
this.assertEquals(1, widget.getUserData("cell.level"));
this.assertFalse(widget.isOpen());
this.assertTrue(widget.hasListener("changeOpen"));
this.assertCalledOnce(spyBinding);
this.assertCalledWith(spyBinding, widget, 1);
this.assertCalledOnce(spySelection);
this.assertCalledWith(spySelection, widget);
widget.dispose();
},
testGetLeafWidget() {
var spyBinding = this.spy(this.provider, "_bindItem");
var spySelection = this.spy(this.provider, "_styleUnselectabled");
var widget = this.provider.getCellWidget(3, 0);
this.assertInstance(widget, qx.ui.tree.VirtualTreeItem);
this.assertFalse(widget.hasChildren());
this.assertTrue(widget.getUserData("cell.showLeafs"));
this.assertEquals(1, widget.getUserData("cell.level"));
this.assertFalse(widget.isOpen());
this.assertTrue(widget.hasListener("changeOpen"));
this.assertCalledOnce(spyBinding);
this.assertCalledWith(spyBinding, widget, 3);
this.assertCalledOnce(spySelection);
this.assertCalledWith(spySelection, widget);
widget.dispose();
},
testPoolWidget() {
var widget = this.provider.getCellWidget(3, 0);
var spyPool = this.spy(this.provider._renderer, "pool");
var spyBinding = this.spy(this.provider, "_removeBindingsFrom");
this.provider.poolCellWidget(widget);
this.assertCalledOnce(spyPool);
this.assertCalledWith(spyPool, widget);
this.assertCalledOnce(spyBinding);
this.assertCalledWith(spyBinding, widget);
widget.dispose();
},
testDefaultNodeBinding() {
var widget = new qx.ui.tree.VirtualTreeItem();
this.provider._bindItem(widget, 0);
this.assertEquals(
4,
this.getLookupTable().getBindings().length,
"Bindings count not correct!"
);
this.assertEquals("Root", widget.getLabel());
this.assertEquals("Root", widget.getIcon());
this.assertEquals("virtual-tree-folder", widget.getAppearance());
this.assertEquals(this.model, widget.getModel());
this.provider._bindItem(widget, 1);
this.assertEquals(
8,
this.getLookupTable().getBindings().length,
"Bindings count not correct!"
);
this.assertEquals("Node1", widget.getLabel());
this.assertEquals("Node1", widget.getIcon());
this.assertEquals("virtual-tree-folder", widget.getAppearance());
this.assertEquals(this.model.getKids().getItem(0), widget.getModel());
widget.dispose();
},
testDefaultLeafBinding() {
var widget = new qx.ui.tree.VirtualTreeItem();
this.provider._bindItem(widget, 3);
this.assertEquals(
3,
this.getLookupTable().getBindings().length,
"Bindings count not correct!"
);
this.assertEquals("Leaf1", widget.getLabel());
this.assertEquals("Leaf1", widget.getIcon());
this.assertEquals("virtual-tree-file", widget.getAppearance());
this.assertEquals(this.model.getKids().getItem(2), widget.getModel());
widget.dispose();
},
testRemoveBindingsFromNode() {
var widget = new qx.ui.tree.VirtualTreeItem();
var oldWidgetBindungs = widget.getBindings().length;
var oldModelBindungs = this.getLookupTable().getBindings().length;
this.provider._bindItem(widget, 0);
this.provider._removeBindingsFrom(widget);
var newWidgetBindungs = widget.getBindings().length;
var newModelBindungs = this.getLookupTable().getBindings().length;
this.assertEquals(
oldWidgetBindungs,
newWidgetBindungs,
"Binding on widget is not removed!"
);
this.assertEquals(
oldModelBindungs,
newModelBindungs,
"Binding on model is not removed!"
);
widget.dispose();
},
testReverseBinding() {
var widget = new qx.ui.tree.VirtualTreeItem();
var oldWidgetBindungs = widget.getBindings().length;
var oldModelBindungs = this.getLookupTable().getBindings().length;
this.provider.bindPropertyReverse("name", "label", null, widget, 0);
widget.setLabel("ort-zerreiber");
this.assertEquals("ort-zerreiber", this.model.getName());
this.provider._removeBindingsFrom(widget);
var newWidgetBindungs = widget.getBindings().length;
var newModelBindungs = this.getLookupTable().getBindings().length;
this.assertEquals(
oldWidgetBindungs,
newWidgetBindungs,
"Binding on widget is not removed!"
);
this.assertEquals(
oldModelBindungs,
newModelBindungs,
"Binding on model is not removed!"
);
widget.dispose();
},
testRemoveAllBindings() {
var widget1 = new qx.ui.tree.VirtualTreeItem();
var widget2 = new qx.ui.tree.VirtualTreeItem();
var oldWidget1Bindungs = widget1.getBindings().length;
var oldWidget2Bindungs = widget2.getBindings().length;
var oldModelBindungs = this.getLookupTable().getBindings().length;
this.provider.bindProperty("name", "label", null, widget1, 0);
this.provider.bindProperty("name", "label", null, widget2, 1);
this.provider.bindPropertyReverse("name", "label", null, widget1, 0);
this.provider.bindPropertyReverse("name", "label", null, widget2, 1);
this.provider.removeBindings();
var newWidget1Bindungs = widget1.getBindings().length;
var newWidget2Bindungs = widget2.getBindings().length;
var newModelBindungs = this.getLookupTable().getBindings().length;
this.assertEquals(
oldWidget1Bindungs,
newWidget1Bindungs,
"Binding on first widget is not removed!"
);
this.assertEquals(
oldWidget1Bindungs,
newWidget1Bindungs,
"Binding on second widget is not removed!"
);
this.assertEquals(
oldModelBindungs,
newModelBindungs,
"Binding on model is not removed!"
);
widget1.dispose();
widget2.dispose();
},
testRemoveAllBindingsOnDispose() {
var provider = new qx.ui.tree.provider.WidgetProvider(this);
var spy = this.spy(provider, "removeBindings");
provider.dispose();
this.assertCalledOnce(spy);
},
testCreateItem() {
var delegate = {
createItem() {
return new qx.ui.tree.VirtualTreeItem();
}
};
var spy = this.spy(delegate, "createItem");
this.provider.setDelegate(delegate);
var widget = this.provider.getCellWidget(4, 0);
this.assertCalledOnce(spy);
widget.dispose();
},
testConfigureItem() {
var delegate = {
configureItem(leaf) {}
};
var spy = this.spy(delegate, "configureItem");
this.provider.setDelegate(delegate);
var widget = this.provider.getCellWidget(4, 0);
this.assertCalledOnce(spy);
this.assertCalledWith(spy, widget);
widget.dispose();
},
testBindItem() {
var delegate = {
bindItem(controller, leaf, id) {}
};
var spy = this.spy(delegate, "bindItem");
this.provider.setDelegate(delegate);
var widget = this.provider.getCellWidget(4, 0);
this.assertCalledOnce(spy);
this.assertCalledWith(spy, this.provider, widget, 4);
widget.dispose();
},
testOnPool() {
var delegate = {
onPool(item) {}
};
var spy = this.spy(delegate, "onPool");
this.provider.setDelegate(delegate);
var widget = this.provider.getCellWidget(4, 0);
this.provider.poolCellWidget(widget);
this.assertCalledOnce(spy);
this.assertCalledWith(spy, widget);
widget.dispose();
},
/*
---------------------------------------------------------------------------
MOCK API
---------------------------------------------------------------------------
*/
isShowTopLevelOpenCloseIcons() {
return true;
},
isShowLeafs() {
return true;
},
getSelection() {
if (this.selection != null) {
return this.selection;
}
this.selection = new qx.data.Array();
return this.selection;
},
getLookupTable() {
if (this.lookupTable != null) {
return this.lookupTable;
}
var model = this.model;
this.lookupTable = new qx.data.Array([model]);
for (var i = 0; i < model.getKids().getLength(); i++) {
this.lookupTable.push(model.getKids().getItem(i));
}
return this.lookupTable;
},
isNode(item) {
var index = this.getLookupTable().indexOf(item);
if (index == -1) {
throw new Error("Item is not part of the model!");
}
if (index == 0 || index == 1 || index == 2) {
return true;
}
return false;
},
isNodeOpen(node) {
var index = this.getLookupTable().indexOf(node);
if (index == -1) {
throw new Error("Node is not part of the model!");
}
if (node == this.model) {
return true;
}
return false;
},
getLevel(row) {
if (row > this.getLookupTable().getLength() || row < 0) {
throw new Error("Row is not in range of the model!");
}
if (row == 0) {
return 0;
}
return 1;
},
hasChildren(node) {
if (this.isNode(node)) {
return node.getKids().getLength() > 0;
} else {
return false;
}
},
openNode(node) {},
openNodeWithoutScrolling(node) {},
closeNode(node) {},
closeNodeWithoutScrolling(node) {}
}
});