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
1,445 lines (1,270 loc) • 56.6 kB
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">
dojo.require("dijit.robotx");
dojo.require("dojo.aspect");
dojo.require("dijit.tests.helpers"); // functions to help test
dojo.require("dijit.form._TextBoxMixin"); // selectInputText
// 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 nothing is selected in the drop down
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.DOWN_ARROW, 500); // highlight value
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,
// use "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
!isComboBox && doh.register("reverse lookup query options", [
{
timeout: 60000,
name: "delaware",
runTest: function(){
var d = new doh.Deferred();
var combo = dijit.byId("arrowless");
combo.set("value", null);
combo.focusNode.focus();
doh.robot.typeKeys("delaware", 500, 100);
doh.robot.keyPress(dojo.keys.TAB, 1000);
doh.robot.sequence(d.getTestCallback(function(){
// Value should have been converted to "Delaware" (in upper case) and marked as valid
doh.is("Delaware", combo.focusNode.value);
doh.is("", combo.state, "marked as valid");
}), 1000);
return d;
}
}
]);
// 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;
dijit.form._TextBoxMixin.selectInputText(combo.focusNode);
// Start to filter drop down list to entries starting with "Co"
doh.robot.typeKeys("C", 500, 0);
doh.robot.typeKeys("o", 300, 0); // 300ms > searchDelay, so C* query has been sent (but not yet returned results) when the o is typed
// 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;
doh.t(len >= 4, "log length " + len);
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("cancel Co*", log[3].type + " " + log[3].query.name);
// also, form SHOULD have submitted because no popup was visible
doh.t(dojo.global.formSubmitted, "form submitted");
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: 5000,
name:"tab over disabled elements",
runTest: function(){
var d = new doh.Deferred();
dojo.byId("datatestDijit").focus();
doh.robot.sequence(d.getTestErrback(function(){
// use sequence because focus on IE9+ is asynchronous
doh.is("datatestDijit", dojo.global.dijit.focus.curNode.id, "focused on elem before disabled combo");
}), 100);
// Tab over the disabled ComboBox
doh.robot.keyPress(dojo.keys.TAB, 100);
doh.robot.sequence(d.getTestCallback(function(){
doh.is("combobox4", dojo.global.dijit.focus.curNode.id, "focused on 'enable' button after disabled combo");
}), 200);
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:10000,
name:"specialchars_type",
combo:"specialchars",
runTest:function(){
return robot_typeValue(dijit.byId(this.combo), "sticks & stones", isComboBox? undefined : "sticks");
}
},
{
timeout:10000,
name:"specialchars_a11y",
combo:"specialchars",
runTest:function(){
return robot_a11ySelectValue(dijit.byId(this.combo), "more\\less", isComboBox? undefined : "more");
}
},
{
timeout:10000,
name:"specialchars_escape",
combo:"specialchars",
runTest:function(){
var combo = dijit.byId(this.combo);
combo.focusNode.focus();
doh.robot.sequence(function(){ combo.set("value", null); }, 1000);
var d = new doh.Deferred();
doh.robot.typeKeys("3 *", 500, 600);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.sequence(d.getTestCallback(function(){
doh.is("3 *", combo.focusNode.value);
}), 500);
return d;
}
},
{
timeout:10000,
name:"specialchars_highlight",
combo:"specialchars",
runTest:function(){
var combo = dijit.byId(this.combo);
combo.queryExpr = '*${0}*';
combo.focusNode.focus();
doh.robot.sequence(function(){ combo.set("value", null); }, 500);
var d = new doh.Deferred();
doh.robot.typeKeys("t", 1, 100);
doh.robot.sequence(d.getTestCallback(function(){
var item = findMenuItem(combo, 'riches to');
doh.t(item, 'item "rags --> riches to" should be visible');
doh.is('rags --> riches <>t<>o',item.innerHTML.replace(/<[^>]*>/g,'<>'), '"t" in "to" should be highlighted');
}), 1000, 500);
return d;
}
}
]);
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:20000,
name:"japanese_type",
runTest:function(){
var d = new doh.Deferred(),
s0 = null,
s1 = null,
s2 = null,
s3 = null,
s4 = null,
s5 = null,
combo = dijit.byId("japanese");
combo.focusNode.focus();
doh.robot.keyPress(dojo.keys.END, 1000);
doh.robot.typeKeys("x", 500, 200);
doh.robot.sequence(function(){
s0 = combo.state;
}, 500);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.sequence(function(){
s1 = combo.state;
}, 500);
doh.robot.typeKeys("xx", 500, 400);
doh.robot.sequence(function(){
s2 = combo.state;
}, 500);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.sequence(function(){
s3 = combo.state;
}, 500);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.sequence(function(){
s4 = combo.state;
}, 500);
doh.robot.keyPress(dojo.keys.BACKSPACE, 500);
doh.robot.sequence(function(){
s5 = combo.state;
}, 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(dojo.keys.DOWN_ARROW, 500);
doh.robot.keyPress(dojo.keys.ENTER, 500);
doh.robot.sequence(dojo.hitch(this, function(){
if(!isComboBox){
doh.is("Error", s0, "s0");
doh.is("Incomplete", s1, "s1");
doh.is("Error", s2, "s2");
doh.is("Error", s3, "s3");
doh.is("Incomplete", s4, "s4");
doh.is("Incomplete", s5, "s5");
}
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"));
}
}), 1000);
return d;
}
}
]);
doh.register("readOnly", [
{
timeout:5000,
name:"cannot type",
combo: "labelFunc",
runTest:function(){
var d = new doh.Deferred(),
combo = dijit.byId(this.combo),
initVal = combo.get('value');
combo.set('readOnly', true);
combo.focus();
doh.robot.typeKeys("xz", 1000, 500);
doh.robot.sequence(d.getTestCallback(function(){
doh.t(combo.isValid(), 'isValid');
doh.is(initVal, combo.get('value'), 'changed from ' + initVal + ' to ' + combo.get('value'));
}), 500, 500);
return d;
},
tearDown:function(){
dijit.byId(this.combo).set("readOnly", false);
}
}
]);
// 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); // wait for focus
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 500); // wait for dropdown to open
for(var i=1; 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); // wait for focus
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 500); // wait for dropdown to open
for(var i=1; 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); // wait for focus
doh.robot.keyPress(dojo.keys.DOWN_ARROW, 500); // wait for dropdown to open
for(var i=1; 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.connec