UNPKG

dijit

Version:

Dijit provides a complete collection of user interface controls based on Dojo, giving you the power to create web applications that are highly optimized for usability, performance, internationalization, accessibility, but above all deliver an incredible u

784 lines (666 loc) 32.1 kB
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>robot Tree DnD Test</title> <style> @import "../../../../util/doh/robot/robot.css"; </style> <script type="text/javascript" src="../../../../dojo/dojo.js"></script> <script type="text/javascript"> require([ "doh/runner", "dojo/robotx", "dojo/dom", "dojo/dom-class", "dojo/dom-geometry", "dojo/keys", "dojo/query", "dojo/sniff", "dojo/window", "dijit/tests/helpers", "dijit/tests/tree/robot/Tree_dnd", "dojo/domReady!" ], function(doh, robot, dom, domClass, domGeom, keys, query, has, winUtils, helpers, dndHelpers){ robot.initRobot('../test_Tree_DnD.html'); dndHelpers.setup(); // Dragging from an external source and dropping onto the Tree, // creating a duplicate of the dragged item doh.register("drop into", [ { name: "drag 'Apple' over 'Fruits'", timeout: 10000, runTest: function(){ var d = new doh.Deferred(), fruitsTreeNode = dndHelpers.findTreeNode("itemTree", "Fruits"); doh.f(fruitsTreeNode.isExpanded, "fruitsTreeNode is initially closed"); doh.t(fruitsTreeNode.isExpandable, "but has (or may have) children"); // Check state of store too var children = dndHelpers.getNamesOfChildrenOfItem("Fruits"); doh.is(1, children.categories.length, "one category child"); doh.is("Citrus", children.categories[0]); doh.is(0, children.items.length, "no item children yet"); // (Try to) make sure drag source and drop source are both in viewport winUtils.scrollIntoView(fruitsTreeNode.domNode); // Drag "Apple" onto Fruits. robot.mouseMoveAt("1001", 500, 1); robot.mousePress({left: true}, 500); robot.mouseMoveAt(fruitsTreeNode.labelNode, 500, 2000); robot.sequence(d.getTestCallback(function(){ // TODO: check drag avatar shows drop is valid (ie, avatar is green) doh.t(domClass.contains(fruitsTreeNode.rowNode, "dijitTreeRowHover"), "tree node has hover class"); doh.t(domClass.contains(fruitsTreeNode.rowNode, "dojoDndItemOver"), "tree node has DND drop class"); }), 500); return d; } }, { name: "drop 'Apple' on to 'Fruits'", timeout: 10000, runTest: function(){ var d = new doh.Deferred(); robot.mouseRelease({left: true}, 500); robot.sequence(d.getTestCallback(function(){ // Check that new item was created and added to the store. var children = dndHelpers.getNamesOfChildrenOfItem("Fruits"); doh.is(1, children.categories.length, "one category child"); doh.is("Citrus", children.categories[0]); doh.is(1, children.items.length, "one item child"); doh.is("Apple", children.items[0]); // Check that data store update was reflected in the tree var fruitsTreeNode = dndHelpers.findTreeNode("itemTree", "Fruits"); doh.t(fruitsTreeNode.isExpanded, "drop caused the node to expand"); var treeNodeChildren = fruitsTreeNode.getChildren(); doh.is(2, treeNodeChildren.length, "2 TreeNode children"); doh.is("Apple", helpers.innerText(treeNodeChildren[0].labelNode)); doh.is("Citrus", helpers.innerText(treeNodeChildren[1].labelNode)); }), 1000); // 1000ms to wait for 'Fruits' node to expand and show 'Apple' node return d; } } ]); // Moving an item w/in the tree doh.register("re-parent an item", [ { name: "drag 'Apple' from 'Fruits' to 'Citrus'", timeout: 10000, runTest: function(){ var d = new doh.Deferred(), fruitsTreeNode = dndHelpers.findTreeNode("itemTree", "Fruits"), appleTreeNode = dndHelpers.findTreeNode("itemTree", "Apple"), citrusTreeNode = dndHelpers.findTreeNode("itemTree", "Citrus"); winUtils.scrollIntoView("itemTree"); // Drag "Apple" into "Citrus". robot.mouseMoveAt(appleTreeNode.labelNode, 500, 1); robot.mousePress({left: true}, 500); robot.mouseMoveAt(citrusTreeNode.labelNode, 500, 1000); robot.mouseMoveAt(citrusTreeNode.labelNode, 500, 1000);// If prev. mouseMove caused scroll, readjust robot.sequence(d.getTestErrback(function(){ // Avatar should be green indicating a drop is OK var avatars = query(".dojoDndAvatar"); doh.is(1, avatars.length, "found avatar"); var canDrop = query(".dojoDndAvatarCanDrop"); doh.is(1, canDrop.length, "able to drop") }), 2000); robot.mouseRelease({left: true}, 500); robot.sequence(d.getTestCallback(function(){ var myStore = robot.window.myStore; // Check that data store item was orphaned from Fruits var fruitsItemChildren = dndHelpers.getNamesOfChildrenOfItem("Fruits"); doh.is(0, fruitsItemChildren.items.length, "no item children"); // Check that data store update was reflected in the tree var fruitsTreeNode = dndHelpers.findTreeNode("itemTree", "Fruits"); var fruitsTreeNodeChildren = fruitsTreeNode.getChildren(); doh.is(1, fruitsTreeNodeChildren.length, "1 TreeNode children"); doh.is("Citrus", helpers.innerText(fruitsTreeNodeChildren[0].labelNode)); // ... and parented to Citrus item var citrusItemChildren = dndHelpers.getNamesOfChildrenOfItem("Citrus"); doh.is(2, citrusItemChildren.items.length, "two item children"); doh.is("Orange", citrusItemChildren.items[0]); doh.is("Apple", citrusItemChildren.items[1]); // Check that data store update was reflected in the tree var citrusTreeNode = dndHelpers.findTreeNode("itemTree", "Citrus"); var citrusTreeNodeChildren = citrusTreeNode.getChildren(); doh.is(2, citrusTreeNodeChildren.length, "2 TreeNode children for Citrus"); doh.is("Orange", helpers.innerText(citrusTreeNodeChildren[0].labelNode), "child of Citrus TreeNode"); doh.is("Apple", helpers.innerText(citrusTreeNodeChildren[1].labelNode), "child of Citrus TreeNode"); }), 2000); return d; } }, { name: "drag 'Apple' over 'Orange'", timeout: 10000, runTest: function(){ var d = new doh.Deferred(), appleTreeNode = dndHelpers.findTreeNode("itemTree", "Apple"), orangeTreeNode = dndHelpers.findTreeNode("itemTree", "Orange"); robot.mouseMoveAt(appleTreeNode.labelNode, 500, 1); robot.mousePress({left: true}, 500); robot.mouseMoveAt(orangeTreeNode.labelNode, 500, 1000); robot.sequence(d.getTestErrback(function(){ // Avatar should be red, since 'Orange' is not a container node. var avatars = query(".dojoDndAvatar"); doh.is(1, avatars.length, "found avatar"); var canDrop = query(".dojoDndAvatarCanDrop"); doh.is(0, canDrop.length, "shouldn't be able to drop") }), 2000); robot.mouseRelease({left: true}, 500); robot.sequence(d.getTestCallback(function() { })); return d; } }, { name: "drag 'Cereals' to be after 'Fruits' (reordering)", timeout: 10000, runTest: function(){ var d = new doh.Deferred(), fruitsTreeNode = dndHelpers.findTreeNode("collectionsTree", "Fruits (2)"), cerealsTreeNode = dndHelpers.findTreeNode("collectionsTree", "Cereals (0)"), fruitsTreeNodeSize = domGeom.getContentBox(fruitsTreeNode.domNode); // (Try to) make sure drag source and drop source are both in viewport winUtils.scrollIntoView(cerealsTreeNode.domNode); // Drag 'Cereals' and drop near bottom edge of 'Fruits'. // It should become Fruits next-sibling aka Vegetables' prior-sibling // Note: if mousemove duration is too small itemTree doesn't get onmouseout event on IE6/7, // causing subsequent JS exceptions robot.mouseMoveAt(cerealsTreeNode.domNode, 500, 100); robot.mousePress({left: true}, 500); robot.mouseMoveAt(fruitsTreeNode.domNode, 500, 1000, 50, fruitsTreeNodeSize.h - 2); robot.mouseRelease({left: true}, 500); robot.sequence(d.getTestCallback(function(){ var myStore = robot.window.myStore; // Check that order of children was changed var foodsItemChildren = dndHelpers.getNamesOfChildrenOfItem("Foods").categories; doh.is(3, foodsItemChildren.length, "3 categories"); doh.is("Fruits", foodsItemChildren[0]); doh.is("Cereals", foodsItemChildren[1]); doh.is("Vegetables", foodsItemChildren[2]); // Check that data store update was reflected in the tree var foodsTreeNode = dndHelpers.findTreeNode("collectionsTree", "Foods (1)"), foodsTreeNodeChildren = foodsTreeNode.getChildren(); doh.is(3, foodsTreeNodeChildren.length, "3 TreeNode children"); doh.is("Fruits (2)", helpers.innerText(foodsTreeNodeChildren[0].labelNode)); doh.is("Cereals (0)", helpers.innerText(foodsTreeNodeChildren[1].labelNode)); doh.is("Vegetables (0)", helpers.innerText(foodsTreeNodeChildren[2].labelNode)); // Check that Fruits tree node wasn't expanded just because we dropped after it doh.f(fruitsTreeNode.isExpanded, "fruit tree node not expanded"); }), 2000); return d; } }, // We need to expand the Fruits TreeNode for the benefit of the next test, // and we do it as a separate test so that citrusTreeNode will exist etc. // by the time the next test starts. { name: "expand 'Fruits' TreeNode", timeout: 10000, runTest: function(){ var d = new doh.Deferred(), fruitsTreeNode = dndHelpers.findTreeNode("collectionsTree", "Fruits (2)"); robot.mouseMoveAt(fruitsTreeNode.expandoNode, 0, 1); robot.mouseClick({left: true}, 500); robot.sequence(d.getTestCallback(function(){ // This is just here to wait for the expand operation to take place, // and then notify DOH that we are finished }), 1000); return d; } }, { name: "drag 'Vegetables' to be after 'Citrus' (reordering)", timeout: 10000, runTest: function(){ var d = new doh.Deferred(), vegetablesTreeNode = dndHelpers.findTreeNode("collectionsTree", "Vegetables (0)"), citrusTreeNode = dndHelpers.findTreeNode("collectionsTree", "Citrus (1)"), citrusTreeNodeSize = domGeom.getContentBox(citrusTreeNode.domNode); // (Try to) make sure drag source and drop source are both in viewport winUtils.scrollIntoView(vegetablesTreeNode.domNode); // Drag 'Vegetables' and drop near bottom edge of 'Citrus'. // It should become Citrus' next-sibling robot.mouseMoveAt(vegetablesTreeNode.domNode, 500, 1); robot.mousePress({left: true}, 500); robot.mouseMoveAt(citrusTreeNode.domNode, 1000, 2000, 50, citrusTreeNodeSize.h - 2); robot.mouseRelease({left: true}, 500); robot.mouseRelease({left: true}, 500); // workaround interimittent robot bug robot.sequence(d.getTestCallback(function(){ var myStore = robot.window.myStore; // Check that order of children in data store was changed var foodsItemChildren = dndHelpers.getNamesOfChildrenOfItem("Foods").categories; doh.is(2, foodsItemChildren.length, "2 categories under foods"); doh.is("Fruits", foodsItemChildren[0]); doh.is("Cereals", foodsItemChildren[1]); var fruitsItemChildren = dndHelpers.getNamesOfChildrenOfItem("Fruits").categories; doh.is(2, fruitsItemChildren.length, "2 categories under fruits"); doh.is("Citrus", fruitsItemChildren[0]); doh.is("Vegetables", fruitsItemChildren[1]); // Check that data store update was reflected in the tree var foodsTreeNode = dndHelpers.findTreeNode("collectionsTree", "Foods (1)"), foodsTreeNodeChildren = foodsTreeNode.getChildren(); doh.is(2, foodsTreeNodeChildren.length, "2 TreeNode children for foods"); doh.is("Fruits (2)", helpers.innerText(foodsTreeNodeChildren[0].labelNode)); doh.is("Cereals (0)", helpers.innerText(foodsTreeNodeChildren[1].labelNode)); var fruitsTreeNode = dndHelpers.findTreeNode("collectionsTree", "Fruits (2)"), fruitsTreeNodeChildren = fruitsTreeNode.getChildren(); doh.is(2, fruitsTreeNodeChildren.length, "2 TreeNode children for fruits"); doh.is("Citrus (1)", helpers.innerText(fruitsTreeNodeChildren[0].labelNode)); doh.is("Vegetables (0)", helpers.innerText(fruitsTreeNodeChildren[1].labelNode)); }), 500); return d; } }, { name: "drag 'Citrus' over parent, itself", timeout: 10000, runTest: function(){ var d = new doh.Deferred(), citrusTreeNode = dndHelpers.findTreeNode("itemTree", "Citrus"), fruitsTreeNode = dndHelpers.findTreeNode("itemTree", "Fruits"); robot.mouseMoveAt(citrusTreeNode.labelNode, 500, 1); robot.mousePress({left: true}, 500); robot.mouseMoveAt(fruitsTreeNode.labelNode, 500, 1000); robot.sequence(d.getTestErrback(function(){ // Avatar should be red, since dropping an item onto its own parent is meaningless var avatars = query(".dojoDndAvatar"); doh.is(1, avatars.length, "found avatar"); var canDrop = query(".dojoDndAvatarCanDrop"); doh.is(0, canDrop.length, "shouldn't be able to drop") }), 2000); robot.mouseMoveAt(citrusTreeNode.labelNode, 500, 1); robot.sequence(d.getTestErrback(function(){ // Avatar should be red, since dropping an item onto itself is meaningless var avatars = query(".dojoDndAvatar"); doh.is(1, avatars.length, "found avatar"); var canDrop = query(".dojoDndAvatarCanDrop"); doh.is(0, canDrop.length, "shouldn't be able to drop") }), 2000); robot.mouseRelease({left: true}, 500); robot.sequence(d.getTestCallback(function(){ }), 500); return d; } } ]); doh.register("drag between trees", [ { name: "move 'Vegetables' from left tree to right tree, from 'Fruits' to 'Foods'", timeout: 10000, runTest: function(){ var d = new doh.Deferred(), vegetablesTreeNode = dndHelpers.findTreeNode("collectionsTree", "Vegetables (0)"), foodsTreeNode = registry.byId("itemTree").rootNode; robot.mouseMoveAt(vegetablesTreeNode.labelNode, 0, 1); robot.mousePress({left: true}, 500); robot.mouseMoveAt(foodsTreeNode.labelNode, 500, 1000); robot.mouseRelease({left: true}, 500); robot.sequence(d.getTestCallback(function(){ var myStore = robot.window.myStore; // Check that data store item was orphaned from Fruits var fruitsItemChildren = dndHelpers.getNamesOfChildrenOfItem("Fruits"); doh.is(1, fruitsItemChildren.categories.length, "one fruits child"); doh.is("Citrus", fruitsItemChildren.categories[0], "fruit child 0"); // And added to Foods var foodsItemChildren = dndHelpers.getNamesOfChildrenOfItem("Foods"); doh.is(3, foodsItemChildren.categories.length, "three foods children"); doh.is("Fruits", foodsItemChildren.categories[0], "food child 0"); doh.is("Cereals", foodsItemChildren.categories[1], "food child 1"); doh.is("Vegetables", foodsItemChildren.categories[2], "food child 2"); }), 500); return d; } } ]); doh.register("drop in Tree outside of a treeNode", [ { name: "drop 'Orange' within Tree but not over a TreeNode", timeout: 10000, runTest: function(){ var d = new doh.Deferred(); var orangeTreeNode = dndHelpers.findTreeNode("itemTree", "Orange"); robot.mouseMoveAt(orangeTreeNode.labelNode, 0, 1); robot.mousePress({left: true}, 500); robot.mouseMoveAt("itemTree", 500, 500, 5, 100); robot.mouseRelease({left: true}, 500); robot.sequence(d.getTestCallback(function(){ var org = dndHelpers.findTreeNode("itemTree", "Orange"); doh.t( org != null); }), 1000); return d; } } ]); // special function to allow dragging within a very short test window function dragSourceToItemTree(srcId, destId, after){ var child = dom.byId(srcId, robot.doc), parent = child.parentNode, childPos = domGeom.position(child), parentPos = domGeom.position(parent), destTreeNode = dndHelpers.findTreeNode("itemTree", destId); winUtils.scrollIntoView(parent); parent.scrollTop += childPos.y + childPos.h - parentPos.y - parentPos.h; robot.mouseMoveAt(srcId, 500, 1); robot.mousePress({left: true}, 500); robot.mouseMoveAt(srcId, 1000, 500, (childPos.w >> 1) + 2, childPos.h >> 1); // start drag before scrolling to dest robot.sequence(function(){ winUtils.scrollIntoView("itemTree"); }, 0); robot.mouseMoveAt(destTreeNode.labelNode, 500, 1); // move to dest center robot.mouseMoveAt(destTreeNode.labelNode, 500, 500, 0, after ? (domGeom.position(destTreeNode.domNode).h - domGeom.position(destTreeNode.labelNode).y + domGeom.position(destTreeNode.domNode).y - 1) : -2 ); robot.mouseRelease({left: true}, 500); } //================= // Testing drag before and after items // Dragging from an external source and dropping onto the Tree, creating a duplicate of the dragged item //----------------- doh.register("drag before and after items", [ { name: "drag before the first item", timeout: 10000, runTest: function(){ var d = new doh.Deferred(); // Drag "Banana" before Orange. dragSourceToItemTree("1003", "Orange", !"after"); robot.sequence(d.getTestCallback(function(){ // Check that data store update was reflected in the tree var citrusTreeNode = dndHelpers.findTreeNode("itemTree", "Citrus"); var treeNodeChildren = citrusTreeNode.getChildren(); doh.is(3, treeNodeChildren.length, "3 TreeNode children"); doh.is("Banana", helpers.innerText(treeNodeChildren[0].labelNode)); doh.is("Orange", helpers.innerText(treeNodeChildren[1].labelNode)); doh.is("Apple", helpers.innerText(treeNodeChildren[2].labelNode)); // ... and parented to Citrus item var citrusItemChildren = dndHelpers.getNamesOfChildrenOfItem("Citrus"); doh.is(3, citrusItemChildren.items.length, "three item children"); doh.is("Banana", citrusItemChildren.items[0]); doh.is("Orange", citrusItemChildren.items[1]); doh.is("Apple", citrusItemChildren.items[2]); }), 1000); return d; } }, { name: "drag after the first item", timeout: 10000, runTest: function(){ var d = new doh.Deferred(); // Drag "Tomato" after Banana. dragSourceToItemTree("1004", "Banana", "after"); robot.sequence(d.getTestCallback(function(){ // Check that data store update was reflected in the tree var citrusTreeNode = dndHelpers.findTreeNode("itemTree", "Citrus"); var treeNodeChildren = citrusTreeNode.getChildren(); doh.is(4, treeNodeChildren.length, "4 TreeNode children"); doh.is("Banana", helpers.innerText(treeNodeChildren[0].labelNode)); doh.is("Tomato", helpers.innerText(treeNodeChildren[1].labelNode)); doh.is("Orange", helpers.innerText(treeNodeChildren[2].labelNode)); doh.is("Apple", helpers.innerText(treeNodeChildren[3].labelNode)); // ... and parented to Citrus item var citrusItemChildren = dndHelpers.getNamesOfChildrenOfItem("Citrus"); doh.is(4, citrusItemChildren.items.length, "four item children"); doh.is("Banana", citrusItemChildren.items[0]); doh.is("Tomato", citrusItemChildren.items[1]); doh.is("Orange", citrusItemChildren.items[2]); doh.is("Apple", citrusItemChildren.items[3]); }), 1000); return d; } }, { name: "drag before in the middle of the list of items", timeout: 10000, runTest: function(){ var d = new doh.Deferred(); // Drag "Pepper" before Orange. dragSourceToItemTree("1005", "Orange", !"after"); robot.sequence(d.getTestCallback(function(){ // Check that data store update was reflected in the tree var citrusTreeNode = dndHelpers.findTreeNode("itemTree", "Citrus"); var treeNodeChildren = citrusTreeNode.getChildren(); doh.is(5, treeNodeChildren.length, "5 TreeNode children"); doh.is("Banana", helpers.innerText(treeNodeChildren[0].labelNode)); doh.is("Tomato", helpers.innerText(treeNodeChildren[1].labelNode)); doh.is("Pepper", helpers.innerText(treeNodeChildren[2].labelNode)); doh.is("Orange", helpers.innerText(treeNodeChildren[3].labelNode)); doh.is("Apple", helpers.innerText(treeNodeChildren[4].labelNode)); // ... and parented to Citrus item var citrusItemChildren = dndHelpers.getNamesOfChildrenOfItem("Citrus"); doh.is(5, citrusItemChildren.items.length, "five item children"); doh.is("Banana", citrusItemChildren.items[0]); doh.is("Tomato", citrusItemChildren.items[1]); doh.is("Pepper", citrusItemChildren.items[2]); doh.is("Orange", citrusItemChildren.items[3]); doh.is("Apple", citrusItemChildren.items[4]); }), 1000); return d; } }, { name: "drag after in the middle of the list of items", timeout: 10000, runTest: function(){ var d = new doh.Deferred(); // Drag "Wheat" after Orange. dragSourceToItemTree("1006", "Orange", "after"); robot.sequence(d.getTestCallback(function(){ // Check that data store update was reflected in the tree var citrusTreeNode = dndHelpers.findTreeNode("itemTree", "Citrus"); var treeNodeChildren = citrusTreeNode.getChildren(); doh.is(6, treeNodeChildren.length, "6 TreeNode children"); doh.is("Banana", helpers.innerText(treeNodeChildren[0].labelNode)); doh.is("Tomato", helpers.innerText(treeNodeChildren[1].labelNode)); doh.is("Pepper", helpers.innerText(treeNodeChildren[2].labelNode)); doh.is("Orange", helpers.innerText(treeNodeChildren[3].labelNode)); doh.is("Wheat", helpers.innerText(treeNodeChildren[4].labelNode)); doh.is("Apple", helpers.innerText(treeNodeChildren[5].labelNode)); // ... and parented to Citrus item var citrusItemChildren = dndHelpers.getNamesOfChildrenOfItem("Citrus"); doh.is(6, citrusItemChildren.items.length, "six item children"); doh.is("Banana", citrusItemChildren.items[0]); doh.is("Tomato", citrusItemChildren.items[1]); doh.is("Pepper", citrusItemChildren.items[2]); doh.is("Orange", citrusItemChildren.items[3]); doh.is("Wheat", citrusItemChildren.items[4]); doh.is("Apple", citrusItemChildren.items[5]); }), 1000); return d; } }, { name: "drag before on the last item", timeout: 10000, runTest: function(){ var d = new doh.Deferred(); // Drag "Corn" before Apple. dragSourceToItemTree("1007", "Apple", !"after"); robot.sequence(d.getTestCallback(function(){ // Check that data store update was reflected in the tree var citrusTreeNode = dndHelpers.findTreeNode("itemTree", "Citrus"); var treeNodeChildren = citrusTreeNode.getChildren(); doh.is(7, treeNodeChildren.length, "7 TreeNode children"); doh.is("Banana", helpers.innerText(treeNodeChildren[0].labelNode)); doh.is("Tomato", helpers.innerText(treeNodeChildren[1].labelNode)); doh.is("Pepper", helpers.innerText(treeNodeChildren[2].labelNode)); doh.is("Orange", helpers.innerText(treeNodeChildren[3].labelNode)); doh.is("Wheat", helpers.innerText(treeNodeChildren[4].labelNode)); doh.is("Corn", helpers.innerText(treeNodeChildren[5].labelNode)); doh.is("Apple", helpers.innerText(treeNodeChildren[6].labelNode)); // ... and parented to Citrus item var citrusItemChildren = dndHelpers.getNamesOfChildrenOfItem("Citrus"); doh.is(7, citrusItemChildren.items.length, "seven item children"); doh.is("Banana", citrusItemChildren.items[0]); doh.is("Tomato", citrusItemChildren.items[1]); doh.is("Pepper", citrusItemChildren.items[2]); doh.is("Orange", citrusItemChildren.items[3]); doh.is("Wheat", citrusItemChildren.items[4]); doh.is("Corn", citrusItemChildren.items[5]); doh.is("Apple", citrusItemChildren.items[6]); }), 1000); return d; } }, { name: "drag after on the last item", timeout: 10000, runTest: function(){ var d = new doh.Deferred(); // Drag "Spinach" after Apple. dragSourceToItemTree("1008", "Apple", "after"); robot.sequence(d.getTestCallback(function(){ // Check that data store update was reflected in the tree var citrusTreeNode = dndHelpers.findTreeNode("itemTree", "Citrus"); var treeNodeChildren = citrusTreeNode.getChildren(); doh.is(8, treeNodeChildren.length, "8 TreeNode children"); doh.is("Banana", helpers.innerText(treeNodeChildren[0].labelNode)); doh.is("Tomato", helpers.innerText(treeNodeChildren[1].labelNode)); doh.is("Pepper", helpers.innerText(treeNodeChildren[2].labelNode)); doh.is("Orange", helpers.innerText(treeNodeChildren[3].labelNode)); doh.is("Wheat", helpers.innerText(treeNodeChildren[4].labelNode)); doh.is("Corn", helpers.innerText(treeNodeChildren[5].labelNode)); doh.is("Apple", helpers.innerText(treeNodeChildren[6].labelNode)); doh.is("Spinach",helpers.innerText(treeNodeChildren[7].labelNode)); // ... and parented to Citrus item var citrusItemChildren = dndHelpers.getNamesOfChildrenOfItem("Citrus"); doh.is(8, citrusItemChildren.items.length, "eight item children"); doh.is("Banana", citrusItemChildren.items[0]); doh.is("Tomato", citrusItemChildren.items[1]); doh.is("Pepper", citrusItemChildren.items[2]); doh.is("Orange", citrusItemChildren.items[3]); doh.is("Wheat", citrusItemChildren.items[4]); doh.is("Corn", citrusItemChildren.items[5]); doh.is("Apple", citrusItemChildren.items[6]); doh.is("Spinach",citrusItemChildren.items[7]); }), 1000); return d; } } ]); doh.register("multi-dnd", [ { name: "click on a new node and drag should select it", timeout: 15000, runTest: function(){ var d = new doh.Deferred(), fruitsTreeNode = dndHelpers.findTreeNode("itemTree", "Fruits"), cerealsTreeNode = dndHelpers.findTreeNode("itemTree", "Cereals"), tree = registry.byId("itemTree"); // click fruit item robot.mouseMoveAt(fruitsTreeNode.rowNode, 0, 1); robot.mouseClick({left: true}, 500); // drag cereal node to fruits node robot.mouseMoveAt(cerealsTreeNode.rowNode, 0, 1); robot.mousePress({left: true}, 500); robot.mouseMoveAt(fruitsTreeNode.rowNode, 500, 1000); robot.mouseRelease({left: true}, 500); robot.sequence(d.getTestCallback(function(){ doh.t(fruitsTreeNode == cerealsTreeNode.getParent()); }), 1000); return d; } }, { name: "drag parent and child to another child should do nothing", timeout: 15000, runTest: function(){ var d = new doh.Deferred(), citrusTreeNode = dndHelpers.findTreeNode("itemTree", "Citrus"), citrusParent = citrusTreeNode.getParent(), orangeTreeNode = dndHelpers.findTreeNode("itemTree", "Orange"), appleTreeNode = dndHelpers.findTreeNode("itemTree", "Apple"), tree = registry.byId("itemTree"); doh.is(citrusTreeNode, orangeTreeNode.getParent(), 'orange is child of citrus'); // click Citrus item robot.mouseMoveAt(citrusTreeNode.rowNode, 0, 1); robot.mouseClick({left: true}, 500); // ctrl-click Orange item robot.mouseMoveAt(orangeTreeNode.rowNode, 0, 1); robot.keyDown(has("mac") ? keys.META : keys.CTRL, 500); robot.mouseClick({left: true}, 500); robot.keyUp(has("mac") ? keys.META : keys.CTRL, 500); // drag to Apple Foods robot.mousePress({left: true}, 500); robot.mouseMoveAt(appleTreeNode.rowNode, 500, 500); robot.mouseRelease({left: true}, 500); robot.sequence(d.getTestCallback(function(){ doh.is(citrusParent, citrusTreeNode.getParent(), 'citrus parent should not change'); doh.is(citrusTreeNode, orangeTreeNode.getParent(), 'orange should still be under citrus'); }), 1000); return d; } }, { name: "drag parent and child should only reparent parent", timeout: 15000, runTest: function(){ var d = new doh.Deferred(), citrusTreeNode = dndHelpers.findTreeNode("itemTree", "Citrus"), orangeTreeNode = dndHelpers.findTreeNode("itemTree", "Orange"), cerealsTreeNode = dndHelpers.findTreeNode("itemTree", "Cereals"), tree = registry.byId("itemTree"); doh.is(citrusTreeNode, orangeTreeNode.getParent(), 'orange is child of citrus'); // click Citrus category robot.mouseMoveAt(citrusTreeNode.rowNode, 0, 1); robot.mouseClick({left: true}, 500); // ctrl-click Orange item robot.mouseMoveAt(orangeTreeNode.rowNode, 0, 1); robot.keyDown(has("mac") ? keys.META : keys.CTRL, 500); robot.mouseClick({left: true}, 500); robot.keyUp(has("mac") ? keys.META : keys.CTRL, 500); // drag to Cereals category robot.mousePress({left: true}, 500); robot.mouseMoveAt(cerealsTreeNode.rowNode, 500, 500); robot.mouseRelease({left: true}, 500); robot.sequence(d.getTestCallback(function(){ doh.is(cerealsTreeNode, citrusTreeNode.getParent(), 'citrus should be under cereals'); doh.is(citrusTreeNode, orangeTreeNode.getParent(), 'orange should still be under citrus'); }), 1000); return d; } }, { name: "drag multiple items", timeout: 15000, runTest: function(){ var d = new doh.Deferred(), vegetablesTreeNode = dndHelpers.findTreeNode("itemTree", "Vegetables"), cerealsTreeNode = dndHelpers.findTreeNode("itemTree", "Cereals"), foodsTreeNode = dndHelpers.findTreeNode("itemTree", "Foods"), tree = registry.byId("itemTree"); // click Vegetables item robot.mouseMoveAt(vegetablesTreeNode.rowNode, 0, 1); robot.mouseClick({left: true}, 500); // ctrl-click cereals item robot.mouseMoveAt(cerealsTreeNode.rowNode, 0, 1); robot.keyDown(has("mac") ? keys.META : keys.CTRL, 500); robot.mouseClick({left: true}, 500); robot.keyUp(has("mac") ? keys.META : keys.CTRL, 500); // Drop onto root item Foods. // Note that Vegetables is already a child of Foods. robot.mousePress({left: true}, 500); robot.mouseMoveAt(foodsTreeNode.rowNode, 500, 500); robot.mouseRelease({left: true}, 500); robot.sequence(d.getTestCallback(function(){ doh.is(foodsTreeNode, vegetablesTreeNode.getParent()); doh.is(foodsTreeNode, cerealsTreeNode.getParent()); }), 1000); return d; } } ]); doh.run(); }); </script> </head> </html>