blob: 759591e1c7f2faaa1313e117cb400d96835ebc40 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
GEN_INCLUDE([
'chrome/browser/resources/chromeos/chromevox/testing/assert_additions.js']);
GEN_INCLUDE([
'chrome/browser/resources/chromeos/chromevox/testing/common.js',
'chrome/browser/resources/chromeos/chromevox/testing/callback_helper.js']);
/**
* Base test fixture for ChromeVox unit tests.
*
* Note that while conceptually these are unit tests, these tests need
* to run in a full web page, so they're actually run as WebUI browser
* tests.
*
* @constructor
* @extends {testing.Test}
*/
function ChromeVoxUnitTestBase() {
if (this.isAsync) {
this.callbackHelper_ = new CallbackHelper(this);
}
}
ChromeVoxUnitTestBase.prototype = {
__proto__: testing.Test.prototype,
/** @override */
closureModuleDeps: [
'cvox.ChromeVoxTester',
'cvox.ChromeVoxUserCommands',
'cvox.SpokenListBuilder',
],
/** @override */
browsePreload: DUMMY_URL,
/**
* @override
* It doesn't make sense to run the accessibility audit on these tests,
* since many of them are deliberately testing inaccessible html.
*/
runAccessibilityChecks: false,
/**
* Loads some inlined html into the body of the current document, replacing
* whatever was there previously.
* @param {string} html The html to load as a string.
*/
loadHtml: function(html) {
while (document.head.firstChild) {
document.head.removeChild(document.head.firstChild);
}
while (document.body.firstChild) {
document.body.removeChild(document.body.firstChild);
}
this.appendHtml(html);
},
/**
* Loads some inlined html into the current document, replacing
* whatever was there previously. This version takes the html
* encoded as a comment inside a function, so you can use it like this:
*
* this.loadDoc(function() {/*!
* <p>Html goes here</p>
* * /});
*
* @param {Function} commentEncodedHtml The html to load, embedded as a
* comment inside an anonymous function - see example, above.
*/
loadDoc: function(commentEncodedHtml) {
var html =
TestUtils.extractHtmlFromCommentEncodedString(commentEncodedHtml);
this.loadHtml(html);
},
/**
* Appends some inlined html into the current document, at the end of
* the body element. Takes the html encoded as a comment inside a function,
* so you can use it like this:
*
* this.appendDoc(function() {/*!
* <p>Html goes here</p>
* * /});
*
* @param {Function} commentEncodedHtml The html to load, embedded as a
* comment inside an anonymous function - see example, above.
*/
appendDoc: function(commentEncodedHtml) {
var html =
TestUtils.extractHtmlFromCommentEncodedString(commentEncodedHtml);
this.appendHtml(html);
},
/**
* Appends some inlined html into the current document, at the end of
* the body element.
* @param {string} html The html to load as a string.
*/
appendHtml: function(html) {
var div = document.createElement('div');
div.innerHTML = html;
var fragment = document.createDocumentFragment();
while (div.firstChild) {
fragment.appendChild(div.firstChild);
}
document.body.appendChild(fragment);
},
/**
* Waits for the queued events in ChromeVoxEventWatcher to be
* handled, then calls a callback function with provided arguments
* in the test case scope. Very useful for asserting the results of events.
*
* @param {function()} func A function to call when ChromeVox is ready.
* @param {*} var_args Additional arguments to pass through to the function.
* @return {ChromeVoxUnitTestBase} this.
*/
waitForCalm: function(func, var_args) {
var calmArguments = Array.prototype.slice.call(arguments);
calmArguments.shift();
cvox.ChromeVoxEventWatcher.addReadyCallback(this.newCallback(function() {
func.apply(this, calmArguments);
}));
return this; // for chaining.
},
/**
* Asserts the TTS engine spoke a certain string. Clears the TTS buffer.
* @param {string} expectedText The expected text.
* @return {ChromeVoxUnitTestBase} this.
*/
assertSpoken: function(expectedText) {
assertEquals(expectedText,
cvox.ChromeVoxTester.testTts().getUtterancesAsString());
cvox.ChromeVoxTester.clearUtterances();
return this; // for chaining.
},
/**
* Asserts a list of utterances are in the correct queue mode.
* @param {cvox.SpokenListBuilder|Array} expectedList A list
* of [text, queueMode] tuples OR a SpokenListBuilder with the expected
* utterances.
* @return {ChromeVoxUnitTestBase} this.
*/
assertSpokenList: function(expectedList) {
if (expectedList instanceof cvox.SpokenListBuilder) {
expectedList = expectedList.build();
}
var ulist = cvox.ChromeVoxTester.testTts().getUtteranceInfoList();
for (var i = 0; i < expectedList.length; i++) {
var text = expectedList[i][0];
var queueMode = expectedList[i][1];
this.assertSingleUtterance_(text, queueMode,
ulist[i].text, ulist[i].queueMode);
}
cvox.ChromeVoxTester.clearUtterances();
return this; // for chaining.
},
assertSingleUtterance_: function(
expectedText, expectedQueueMode, text, queueMode) {
assertEquals(expectedQueueMode, queueMode);
assertEquals(expectedText, text);
},
/**
* Focuses an element.
* @param {string} id The id of the element to focus.
* @return {ChromeVoxUnitTestBase} this.
*/
setFocus: function(id) {
$(id).focus();
return this; // for chaining.
},
/**
* Executes a ChromeVox user command.
* @param {string} command The name of the command to run.
* @return {ChromeVoxUnitTestBase} this.
*/
userCommand: function(command) {
cvox.ChromeVoxUserCommands.commands[command]();
return this; // for chaining.
},
/**
* @return {cvox.SpokenListBuilder} A new builder.
*/
spokenList: function() {
return new cvox.SpokenListBuilder();
},
/**
* @type {CallbackHelper}
* @private
*/
callbackHelper_: null,
/**
* Creates a callback that optionally calls {@code opt_callback} when
* called. If this method is called one or more times, then
* {@code testDone()} will be called when all callbacks have been called.
* @param {Function=} opt_callback Wrapped callback that will have its this
* reference bound to the test fixture.
* @return {Function}
*/
newCallback: function(opt_callback) {
assertNotEquals(null, this.callbackHelper_);
return this.callbackHelper_.wrap(opt_callback);
}
};