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

1472 lines
52 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>doh.robot ComboBox/FilteringSelect General and A11Y Tests</title>
<style>
@import "../../../../util/doh/robot/robot.css";
</style>
<!-- required: dojo.js -->
<script type="text/javascript" src="../../../../dojo/dojo.js"></script>
<script type="text/javascript" src="../../helpers.js"></script>
<script type="text/javascript">
dojo.require("dijit.robotx");
dojo.require("dojo.aspect");
// TODO: provide URL toggle for FilteringSelect
var testWidget = "dijit.form.ComboBox";
var qstr = window.location.search.substr(1);
if(qstr.length){
var qparts = qstr.split("&");
for(var x=0; x<qparts.length; x++){
var tp = qparts[x].split("=");
if(tp[0] == "testWidget"){
testWidget = tp[1];
}
}
}
isComboBox = testWidget=="dijit.form.ComboBox";
dojo.ready(function(){
doh.robot.initRobot('../_autoComplete.html?testWidget='+testWidget);
var arrowlessComboBoxes=['arrowless'];
var robot_typeValue = function(combo, text, value, expectedText){
if(value===undefined) value = text;
if(expectedText===undefined) expectedText = text;
var d = new doh.Deferred();
// setup watch() on "value" and "displayedValue"
var dv, v;
var h1 = combo.watch("displayedValue", function(name, oldVal, newVal){ dv = newVal; });
var h2 = combo.watch("value", function(name, oldVal, newVal){ v = newVal; });
combo.focusNode.focus();
combo.itemError = false;
doh.robot.sequence(function(){ combo.set("value", null); }, 500);
doh.robot.typeKeys(text.replace(/^(.).*$/, "$1"), 500);
doh.robot.typeKeys(text.replace(/^./, ""), 1500);
doh.robot.keyPress(dojo.keys.ENTER, 1500);
doh.robot.sequence(d.getTestCallback(function(){
// general tests
doh.is(value, combo.get("value"), "combo.get(value)");
doh.is(expectedText, combo.focusNode.value, "expectedText");
doh.f(combo._opened, "not opened");
doh.f(combo.itemError, "no itemError");
// watch() tests
doh.is(expectedText, dv, "watch of displayedValue");
doh.is(value, v, "watch of value");
h1.unwatch();
h2.unwatch();
}), 2000);
return d;
};
var findMenuItem = function(combo, text){
var node = combo.dropDown.domNode.firstChild;
while(innerText(node).indexOf(text) < 0 && node.nextSibling){
node = node.nextSibling;
}
return node;
};
// Select a value from the drop down using the keyboard, using "more choices" button to page as necessary
var robot_a11ySelectValue = function(combo, text, value, expectedText){
if(!value) value = text;
if(!expectedText) expectedText = text;
var d = new doh.Deferred();
// setup watch() on "value", "displayedValue", "item"
var dv, v, i;
var h1 = combo.watch("displayedValue", function(name, oldVal, newVal){ dv = newVal; });
var h2 = combo.watch("value", function(name, oldVal, newVal){ v = newVal; });
var h3 = combo.watch("item", function(name, oldVal, newVal){ i = newVal; });
combo.focusNode.focus();
combo.itemError = false;
doh.robot.sequence(function(){ combo.set("value", null); }, 1000);
doh.robot.mouseMoveAt(combo.focusNode, 0); // get cursor out of the way so that wiggling doesn't mess up test
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 500);
var repeat = function(){
var node = findMenuItem(combo, text);
var isMoreChoices = node == combo.dropDown.nextButton;
var selected = combo.dropDown.getHighlightedOption() || combo.dropDown.domNode.firstChild;
while(selected != node){
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 300);
selected = selected.nextSibling;
}
doh.robot.keyPress(dojo.keys.ENTER, 500);
if(isMoreChoices){
// can go faster since the data will have loaded by now
doh.robot.sequence(repeat, 1000);
}else{
doh.robot.sequence(d.getTestCallback(function(){
doh.is(value, combo.get("value"), "combo.get(value)");
doh.is(expectedText, combo.focusNode.value, "expectedText");
doh.f(combo._opened, "not opened");
doh.f(combo.itemError, "no itemError");
// watch() tests
doh.is(expectedText, dv, "watch of displayedValue");
doh.is(value, v, "watch of value");
doh.is(value, isComboBox ? i[combo.searchAttr] : combo.store.getIdentity(i), "watch of item");
h1.unwatch();
h2.unwatch();
h3.unwatch();
}), 500);
}
};
// first time, wait for the data to come in
doh.robot.sequence(repeat, 3000);
return d;
};
// Wait for data stores to finish loading before starting tests
doh.register("wait for data store load",
dojo.map(["store", "store2", "stateStore", "dijitStore"], function(name){
return {
name: "wait for " + name,
timeout: 5000,
runTest: function(){
var d = new doh.Deferred();
dojo.global[name].fetch({
onComplete: function(){
d.callback(true);
},
onError: function(e){
d.errback(e);
}
});
return d;
}
};
})
);
// Verify that all of the form values are correct at init
doh.register("verify values",
{
name:"verifyValues",
runTest:function(){
// Spot check of initial conditions of widgets and DOM nodes
doh.is("California", dijit.byId("setvaluetest").get("displayedValue"), "state1 displayed value");
doh.is(isComboBox ? "California" : "CA", dijit.byId("setvaluetest").get("value"), "state1 value");
doh.is("not fired yet!", dojo.byId("oc1").value, "state1 onChange hasn't fired");
// Test that dojo.query() finds hidden field, see #8660
var elems = dojo.doc.getElementsByName("state2");
doh.is(1, elems.length, "exactly one node with name=state2");
doh.is(isComboBox ? "California" : "CA", elems[0].value, "state2 submit value");
var qelems = dojo.query("input[name=state2]");
doh.is(1, qelems.length, "dojo.query() returns exactly one node with name=state2");
doh.is(isComboBox ? "California" : "CA", qelems[0].value, "state2 dojo.query value");
doh.is(1, dojo.query("input[name=state3]").length,
"Just one input inside of " + testWidget + " w/name specified");
if(!isComboBox){
// Filtering select should have two inputs, but the displayed one is hidden
doh.is(2, dojo.query("input", dijit.byId("combo3").domNode).length-dojo.query("input[readOnly]", dijit.byId("combo3").domNode).length,
"Two inputs inside of filteringSelect");
}
doh.is("sticks & stones", dijit.byId("specialchars").get("displayedValue"), "specialchars get('displayValue')");
doh.is(isComboBox ? "sticks & stones" : "sticks", dijit.byId("specialchars").get("value"), "specialchars value");
doh.is("sticks & stones", dojo.query("input[id=specialchars]")[0].value, "specialchars display value via DOMNode");
doh.is(isComboBox ? "sticks & stones" : "sticks", dojo.query("input[name=specialchars]")[0].value, "specialchars submit value via DOMNode");
}
}
);
var comboIds=['setvaluetest','datatest','combo3','combobox4','arrowless','descending'];
for(var i=0; i<comboIds.length; i++){
doh.register("query input by name",{
name:comboIds[i],
combo:comboIds[i],
runTest:function(){
this.combo = dijit.byId(this.combo);
var queried=dojo.query("input[name="+(this.combo.valueNode||this.combo.focusNode).name+"]");
doh.is(1,queried.length,"Expected 1 combo with name "+(this.combo.valueNode||this.combo.focusNode).name+", found "+queried.length);
doh.is(this.combo.valueNode||this.combo.focusNode,queried[0],"Combo's valueNode did not match the one found by dojo.query.");
}
});
}
doh.register("set('displayedValue', ...)", [
// Set displayedValue to Kentucky.
// This should be a valid assignment.
{
timeout:5000,
name:"valid",
runTest:function(){
var d = new doh.Deferred(),
combo = dijit.byId("setvaluetest");
var dv, v;
combo.watch("displayedValue", function(name, oldVal, newVal){ dv = newVal; });
combo.watch("value", function(name, oldVal, newVal){ v = newVal; });
combo.set('displayedValue', 'Kentucky');
doh.robot.sequence(d.getTestCallback(function(){
var oc1=dojo.byId('oc1');
doh.is(isComboBox ? "Kentucky" : "KY", combo.get("value"), "get('value')");
doh.is(isComboBox ? "Kentucky" : "KY", oc1.value, "onChange");
if(!isComboBox){
doh.t(combo.isValid(), "isValid()");
}
doh.is(isComboBox ? "Kentucky" : "KY", v, "watch of value");
doh.is("Kentucky", dv, "watch of displayedValue")
}), 900);
return d;
}
},
// Set displayedValue to Canada.
// This should be an invalid assignment for FilteringSelect, but ok for ComboBox.
{
timeout:5000,
name:"invalid",
runTest:function(){
var d = new doh.Deferred(),
combo = dijit.byId("setvaluetest");
combo.set('displayedValue', 'Canada');
doh.robot.sequence(d.getTestCallback(function(){
var oc1=dojo.byId('oc1');
doh.is(isComboBox ? "Canada" : "", combo.get("value"), "get('value')");
doh.is(isComboBox ? "Canada" : "", oc1.value, "onChange");
if(!isComboBox){
doh.f(combo.isValid(), "isValid()");
}
}), 900);
return d;
}
}
]);
doh.register("set('value', ...)", [
// Set value to null.
// This should be an invalid assignment for FilteringSelect, but ok for ComboBox.
{
timeout:5000,
name:"nullvalue",
runTest:function(){
var d = new doh.Deferred(),
combo = dijit.byId("setvaluetest");
combo.set("value", null);
doh.robot.sequence(d.getTestCallback(function(){
var oc1=dojo.byId('oc1');
doh.is("", combo.get("value"), "get('value')");
doh.is("", oc1.value, "onChange");
if(!isComboBox){
doh.f(combo.isValid(), "isValid()");
}
}), 900);
return d;
}
}
// TODO: test some other set("value") calls
]);
doh.register("back compat", [
function fetch_optionTags(){
// Make sure that myComboBox.store.fetch() still works even though
// ComboBox is using the new dojo.store API
var d = new doh.Deferred();
doh.t(dijit.byId("setvaluetest").store, "store exists");
doh.t(dojo.isFunction(dijit.byId("setvaluetest").store.fetch), "fetch exists");
dijit.byId("setvaluetest").store.fetch({
onBegin: d.getTestCallback(function(total){
doh.is(61, total, "# records");
})
});
return d;
},
function fetch_externalStore(){
// Make sure that myComboBox.store.fetch() still works even though
// ComboBox is using the new dojo.store API
var d = new doh.Deferred();
doh.t(dijit.byId("datatest").store, "store exists");
doh.t(dojo.isFunction(dijit.byId("datatest").store.fetch), "fetch exists");
dijit.byId("datatest").store.fetch({
onBegin: d.getTestCallback(function(total){
doh.is(61, total, "# records");
})
});
return d;
},
{
timeout:60000,
name:"fetch() called with string",
runTest:function(){
// Make sure typing into a ComboBox connected to an
// old dojo.data store calls store.fetch() with a String argument rather than a Regex
var d = new doh.Deferred();
combo = dijit.byId("datatest");
doh.t("fetch" in combo.store,
"combo.store has fetch() method (i.e. it's the old dojo.data API)");
combo.focusNode.focus();
doh.robot.sequence(function(){ combo.set("value", null); }, 500);
// Keypress (below) will trigger a call to store.fetch, which will then call this code.
doh.robot.sequence(function(){
var handle = dojo.aspect.after(combo.store, "fetch", d.getTestErrback(function(args){
handle.remove();
doh.isNot(null, args && args.query && args.query.name,
"args.query.name set");
doh.is("string", typeof args.query.name, "typeof searchAttr");
}), true);
}, 500);
doh.robot.keyPress("k", 500);
// Code below merely to let ComboBox finish any pending requests, so "datatest" ComboBox
// doesn't grab focus in the middle of with the "direct input" test below.
doh.robot.keyPress(dojo.keys.ENTER, 500);
doh.robot.sequence(function(){
d.callback(true);
}, 500);
return d;
}
}
]);
!isComboBox && doh.register("FilteringSelect back-compat", [
function setDisplayedValue(){
// Make sure that set("displayedValue", ...) on a FilteringSelect connected to an
// old dojo.data store calls store.fetch() with a String argument rather than a Regex
var combo = dijit.byId("datatest");
doh.t("fetch" in combo.store, "combo.store has fetch() method (i.e. it's the old dojo.data API)");
var handle = dojo.aspect.after(combo.store, "fetch", function(args){
handle.remove();
doh.isNot(null, args && args.query && args.query.name, "args.query.name set");
doh.is("string", typeof args.query.name, "typeof searchAttr");
}, true);
combo.set("displayedValue", "Kentucky");
}
]);
doh.register("direct input", [
// Type a valid value and press Enter
{
timeout:60000,
name:"valid value",
combo:"setvaluetest",
runTest:function(){
return robot_typeValue(dijit.byId(this.combo), "California", isComboBox? undefined : "CA", isComboBox? undefined : "California");
}
},
// Type an invalid value and press Enter
{
timeout:60000,
name:"invalid value",
combo:"setvaluetest",
runTest:function(){
return robot_typeValue((this.combo = dijit.byId(this.combo)), "zxcxarax", isComboBox?"zxcxarax":"");
}
},
// Check on the invalid value from the previous test
{
timeout:60000,
name:"invalid value 2",
combo:"setvaluetest",
runTest:function(){
this.combo = dijit.byId(this.combo);
if(isComboBox){
doh.is("zxcxarax", this.combo.get("value"), "Expected value of zxcxarax, got "+this.combo.get("value")+", text is:"+this.combo.focusNode.value);
doh.t(this.combo.isValid(), "Bad value not permitted in ComboBox. Value is: "+this.combo.get("value")+", text is:"+this.combo.focusNode.value);
}else{
doh.is("", this.combo.get("value"), "Expected value of '', got "+this.combo.get("value")+", text is:"+this.combo.focusNode.value);
doh.t(!this.combo.isValid(), "Bad value permitted in FilteringSelect. Value is: "+this.combo.get("value")+", text is:"+this.combo.focusNode.value);
}
doh.t(!this.combo.itemError, "Should not have an itemError");
},
tearDown:function(){
this.combo.set("value", isComboBox?"Alaska":"AK");
}
}
]);
// Test that enter key submits the form, but only when the drop down is closed
doh.register("enter key", {
timeout:60000,
name:"submit",
runTest:function(){
dojo.global.formSubmitted = false;
var d = new doh.Deferred();
var combo = dijit.byId("setvaluetest");
combo.focus();
// Initial conditions:
doh.robot.sequence(d.getTestErrback(function(){
var popup = dijit.byId('setvaluetest_popup');
doh.t(!popup || isHidden(popup), "popup hidden");
}), 500);
// Down arrow opens the drop down
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 500);
doh.robot.sequence(d.getTestErrback(function(){
var popup = dijit.byId('setvaluetest_popup');
doh.t(popup && isVisible(popup), "popup visible");
}), 500);
// Enter key should select value and close drop down but not submit form
doh.robot.keyPress(dojo.keys.ENTER, 500);
doh.robot.sequence(d.getTestErrback(function(){
var popup = dijit.byId('setvaluetest_popup');
doh.t(!popup || isHidden(popup), "popup hidden");
doh.f(dojo.global.formSubmitted, "form not submitted yet")
}), 500);
// Enter key again should submit form
doh.robot.keyPress(dojo.keys.ENTER, 500);
doh.robot.sequence(d.getTestCallback(function(){
var popup = dijit.byId('setvaluetest_popup');
doh.t(!popup || isHidden(popup), "popup hidden");
doh.t(dojo.global.formSubmitted, "form submitted")
}), 500);
return d;
}
});
doh.register("drop down navigation / keyboard", [
// Select a value from the drop down using the keyboard,
// used "more choices" button to page as necessary
{
timeout:60000,
name:"setvaluetest_a11y",
combo:"setvaluetest",
runTest:function(){
return robot_a11ySelectValue(dijit.byId(this.combo), "Texas", isComboBox? "Texas" : "TX", "Texas");
}
}
]);
// Test that drop down choices are filtered to values matching what user has typed
doh.register("filtering of drop down", [
{
timeout:60000,
name:"type C",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("setvaluetest");
combo.itemError = false;
combo.focusNode.focus();
// Filter drop down list to entries starting with "C"
doh.robot.sequence(function(){ combo.set("value", null); }, 1000);
doh.robot.keyPress("C", 100);
doh.robot.sequence(d.getTestCallback(function(){
// Check that drop down list has appeared, and contains California, Colorado, Connecticut
var list = dojo.byId("setvaluetest_popup");
doh.t(list, "drop down exists");
doh.t(isVisible(list), "drop down is visible");
var entries = dojo.query(".dijitMenuItem", list).filter(isVisible);
doh.is(3, entries.length, "three entries in drop down: " + list.innerHTML);
doh.is("California (CA)", innerText(entries[0]), "list #1");
doh.is("Colorado (CO)", innerText(entries[1]), "list #2");
doh.is("Connecticut (CT)", innerText(entries[2]), "list #3");
// Check that search-string highlighting is working
doh.is('<span class=dijitcomboboxhighlightmatch>c</span>onnecticut (ct)', entries[2].innerHTML.toLowerCase().replace(/"/g, ""), //balanced"
"highlighting is working");
doh.f(combo.itemError, testWidget + " item mismatch");
}), 900);
return d;
}
},
{
timeout:60000,
name:"type 'o' after 'C'",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("setvaluetest");
combo.itemError = false;
// Filter drop down list to entries starting with "Co"
doh.robot.keyPress("o", 100);
doh.robot.sequence(d.getTestCallback(function(){
// Check that drop down list is still there, and California has disappeared
var list = dojo.byId("setvaluetest_popup");
doh.t(list, "drop down exists");
doh.t(isVisible(list), "drop down is visible");
var entries = dojo.query(".dijitMenuItem", list).filter(isVisible);
doh.is(2, entries.length, "three entries in drop down: " + list.innerHTML);
doh.is("Colorado (CO)", innerText(entries[0]), "list #1");
doh.is("Connecticut (CT)", innerText(entries[1]), "list #2");
doh.f(combo.itemError, testWidget + " item mismatch");
}), 900);
return d;
}
},
{
timeout:60000,
name:"type backspace",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("setvaluetest");
combo.itemError = false;
doh.robot.keyPress(dojo.keys.BACKSPACE, 100);
doh.robot.sequence(d.getTestCallback(function(){
// List should again contain California
var list = dojo.byId("setvaluetest_popup");
doh.t(list, "drop down exists");
doh.t(isVisible(list), "drop down is visible");
var entries = dojo.query(".dijitMenuItem", list).filter(isVisible);
doh.is(3, entries.length, "three entries in drop down: " + list.innerHTML);
doh.is("California (CA)", innerText(entries[0]), "list #1");
doh.is("Colorado (CO)", innerText(entries[1]), "list #2");
doh.is("Connecticut (CT)", innerText(entries[2]), "list #3");
doh.f(combo.itemError, testWidget + " item mismatch");
}), 900);
return d;
}
}
// TODO: make separate test group for testing highlighting, and then check
// - matching of anywhere in string (id=arrowless)
// - highlightmatch=none (combobox4)
]);
// Test auto complete
doh.register("auto-complete", [
{
timeout:60000,
name:"no auto-complete",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("setvaluetest");
combo.focusNode.focus();
doh.robot.sequence(function(){ combo.set("value", null); }, 1000);
// Filter drop down list to entries starting with "C"
doh.robot.keyPress("C", 100);
// Then tab away
doh.robot.keyPress(dojo.keys.TAB, 500);
doh.robot.sequence(d.getTestCallback(function(){
// Check that drop down list has disappeared
var list = dojo.byId("setvaluetest_popup");
doh.t(!list || isHidden(list), "drop down is visible");
// Since autocomplete=false the contents should just be what the user typed
doh.is('C', combo.focusNode.value);
if(!isComboBox){
doh.f(dijit.byId("setvaluetest").isValid(), "FilteringSelect shouldn't be valid");
}
doh.f(dijit.byId("setvaluetest").itemError, testWidget + " item mismatch");
}), 900);
return d;
}
},
{
timeout:60000,
name:"auto-complete writes suggested letters in input box",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("datatest"); // auto-complete = true
combo.focusNode.focus();
doh.robot.sequence(function(){ combo.set("value", null); }, 1000);
// Filter drop down list to entries starting with "C"
doh.robot.keyPress("C", 100);
doh.robot.sequence(d.getTestCallback(function(){
var list = dojo.byId("datatest_popup");
doh.t(isVisible(list), "drop down is visible");
doh.is('California', combo.focusNode.value, "'alifornia' automatically appended to user input");
}), 900);
return d;
}
},
{
timeout:60000,
name:"auto-complete changes suggestion based on more typed letters",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("datatest");
// Further filter drop down to entries starting with "Co" (Colorado and Connectictut).
// Note that this depends on (and tests that) "alifornia" is selected (aka highlighted),
// so that the "o" keypress erases it and replaces the input box text with "Co"
doh.robot.keyPress("o", 100);
doh.robot.sequence(d.getTestCallback(function(){
doh.is('Colorado', combo.focusNode.value, "suggestion changed from California to Colorado");
}), 900);
return d;
}
},
{
timeout:60000,
name:"tab-away auto-selects value",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("datatest");
// Then tab away
doh.robot.keyPress(dojo.keys.TAB, 500);
doh.robot.sequence(d.getTestCallback(function(){
// Check that drop down list has disappeared
var list = dojo.byId("datatest_popup");
doh.t(!list || isHidden(list), "drop down is hidden");
doh.is(isComboBox ? "Colorado" : "CO", combo.get("value"));
if(!isComboBox){
doh.t(combo.isValid(), "FilteringSelect should be valid");
}
}), 900);
return d;
}
}
]);
// TODO: test ESC key or click on screen background or click on another widget to close drop down
// TODO: click test for arrowless
// Race condition tests based on slow store:
// Test that drop down choices are filtered to values matching what user has typed
doh.register("race conditions", [
// Test when queries return in different order than issued
{
timeout:60000,
name:"query canceling on new input (#8950)",
runTest: function(){
var d = new doh.Deferred();
var combo = dijit.byId("slow");
combo.set('displayedValue', null, false);
combo.focusNode.focus();
// this test is very timing-sensitive
// preload states.json for slow networks
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 1000);
doh.robot.sequence(function(){ dojo.global.slowStateStore.log = []; }, 2000, 100); // clear log of query on * messages
// Filter drop down list to entries starting with "C"
doh.robot.typeKeys("c", 500, 100);
doh.robot.typeKeys("o", 300, 100); // 300ms > searchDelay, so C* query has been sent (but not yet returned results) when the o is typed
doh.robot.sequence(d.getTestCallback(function(){
// The query "C*" should be canceled when "Co*" is started
var log = dojo.global.slowStateStore.log;
doh.is(4, log.length, "4 events on data store");
doh.is("start c*", log[0].type + " " + log[0].query.name);
doh.is("cancel c*", log[1].type + " " + log[1].query.name);
doh.is("start co*", log[2].type + " " + log[2].query.name);
doh.is("end co*", log[3].type + " " + log[3].query.name);
// Check that drop down list has appeared, and contains only Colorado and Connecticut (not California)
var list = dojo.byId("slow_popup");
doh.t(list, "drop down exists");
doh.t(isVisible(list), "drop down is visible");
var entries = dojo.query(".dijitMenuItem", list).filter(isVisible);
doh.is(2, entries.length, "two entries in drop down: " + list.innerHTML);
doh.is("Colorado", innerText(entries[0]), "list #1");
doh.is("Connecticut", innerText(entries[1]), "list #2");
}), 1000, 500);
return d;
}
},
// Test that drop down doesn't show up after ENTER keypress, and also that
// searchDelay is preventing intermediate queries.
{
timeout:60000,
name:"pressing enter before search returns",
setUp: function(){
dojo.global.slowStateStore.log = [];
},
runTest: function(){
var d = new doh.Deferred();
var combo = dijit.byId("slow");
dojo.global.formSubmitted = false;
combo.focusNode.focus();
doh.robot.sequence(function(){ combo.set("value", null); }, 1000, 100); // wait for focus
// Start to filter drop down list to entries starting with "Co"
doh.robot.typeKeys("Co", 500, 100);
// But then hit ENTER after we've started the query to the data store, but
// before the data store returns query results... that should cancel the query.
doh.robot.keyPress(dojo.keys.ENTER, 300); // 300ms > searchDelay
doh.robot.sequence(d.getTestCallback(function(){
var log = dojo.global.slowStateStore.log;
var len = log.length;
if(!isComboBox){
doh.is(6, len, "query was issued for 'Co' but canceled");
doh.is("cancel ", log[1].type + " " + log[1].query.name);
doh.is("cancel Co*", log[3].type + " " + log[3].query.name);
doh.is("start Co", log[4].type + " " + log[4].query.name); // trying to lookup ID for item named "co"
doh.is("end Co", log[5].type + " " + log[5].query.name);
// also, form should not have submitted because the FilteringSelect
// is still trying to fill in it's item value
doh.f(dojo.global.formSubmitted, "form not submitted");
}else{ // this will look more like the IF block above once #6022 is committed
doh.is(2, len, "query was issued for 'Co' but canceled");
doh.is("cancel Co*", log[1].type + " " + log[1].query.name);
}
var list = dojo.byId("slow_popup");
doh.t(!list || isHidden(list), "drop down is *not* visible");
doh.is("Co", combo.get('displayedValue'), "auto-complete didn't fire");
}), 1200, 500);
return d;
}
}
]);
// disabled tests+standard tests
doh.register("disabled", [
// Test that correct styling is applied
{
timeout:1000,
name:"disabled styling",
combo:"combo3",
runTest:function(){
this.combo = dijit.byId(this.combo);
doh.is(true, this.combo.get('disabled'));
doh.is(true, this.combo.focusNode.disabled);
}
},
// Test that you can't focus a disabled combobox
{
timeout:60000,
name:"tab over disabled elements",
runTest: function(){
var d = new doh.Deferred();
dojo.byId("datatestDijit").focus();
doh.is("datatestDijit", dojo.global.dijit.focus.curNode.id, "focused on elem before disabled combo");
// Tab over the disabled ComboBox
doh.robot.keyPress(dojo.keys.TAB, 1000);
doh.robot.sequence(d.getTestCallback(function(){
doh.is("combobox4", dojo.global.dijit.focus.curNode.id, "focused on 'enable' button after disabled combo");
}), 1000);
return d;
}
}
]);
// now enable it and test that it can be used
doh.register("enabled", [
{
timeout:30000,
name:"combo3_enabledStyle",
setUp: function(){
dijit.byId("combo3").set("disabled", false);
},
runTest:function(){
var combo = dijit.byId("combo3");
doh.is(false, combo.get('disabled'));
doh.is(false, combo.focusNode.disabled);
}
}
]);
doh.register("specialchars", [
{
timeout:60000,
name:"specialchars_type",
combo:"specialchars",
runTest:function(){
return robot_typeValue(dijit.byId(this.combo), "sticks & stones", isComboBox? undefined : "sticks");
}
},
{
timeout:60000,
name:"specialchars_a11y",
combo:"specialchars",
runTest:function(){
return robot_a11ySelectValue(dijit.byId(this.combo), "more\\less", isComboBox? undefined : "more");
}
}
]);
doh.register("japanese", [
{
timeout:60000,
name:"japanese_a11y",
combo:"japanese",
runTest:function(){
return robot_a11ySelectValue((this.combo = dijit.byId(this.combo)), "\u6771\u533A (East)", isComboBox? undefined : "higashiku");
},
tearDown:function(){
this.combo.set("value", isComboBox?"\u6771\u533A (East)":"higashiku");
}
},
{
timeout:60000,
name:"japanese_type",
runTest:function(){
var d = new doh.Deferred(),
combo = dijit.byId("japanese");
combo.focusNode.focus();
doh.robot.keyPress(dojo.keys.END, 1000);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.keyPress('x', 500, {ctrl:true});
doh.robot.keyPress(dojo.keys.ENTER, 500);
doh.robot.sequence(dojo.hitch(this, function(){
if(combo.get("value") == (isComboBox?"\u6771\u897F (Touzai)":"touzai") && combo.focusNode.value=="\u6771\u897F (Touzai)"){
d.callback(true);
}else{
d.errback(combo.id+" was supposed to have a value of "+(isComboBox?"\u6771\u897F (Touzai)":"touzai")+". Text is "+combo.focusNode.value+", value is "+combo.get("value"));
}
}), 900);
return d;
}
}
]);
// Labelfunc tests. See also initial tests on "setvaluetest" ComboBox.
doh.register("labelFunc", [
{
timeout:60000,
name:"labelFunc_keyboardSelect",
combo:"labelFunc",
runTest:function(){
return robot_a11ySelectValue((this.combo = dijit.byId(this.combo)), "texas", isComboBox? "Texas" : "TX", "Texas");
},
tearDown:function(){
this.combo.set("value", isComboBox? "Texas" : "TX");
}
},
{
timeout:60000,
name:"labelFunc_type",
combo:"labelFunc",
runTest:function(){
return robot_typeValue((this.combo = dijit.byId(this.combo)), "Alabama", isComboBox ? "Alabama" : "AL", "Alabama");
}
},
{
timeout:60000,
name: "richtext",
runTest: function(){
var d = new doh.Deferred(),
w = dijit.byId("richtexttest");
// testing that input has right data
doh.is("h1", w.focusNode.value, "initial focus value");
w.set("value", "h2");
doh.is("h2", w.focusNode.value, "set() focus value");
w.focus();
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 100);
doh.robot.sequence(d.getTestCallback(function(){
var list = dojo.byId("richtexttest_popup");
doh.t(list, "drop down exists");
doh.t(isVisible(list), "drop down is visible");
var entries = dojo.query(".dijitMenuItem", list).filter(isVisible);
doh.is("<h1>h1</h1>", dojo.trim(entries[0].innerHTML).toLowerCase(), "list #1 is rich text");
}), 500);
return d;
}
}
]);
// The specifying a sort order and an initial filter to ComboBox
doh.register("filter and sort params", [
{
timeout:60000,
name:"sort order",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("progCombo3");
combo.focusNode.focus();
doh.robot.sequence(function(){ combo.set("value", null); }, 1000);
// Show list, should be in reverse order
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 100);
doh.robot.sequence(d.getTestCallback(function(){
var list = dojo.byId("progCombo3_popup");
doh.t(list, "drop down exists");
doh.t(isVisible(list), "drop down is visible");
var entries = dojo.query(".dijitMenuItem", list).filter(isVisible);
doh.is("United States of America", innerText(entries[0]), "list #1");
}), 900);
return d;
}
},
{
timeout:60000,
name:"initial filter, descending sort",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("progCombo3");
// Filter drop down list to entries starting with "A"
doh.robot.keyPress("A", 100);
doh.robot.sequence(d.getTestCallback(function(){
// Check that drop down list *doesn't* contain Africa (since it's a continent),
// just Argentina and Australia, in descending sort order
var list = dojo.byId("progCombo3_popup");
doh.t(list, "drop down exists");
doh.t(isVisible(list), "drop down is visible");
var entries = dojo.query(".dijitMenuItem", list).filter(isVisible);
doh.is(2, entries.length, "two countries (but no continents) in drop down: " + list.innerHTML);
doh.is("Australia", innerText(entries[0]), "list #1");
doh.is("Argentina", innerText(entries[1]), "list #2");
}), 900);
return d;
}
}
]);
// The specifying a sort order and an initial filter to ComboBox
doh.register("blur", [
{
timeout:60000,
name:"tooltip prompt",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("labelFunc");
combo.set("value", null);
combo.focusNode.focus();
// blur
doh.robot.keyPress(dojo.keys.TAB, 1000);
doh.robot.sequence(d.getTestCallback(function(){
doh.t(!combo._message, "no tooltip on blur");
}), 1000);
return d;
}
},
{
timeout:60000,
name:"empty but required",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("combobox4");
combo.set("value", null);
combo.focusNode.focus();
// blur
doh.robot.keyPress(dojo.keys.TAB, 1000);
doh.robot.sequence(d.getTestCallback(function(){
doh.t(combo.state == "Error", "required field has error on blur");
}), 1000);
return d;
}
}
]);
doh.register("wrap", [
{
timeout:10000,
name:"wrap without More choices",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("preservetitletest");
combo.set('pageSize', 5); // remove More choices
combo.focusNode.focus();
// Show list, should be in reverse order
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 1000);
for(var i=0; i < 14; i++){
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 250); // down arrow and wrap twice
}
for(i=0; i < 4; i++){
doh.robot.keyPress(dojo.keys.UP_ARROW, 250); // up arrow and wrap at most once
}
doh.robot.keyPress(dojo.keys.ENTER, 500); // select current item
doh.robot.sequence(d.getTestCallback(function(){
doh.is(isComboBox ? "Vermont" : "vt", combo.get("value"), "wrap get('value')");
}), 1000);
return d;
}
},
{
timeout:10000,
name:"wrap with More choices",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("preservetitletest");
combo.set('pageSize', 4); // add More choices
combo.focusNode.focus();
// Show list, should be in reverse order
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 1000);
for(var i=0; i < 14; i++){
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 250); // down arrow and wrap twice
}
for(i=0; i < 5; i++){
doh.robot.keyPress(dojo.keys.UP_ARROW, 200); // up arrow and wrap at most once
}
doh.robot.keyPress(dojo.keys.ENTER, 500); // select current item
doh.robot.sequence(d.getTestCallback(function(){
doh.is(isComboBox ? "Massachusetts" : "ma", combo.get("value"), "wrap get('value')");
}), 1000);
return d;
}
},
{
timeout:10000,
name:"wrap and TAB from Prev choices",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("preservetitletest");
combo.set('pageSize', 4); // add More choices
combo.set("value", isComboBox ? "Maine" : "me", true); // fires onChange
combo.set("value", isComboBox ? "Connecticut" : "ct", false); // temporary value
combo.focusNode.focus();
// Show list, should be in reverse order
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 1000);
for(var i=0; i < 5; i++){
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 250); // down arrow to More choices
}
doh.robot.keyPress(dojo.keys.ENTER, 500); // select More choices
doh.robot.keyPress(dojo.keys.UP_ARROW, 1000); // up arrow to Previous choices
doh.robot.keyPress(dojo.keys.TAB, 500); // select current item
doh.robot.sequence(d.getTestCallback(function(){
doh.is(isComboBox ? "Maine" : "me", combo.get("value"), "Previous choice reverts value");
}), 1000);
return d;
}
}
]);
var pageSize, combo;
// Test more choices
doh.register("Select More choices", [
{
timeout:10000,
name:"no auto-complete",
setUp: function(){
combo = dijit.byId("setvaluetest");
pageSize = combo.get('pageSize');
combo.set('pageSize', 1);
combo.set('displayedValue', null, false);
combo.focusNode.focus();
},
runTest: function(){
var d = new doh.Deferred();
// select more choices and press Enter
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 1500); // open dropdown
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 500); // select Alabama
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 500); // select more choices
doh.robot.keyPress(dojo.keys.ENTER, 500);
doh.robot.sequence(d.getTestCallback(function(){
// Check that drop down list has disappeared
var list = dojo.byId("setvaluetest_popup");
doh.t(list && isVisible(list), "drop down is visible");
doh.is(combo.dropDown.getHighlightedOption(), findMenuItem(combo, "Alaska"), "Alaska is selected");
doh.t(combo.focused, "widget is focused");
// Since the user down arrowed thru the choices, the value should be the current selection
doh.is('Alaska', combo.focusNode.value);
if(!isComboBox){
doh.t(combo.isValid(true), "FilteringSelect should be valid");
}
}), 1000, 500);
return d;
},
tearDown: function(){
combo.set('pageSize', pageSize);
combo.closeDropDown();
}
},
{
timeout:10000,
name:"auto-complete",
setUp: function(){
combo = dijit.byId("datatest");
pageSize = combo.get('pageSize');
combo.set('pageSize', 1);
combo.set('displayedValue', null, false);
combo.focusNode.focus();
},
runTest: function(){
var d = new doh.Deferred();
// select more choices and press Enter
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 1500); // open dropdown
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 500); // select Alabama
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 500); // select more choices
doh.robot.keyPress(dojo.keys.ENTER, 500);
doh.robot.sequence(d.getTestCallback(function(){
// Check that drop down list has disappeared
var list = dojo.byId("datatest_popup");
doh.t(list && isVisible(list), "drop down is visible");
doh.is(combo.dropDown.getHighlightedOption(), findMenuItem(combo, "Alaska"), "Alaska is selected");
doh.t(combo.focused, "widget is focused");
// Since the user down arrowed thru the choices, the value should be the current selection
doh.is('Alaska', combo.focusNode.value);
if(!isComboBox){
doh.t(combo.isValid(true), "FilteringSelect should be valid");
}
}), 1000, 500);
return d;
},
tearDown: function(){
combo.set('pageSize', pageSize);
combo.closeDropDown();
}
}
]);
doh.register("onChange", [
{
timeout:6000,
name:"11062",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("progCombo");
var status = "not called";
var connectHandle = combo.connect(combo, "onChange", function(){
status = "called";
});
combo.focusNode.focus();
doh.robot.keyPress(dojo.keys.TAB, 500); // blur
doh.robot.sequence(d.getTestCallback(function(){
combo.disconnect(connectHandle);
doh.is("not called", status, "onChange should not have been called");
}), 500);
return d;
}
},
{
timeout:2000,
name:"10988.0",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("progCombo");
var value = isComboBox ? 'Kentucky' : 'KY';
combo._lastValueReported = combo._lastValue = value;
var status = "not called";
var connectHandle = combo.connect(combo, "onChange", function(v){
status = "called with " + v;
});
combo.set('value', value, true);
doh.robot.sequence(d.getTestCallback(function(){
combo.disconnect(connectHandle);
combo._pendingOnChange = false;
doh.is("not called", status, "onChange should not have been called");
}), 500);
return d;
}
},
{
timeout:2000,
name:"10988.1",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("progCombo");
var value1 = isComboBox ? 'Kentucky' : 'KY';
var value2 = isComboBox ? 'Texas' : 'TX';
combo._lastValueReported = combo._lastValue = value1;
var status = "not called";
var connectHandle = combo.connect(combo, "onChange", function(v){
status = "called with " + v;
});
combo.set('value', value2, false);
doh.robot.sequence(d.getTestCallback(function(){
combo.disconnect(connectHandle);
combo._pendingOnChange = false;
doh.is("not called", status, "onChange should not have been called");
}), 500);
return d;
}
},
{
timeout:2000,
name:"10988.2",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("progCombo");
var value1 = isComboBox ? 'Kentucky' : 'KY';
var value2 = isComboBox ? 'Texas' : 'TX';
combo._lastValueReported = combo._lastValue = value2;
var status = "not called";
var connectHandle = combo.connect(combo, "onChange", function(v){
status = "called with " + v;
});
combo.set('value', value1, false);
combo.set('value', value2);
doh.robot.sequence(d.getTestCallback(function(){
combo.disconnect(connectHandle);
combo._pendingOnChange = false;
doh.is("called with "+value2, status, "onChange should have been called with "+value2);
}), 500);
return d;
}
},
{
timeout:2000,
name:"10988.3",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("progCombo");
var value1 = isComboBox ? 'Kentucky' : 'KY';
var value2 = isComboBox ? 'Texas' : 'TX';
combo._lastValueReported = combo._lastValue = value2;
var status = "not called";
var connectHandle = combo.connect(combo, "onChange", function(v){
status = "called with " + v;
});
combo.set('value', value1, false);
combo.set('value', value2, false);
combo.set('value', value2, true);
doh.robot.sequence(d.getTestCallback(function(){
combo.disconnect(connectHandle);
combo._pendingOnChange = false;
doh.is("called with "+value2, status, "onChange should have been called with "+value2);
}), 500);
return d;
}
},
{
timeout:2000,
name:"10988.4",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("progCombo");
var value = isComboBox ? 'Kentucky' : 'KY';
combo._lastValueReported = combo._lastValue = value;
var status = "not called";
var connectHandle = combo.connect(combo, "onChange", function(v){
status = "called with " + v;
});
combo.set('value', value, false);
combo.set('value', value, true);
doh.robot.sequence(d.getTestCallback(function(){
combo.disconnect(connectHandle);
combo._pendingOnChange = false;
doh.is("not called", status, "onChange should not have been called");
}), 500);
return d;
}
},
{
timeout:2000,
name:"10988.5",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("progCombo");
var value1 = isComboBox ? 'Kentucky' : 'KY';
var value2 = isComboBox ? 'Texas' : 'TX';
combo._lastValueReported = combo._lastValue = value2;
var status = "not called";
var connectHandle = combo.connect(combo, "onChange", function(v){
status = "called with " + v;
});
combo.set('value', value1, false);
combo.set('value', value2, true);
combo.set('value', value1, false);
doh.robot.sequence(d.getTestCallback(function(){
combo.disconnect(connectHandle);
combo._pendingOnChange = false;
doh.is("called with "+value2, status, "onChange should have been called with "+value2);
}), 500);
return d;
}
},
{
timeout:2000,
name:"10988.6",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("progCombo");
var value1 = isComboBox ? 'Kentucky' : 'KY';
var value2 = isComboBox ? 'Texas' : 'TX';
combo._lastValueReported = combo._lastValue = value1;
var status = "not called";
var connectHandle = combo.connect(combo, "onChange", function(v){
status = "called with " + v;
});
combo.set('value', value2, true);
doh.robot.sequence(d.getTestCallback(function(){
combo.disconnect(connectHandle);
combo._pendingOnChange = false;
doh.is("called with "+value2, status, "onChange should have been called with true"+value2);
}), 500);
return d;
}
},
{
timeout:2000,
name:"10988.7",
runTest:function(){
var d = new doh.Deferred();
var combo = dijit.byId("progCombo");
var value1 = isComboBox ? 'Kentucky' : 'KY';
var value2 = isComboBox ? 'Texas' : 'TX';
combo._lastValueReported = combo._lastValue = value2;
var status = "not called";
var connectHandle = combo.connect(combo, "onChange", function(v){
status = "called with " + v;
});
combo.set('value', value1, false);
combo.set('value', value1, true);
doh.robot.sequence(d.getTestCallback(function(){
combo.disconnect(connectHandle);
combo._pendingOnChange = false;
doh.is("called with "+value1, status, "onChange should have been called with "+value1);
}), 500);
return d;
}
}
]);
doh.register("destroy", [
{
timeout: 1000,
name: "destroy",
runTest: function(){
var d = new doh.Deferred();
doh.robot.sequence(d.getTestCallback(function(){
dijit.byId("combo_01").destroy();
doh.is(undefined, dojo.byId("combo_01"), 'widget was removed');
doh.f(dojo.byId('destroyDiv').firstChild, 'container node is empty');
}), 0);
return d;
}
}
]);
dojo.forEach(
[
{ attrs: { ignoreCase:true, highlightMatch:"first", queryExpr:"${0}*" }, results: { AA: "<>A<>A", Aa: "<>A<>a", aA: "<>a<>A", aa: "<>a<>a" } },
{ attrs: { ignoreCase:false, highlightMatch:"first", queryExpr:"${0}*" }, results: { aA: "<>a<>A", aa: "<>a<>a" } },
{ attrs: { ignoreCase:true, highlightMatch:"all", queryExpr:"${0}*" }, results: { AA: "<>A<>A", Aa: "<>A<>a", aA: "<>a<>A", aa: "<>a<>a" } },
{ attrs: { ignoreCase:true, highlightMatch:"all", queryExpr:"*${0}*" }, results: { AA: "<>A<><>A<>", Aa: "<>A<><>a<>", aA: "<>a<><>A<>", aa: "<>a<><>a<>" } },
{ attrs: { ignoreCase:false, highlightMatch:"all", queryExpr:"*${0}*" }, results: { Aa: "A<>a<>", aA: "<>a<>A", aa: "<>a<><>a<>" } },
{ attrs: { ignoreCase:false, highlightMatch:"none", queryExpr:"*${0}*" }, results: { Aa: "Aa", aA: "aA", aa: "aa" } },
{ attrs: { ignoreCase:true, highlightMatch:"all", queryExpr:"*${0}" }, results: { AA: "A<>A<>", Aa: "A<>a<>", aA: "a<>A<>", aa: "a<>a<>" } },
{ attrs: { ignoreCase:false, highlightMatch:"first", queryExpr:"*${0}" }, results: { Aa: "A<>a<>", aa: "a<>a<>" } }
], function(test){
doh.register("highlight", [
{
timeout: 6000,
name: dojo.toJson(test.attrs),
setUp: function(){
combo = dijit.byId("highlight");
dojo.mixin(combo, test.attrs);
combo.focusNode.focus();
},
runTest: function(){
var d = new doh.Deferred();
doh.robot.keyPress(dojo.keys.BACKSPACE, 1000);
doh.robot.typeKeys("a", 1, 100);
doh.robot.sequence(d.getTestCallback(function(){
dojo.forEach(["AA","Aa","aA","aa"], function(idx){
var item = findMenuItem(combo, idx);
if(idx in test.results){
var expected = test.results[idx];
var actual = item.innerHTML.replace(/\/?span\s*[^>]*@?/ig, "");
doh.is(expected, actual, idx);
}else{
doh.t(item == combo.dropDown.nextButton, "too many menu items: " + idx);
}
});
}), 1000, 500);
return d;
},
tearDown: function(){
combo.closeDropDown();
}
}
]);
}
);
doh.run();
});
</script>
</head>
</html>