Files
openlayers/master/examples/Tree_dnd_multiParent.html
Éric Lemoine 5d14b9e2d4 Updated
2013-02-20 10:38:25 +01:00

318 lines
13 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>doh.robot Tree DnD Multi-parent Test</title>
<style>
@import "../../../../util/doh/robot/robot.css";
</style>
<!-- required: dojo.js -->
<script type="text/javascript" src="../../../../dojo/dojo.js"></script>
<!-- functions to help test -->
<script type="text/javascript" src="../../helpers.js"></script>
<script type="text/javascript" src="Tree_dnd.js"></script>
<script type="text/javascript">
dojo.require("dojo.window");
dojo.require("dijit.robotx");
dojo.ready(function(){
doh.robot.initRobot('../test_Tree_DnD.html');
setup();
doh.register("multi-parent tests", [
{
name: "add 'Fruits' as parent of vegetables",
timeout: 10000,
runTest: function(){
var
d = new doh.Deferred(),
vegetablesTreeNode = findTreeNodeByPath("collectionsTree", ["Vegetables (0)"]), // the left tree
fruitsTreeNode = findTreeNodeByPath("itemTree", ["Fruits"]); // right tree
doh.robot.mouseMoveAt("collectionsTree", 500, 1); // scroll source parent into view
doh.robot.mouseMoveAt(vegetablesTreeNode.domNode, 500, 1);
// Drag and Drop, *copying* in order to add a parent rather than change
doh.robot.keyDown(dojo.keys.copyKey, 500);
if(dojo.isMac){
// I can't get DOH robot to generate the mousePress event w/metaKey=true so
// hack it
doh.robot.sequence(function(){
realIsCopyKey = dojo.global.dojo.isCopyKey;
dojo.global.dojo.isCopyKey = function(){ return true; }
});
}
doh.robot.mousePress({left: true}, 500);
doh.robot.mouseMoveAt("itemTree", 500, 500); // move to dest parent to scroll it into view
doh.robot.mouseMoveAt(fruitsTreeNode.labelNode, 0, 500);
doh.robot.mouseRelease({left: true}, 500);
doh.robot.keyUp(dojo.keys.copyKey, 500);
if(dojo.isMac){
// See if(dojo.isMac) above
doh.robot.sequence(function(){
dojo.global.dojo.isCopyKey = realIsCopyKey;
});
}
doh.robot.sequence(d.getTestCallback(function(){
// Check that Vegetables remains a child of Foods
var children = getNamesOfChildrenOfItem("Foods");
doh.is(3, children.categories.length, "foods category child");
doh.is("Fruits", children.categories[0]);
doh.is("Vegetables", children.categories[1]);
doh.is("Cereals", children.categories[2]);
// Check that Vegetables added as child of Fruits
var children2 = getNamesOfChildrenOfItem("Fruits");
doh.is(2, children2.categories.length, "foods category child");
doh.is("Citrus", children2.categories[0]);
doh.is("Vegetables", children2.categories[1]);
// Check that new item *wasn't* created
var items;
dojo.global.myStore.fetch({
onComplete: function(i){ items = i; }
});
doh.is(6, items.length, "# of items in store");
// Check that data store update was reflected in the tree
doh.t(fruitsTreeNode.isExpanded, "drop caused the node to expand");
var treeNodeChildren = fruitsTreeNode.getChildren();
doh.is(2, treeNodeChildren.length, "2 TreeNode children");
doh.is("Citrus", innerText(treeNodeChildren[0].labelNode));
doh.is("Vegetables", innerText(treeNodeChildren[1].labelNode));
}), 1000); // 1000ms to wait for 'Fruits' node to expand and show 'Apple' node
return d;
}
},
{
name: "move Foods/Vegetables to Foods/Cereal/Vegetables",
timeout: 10000,
runTest: function(){
var
d = new doh.Deferred(),
vegetablesTreeNode = findTreeNodeByPath("itemTree", ["Vegetables"]),
cerealsTreeNode = findTreeNodeByPath("itemTree", ["Cereals"]);
dojo.global.scrollTo(0, 9000); // scroll to bottom to try and prevent the DnD code from autoscrolling
// Drag and Drop
doh.robot.mouseMoveAt(vegetablesTreeNode.domNode, 500, 1);
doh.robot.mouseClick({left: true}, 500); // helps prevent screen jitter
doh.robot.mousePress({left: true}, 1000);
doh.robot.mouseMoveAt(vegetablesTreeNode.labelNode, 500, 500, 0, 0); // move mouse slightly to trigger DnD
doh.robot.mouseMoveAt(cerealsTreeNode.domNode, 500, 100); // double move to allow for autoscrolling jitter
doh.robot.mouseMoveAt(cerealsTreeNode.domNode, 500, 100);
doh.robot.mouseRelease({left: true}, 500);
doh.robot.sequence(d.getTestCallback(function(){
// Check that Vegetables remains a child of Fruits
var children = getNamesOfChildrenOfItem("Fruits");
doh.is(2, children.categories.length, "fruits category child");
doh.is("Citrus", children.categories[0]);
doh.is("Vegetables", children.categories[1]);
// Check that Vegetables added as child of Cereals
children = getNamesOfChildrenOfItem("Cereals");
doh.is(1, children.categories.length, "cereals category child");
doh.is("Vegetables", children.categories[0]);
// Check that Vegetables no longer a child of Foods
children = getNamesOfChildrenOfItem("Foods");
doh.is(2, children.categories.length, "foods category child");
doh.is("Fruits", children.categories[0]);
doh.is("Cereals", children.categories[1]);
// Check that new item *wasn't* created
var items;
dojo.global.myStore.fetch({
onComplete: function(i){ items = i; }
});
doh.is(6, items.length, "# of items in store");
}), 1000); // 1000ms to wait for 'Fruits' node to expand and show 'Apple' node
return d;
}
},
{
name: "move Fruits/Vegetables to Fruits/Citrus",
timeout: 10000,
runTest: function(){
var
d = new doh.Deferred(),
vegetablesTreeNode = findTreeNodeByPath("itemTree", ["Fruits", "Vegetables"]),
citrusTreeNode = findTreeNodeByPath("itemTree", ["Fruits", "Citrus"]);
// Drag and Drop
doh.robot.mouseMoveAt(vegetablesTreeNode.labelNode, 500, 1);
doh.robot.mouseClick({left: true}, 500); // helps prevent screen jitter
doh.robot.mousePress({left: true}, 1000);
doh.robot.mouseMoveAt(vegetablesTreeNode.labelNode, 500, 500, 0, 0); // move mouse slightly to trigger DnD
doh.robot.mouseMoveAt(citrusTreeNode.labelNode, 0, 500);
doh.robot.mouseRelease({left: true}, 500);
doh.robot.sequence(d.getTestCallback(function(){
// Check that Vegetables remains a child of Cereals
var children = getNamesOfChildrenOfItem("Cereals");
doh.is(1, children.categories.length, "cereals category child");
doh.is("Vegetables", children.categories[0]);
// Check that Vegetables added as child of Citrus
children = getNamesOfChildrenOfItem("Citrus");
doh.is(1, children.categories.length, "citrus category child");
doh.is("Vegetables", children.categories[0]);
doh.is(1, children.items.length, "citrus item child");
doh.is("Orange", children.items[0]);
// Check that Vegetables removed as child of Fruits
children = getNamesOfChildrenOfItem("Fruits");
doh.is(1, children.categories.length, "fruits category child");
doh.is("Citrus", children.categories[0]);
// Check that new item *wasn't* created
var items;
dojo.global.myStore.fetch({
onComplete: function(i){ items = i; }
});
doh.is(6, items.length, "# of items in store");
}), 1000); // 1000ms to wait for 'Fruits' node to expand and show 'Apple' node
return d;
}
}
]);
doh.register("external drop tests", [
{
name: "drop banana on fruits",
timeout: 10000,
runTest: function(){
var
d = new doh.Deferred(),
fruitsTreeNode = findTreeNodeByPath("itemTree", ["Fruits"]); // right tree
doh.robot.mouseMoveAt(dojo.byId("1003").parentNode, 500, 1, 0, 0); // move to source parent node to help prevent DnD autoscrolling
doh.robot.mouseMoveAt(dojo.byId("1003"), 500, 1); // move to source banana node
doh.robot.mousePress({left: true}, 500);
doh.robot.mouseMoveAt(dojo.byId("1003").parentNode, 500, 100); // move just a little to start the DnD operation before scrolling
doh.robot.mouseMoveAt("itemTree", 500, 500); // go to target parent top to allow for better scrolling of the destination
doh.robot.mouseMoveAt(fruitsTreeNode.labelNode, 1000, 500);
doh.robot.mouseRelease({left: true}, 500);
doh.robot.sequence(d.getTestCallback(function(){
var children = getChildrenOfItem("Fruits");
doh.is(1, children.items.length, "new item added");
doh.is(1003, children.items[0].id, "id of new item came from dropped node");
doh.is("Banana", children.items[0].name, "name of new item came from dropped node");
dojo.global.myStore.fetch({
query: { name: "Banana" },
queryOptions: { deep: true },
onComplete: function(i){ items = i; }
});
doh.is(1, items.length, "1 banana item in store");
}), 1000);
return d;
}
},
{
name: "drop banana on cereal",
timeout: 10000,
runTest: function(){
var
d = new doh.Deferred(),
cerealsTreeNode = findTreeNodeByPath("itemTree", ["Cereals"]); // right tree
doh.robot.mouseMoveAt(dojo.byId("1003").parentNode, 500, 1, 0, 0); // move to source parent node to help prevent DnD autoscrolling
doh.robot.mouseMoveAt(dojo.byId("1003"), 500, 1); // move to source banana node
doh.robot.mousePress({left: true}, 500);
doh.robot.mouseMoveAt(dojo.byId("1003").parentNode, 500, 100); // move just a little to start the DnD operation before scrolling
doh.robot.mouseMoveAt("itemTree", 500, 100); // go to target parent top to allow for better scrolling of the destination
doh.robot.mouseMoveAt(cerealsTreeNode.labelNode, 1000, 500);
doh.robot.mouseRelease({left: true}, 500);
doh.robot.sequence(d.getTestCallback(function(){
var children = getChildrenOfItem("Cereals");
doh.is(1, children.items.length, "banana is child of cereals");
doh.is(1003, children.items[0].id, "id of item came from dropped node");
doh.is("Banana", children.items[0].name, "name of new item came from dropped node");
var children2 = getChildrenOfItem("Fruits");
doh.is(1, children2.items.length, "banana still a child of fruits");
doh.is(1003, children2.items[0].id, "id of new item came from dropped node");
doh.is("Banana", children2.items[0].name, "name of new item came from dropped node");
dojo.global.myStore.fetch({
query: { name: "Banana" },
queryOptions: { deep: true },
onComplete: function(i){ items = i; }
});
doh.is(1, items.length, "1 banana item in store (with 2 parents)");
}), 1000);
return d;
}
}
]);
doh.register("illegal drop", [
// This tests dropping a node onto another node when both nodes represent the same item.
{
name: "try to drop Vegetables as child of Vegetables",
timeout: 10000,
runTest: function(){
var
d = new doh.Deferred(),
drag = findTreeNodeByPath("itemTree", ["Cereals", "Vegetables"]),
aboveDrop = findTreeNodeByPath("itemTree", ["Fruits", "Citrus"]);
drop = findTreeNodeByPath("itemTree", ["Fruits", "Citrus", "Vegetables"]);
doh.is(drop.item.id, drag.item.id, "both nodes point to same item");
// Drag bottom vegetables node over Citrus
doh.robot.mouseMoveAt(drag.domNode, 500, 1);
doh.robot.mousePress({left: true}, 500);
doh.robot.mouseMoveAt(aboveDrop.labelNode, 0, 500);
doh.robot.sequence(d.getTestErrback(function(){
var avatar = dojo.query(".dojoDndAvatar");
doh.t(avatar && avatar[0], "avatar found");
doh.t(dojo.hasClass(avatar[0], "dojoDndAvatarCanDrop"), "can drop");
}), 500);
// Now move it to over first Vegetables node. Should be red icon indicating drop-unallowed
doh.robot.mouseMoveAt(drop.labelNode, 0, 500);
doh.robot.sequence(d.getTestErrback(function(){
var avatar = dojo.query(".dojoDndAvatar");
doh.t(avatar && avatar[0], "avatar found");
doh.f(dojo.hasClass(avatar[0], "dojoDndAvatarCanDrop"), "can't drop");
}), 500);
// Try to drop anyway, and make sure Tree structure doesn't change
doh.robot.mouseRelease({left: true}, 500);
doh.robot.sequence(d.getTestCallback(function(){
doh.is(0, drop.getChildren().length, "drop node has no children");
doh.t(drag == findTreeNodeByPath("itemTree", ["Cereals", "Vegetables"]),
"drag node still in same place");
}), 500);
return d;
}
}
]);
doh.run();
});
</script>
</head>
</html>