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

242 lines
7.8 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 selector 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");
function clickItem(modifiers){
var i;
for(i = 0; i < modifiers.length; i++){
doh.robot.keyDown(modifiers[i], 250);
}
doh.robot.mouseClick({left: true}, 250);
for(i = modifiers.length - 1; i >= 0; i--){
doh.robot.keyUp(modifiers[i], 250);
}
}
function pressEnter(modifiers){
var i;
for(i = 0; i < modifiers.length; i++){
doh.robot.keyDown(modifiers[i], 250);
}
// Use ENTER on mac because meta-space controls the IME (switching input language),
// but SPACE on IE6 because ctrl-shift-ENTER doesn't do anything (although not sure
// why we are testing ctrl-shift combination anyway)
doh.robot.keyPress(dojo.isMac ? dojo.keys.ENTER : dojo.keys.SPACE, 250);
for(i = modifiers.length - 1; i >= 0; i--){
doh.robot.keyUp(modifiers[i], 250);
}
}
function mouseSelect(tree, item, modifiers, k){
doh.robot.mouseMoveAt(item.domNode, 250, 200);
clickItem(modifiers);
doh.robot.sequence(k);
}
function keyboardSelect(tree, item, modifiers, k){
var focused = dojo.query("#itemTree .dijitTreeLabelFocused");
if(!(focused.length > 0)){
doh.robot.keyPress(dojo.keys.TAB, 250);
doh.robot.sequence(function(){ keyboardSelect(tree, item, modifiers, k); }, 250);
return;
}
focused_node = focused[0].parentNode.parentNode.parentNode;
var diff = dojo.position(item.domNode).y - dojo.position(focused_node).y;
if(diff != 0){
if(diff > 0){
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 500);
}else{
doh.robot.keyPress(dojo.keys.UP_ARROW, 500);
}
}else{
pressEnter(modifiers);
doh.robot.sequence(k);
return;
}
doh.robot.sequence(function(){ keyboardSelect(tree, item, modifiers, k); }, 500);
}
function getSelected(tree){
//in IE, for(var i in object) will not honor the order the properties are set
//(it's in the order properties are first set even delete a property won't
//change it)
var selected = tree.dndController.getSelectedTreeNodes();
selected.sort(function(a, b){return a.item.id<b.item.id?-1:1});
return selected;
}
function testSingleItem(selector, clicker){
var d = new doh.Deferred();
// Find the fruitsTreeNode category
var fruitsTreeNode = findTreeNode("itemTree", "Fruits");
var tree = dijit.byId("itemTree");
// select fruit item
selector(tree, fruitsTreeNode, [], function(){
doh.robot.sequence(d.getTestErrback(function(){
var selected = getSelected(tree);
doh.is(1, selected.length);
doh.is(fruitsTreeNode, selected[0]);
//ctrl-click the item to deselect it
clicker([dojo.isMac ? dojo.keys.META : dojo.keys.CTRL]);
doh.robot.sequence(d.getTestCallback(function(){
var selected = getSelected(tree);
doh.is(0, selected.length);
}), 500);
}), 500);
});
return d;
}
function testCtrlSelect(selector, clicker){
var d = new doh.Deferred();
// Find the fruitsTreeNode category
var fruitsTreeNode = findTreeNode("itemTree", "Fruits");
var tree = dijit.byId("itemTree");
// select fruit item
selector(tree, fruitsTreeNode, [], function(){
doh.robot.sequence(function(){
dojo.window.scrollIntoView("itemTree");
}, 500);
// ctrl-click Cereals item
var cerealsTreeNode = findTreeNode("itemTree", "Cereals");
selector(tree, cerealsTreeNode,
[dojo.isMac ? dojo.keys.META : dojo.keys.CTRL], function(){
doh.robot.sequence(d.getTestCallback(function(){
var selected = getSelected(tree);
doh.is(2, selected.length);
doh.is(fruitsTreeNode, selected[0]);
doh.is(cerealsTreeNode, selected[1]);
doh.is(cerealsTreeNode, tree.dndController.anchor, 'anchor should be the Cereals item');
}), 500); });
});
return d;
}
function _getCtrlShiftTest(selector, keys){
return function(){
var d = new doh.Deferred();
// Find the fruitsTreeNode category
var fruitsTreeNode = findTreeNode("itemTree", "Fruits");
var cerealsTreeNode = findTreeNode("itemTree", "Cereals");
var vegetablesTreeNode = findTreeNode("itemTree", "Vegetables");
var tree = dijit.byId("itemTree");
// select fruit item (no modifiers)
selector(tree, fruitsTreeNode, [], atFruits);
function atFruits(){
// shift-select Cereals item
selector(tree, cerealsTreeNode, keys, atCereals);
}
function atCereals(){
doh.robot.sequence(d.getTestErrback(function(){
var selected = getSelected(tree);
doh.is(3, selected.length);
doh.is(fruitsTreeNode, selected[0]);
doh.is(vegetablesTreeNode, selected[1]);
doh.is(cerealsTreeNode, selected[2]);
doh.is(fruitsTreeNode, tree.dndController.anchor, 'anchor should not change 1');
// shift-select Vegetables item
keyboardSelect(tree, vegetablesTreeNode, keys, atVegetables);
}));
}
function atVegetables(){
doh.robot.sequence(d.getTestCallback(function(){
var selected = getSelected(tree);
doh.is(2, selected.length);
doh.is(fruitsTreeNode, selected[0]);
doh.is(vegetablesTreeNode, selected[1]);
doh.is(fruitsTreeNode, tree.dndController.anchor, 'anchor should not change 2');
}));
}
return d;
};
}
dojo.ready(function(){
var controller = '', ind=window.location.href.indexOf("?controller=");
if(ind > -1){
controller = window.location.href.substr(ind + 12);
controller = controller.split('&')[0];
}
doh.robot.initRobot('../test_Tree_DnD.html?testController=' + controller);
setup();
doh.register("focus page", {
name: "focus page",
timeout: 20000,
runTest: function(){
var d = new doh.Deferred();
doh.robot.mouseClick({left:true}, 100);
doh.robot.sequence(function(){
//Focus the page, so tabbing will work.
d.callback(true);
}, 250);
return d;
}
});
doh.register("item selection (keyboard)", itemSelection(keyboardSelect, pressEnter) );
doh.register("item selection (mouse)", itemSelection(mouseSelect, clickItem) );
function itemSelection(selector, clicker){
return [
{
name: "select/deselect a single item",
timeout: 15000,
runTest: function(){ return testSingleItem(selector, clicker); }
},
{
name: "ctrl select",
timeout: 15000,
runTest: function(){ return testCtrlSelect(selector, clicker); }
},
{
name: "shift select",
timeout: 15000,
runTest: _getCtrlShiftTest(selector, [dojo.keys.SHIFT])
},
{
name: "ctrl shift select",
timeout: 15000,
runTest: _getCtrlShiftTest(selector, [dojo.isMac ? dojo.keys.META : dojo.keys.CTRL, dojo.keys.SHIFT])
}
];
}
doh.run();
});
</script>
</head>
</html>