summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator_test.unitjs
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator_test.unitjs')
-rw-r--r--chromium/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator_test.unitjs264
1 files changed, 264 insertions, 0 deletions
diff --git a/chromium/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator_test.unitjs b/chromium/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator_test.unitjs
new file mode 100644
index 00000000000..bd598dd6e27
--- /dev/null
+++ b/chromium/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator_test.unitjs
@@ -0,0 +1,264 @@
+// 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.
+
+// Include test fixture.
+GEN_INCLUDE(['../testing/chromevox_unittest_base.js',
+ '../testing/assert_additions.js']);
+
+/**
+ * Test fixture.
+ * @constructor
+ * @extends {ChromeVoxUnitTestBase}
+ */
+function CvoxExpandingBrailleTranslatorUnitTest() {}
+
+CvoxExpandingBrailleTranslatorUnitTest.prototype = {
+ __proto__: ChromeVoxUnitTestBase.prototype,
+
+ /** @override */
+ closureModuleDeps: [
+ 'cvox.ExpandingBrailleTranslator',
+ 'cvox.LibLouis',
+ 'cvox.Spannable',
+ 'cvox.ValueSelectionSpan',
+ 'cvox.ValueSpan',
+ ]
+};
+
+/**
+ * An implementation of {@link cvox.LibLouis.Translator} whose translation
+ * output is an array buffer of the same byte length as the input and where
+ * each byte is equal to the character code of {@code resultChar}. The
+ * position mappings are one to one in both directions.
+ * @param {string} resultChar A one character string used for each byte of the
+ * result.
+ * @constructor
+ * @extends {cvox.LibLouis.Translator}
+ */
+function FakeTranslator(resultChar) {
+ /** @private {string} */
+ this.resultChar_ = resultChar;
+}
+
+FakeTranslator.prototype = {
+ /** @Override */
+ translate: function(text, callback) {
+ var result = new Uint8Array(text.length);
+ var textToBraille = [];
+ var brailleToText = [];
+ for (var i = 0; i < text.length; ++i) {
+ result[i] = this.resultChar_.charCodeAt(0);
+ textToBraille.push(i);
+ brailleToText.push(i);
+ }
+ callback(result.buffer, textToBraille, brailleToText);
+ }
+};
+
+/**
+ * Asserts that a array buffer, viewed as an uint8 array, matches
+ * the contents of a string. The character code of each character of the
+ * string shall match the corresponding byte in the array buffer.
+ * @param {ArrayBuffer} actual Actual array buffer.
+ * @param {string} expected Array of expected bytes.
+ */
+function assertArrayBufferMatches(expected, actual) {
+ assertTrue(actual instanceof ArrayBuffer);
+ var a = new Uint8Array(actual);
+ assertEquals(expected.length, a.length);
+ for (var i = 0; i < a.length; ++i) {
+ assertEquals(expected.charCodeAt(i), a[i], 'Position ' + i);
+ }
+}
+
+TEST_F('CvoxExpandingBrailleTranslatorUnitTest', 'TranslationError',
+ function() {
+ var text = new cvox.Spannable('error ok', new cvox.ValueSpan());
+ text.setSpan(new cvox.ValueSelectionSpan, 0, 0);
+ var contractedTranslator = new FakeTranslator('c');
+ // Translator that always results in an error.
+ var uncontractedTranslator = {
+ translate: function(text, callback) {
+ callback(null, null, null);
+ }
+ };
+ var translationResult = null;
+
+ var expandingTranslator = new cvox.ExpandingBrailleTranslator(
+ contractedTranslator, uncontractedTranslator);
+ expandingTranslator.translate(
+ text, cvox.ExpandingBrailleTranslator.ExpansionType.SELECTION,
+ function(cells, textToBraille, brailleToText) {
+ // Expect the string ' ok' to be translated using the contracted
+ // translator. The preceding part isn't included because it resulted
+ // in a translation error.
+ assertArrayBufferMatches('ccc', cells);
+ assertEqualsJSON([0, 0, 0, 0, 0, 0, 1, 2], textToBraille);
+ assertEqualsJSON([5, 6, 7], brailleToText);
+ });
+});
+
+// Test for many variations of successful translations.
+
+var totalRunTranslationTests = 0;
+
+/**
+ * Performs the translation and checks the output.
+ * @param {string} name Name that describes the input for error messages.
+ * @param {boolean} contracted Whether to use a contracted translator
+ * in addition to the uncontracted one.
+ * @param {cvox.ExpandingBrailleTranslator.ExpansionType} valueExpansion
+ * Value expansion argument to pass to the translator.
+ * @param {string} text Input string.
+ * @param {string} expectedOutput Expected output as a string (see
+ * {@code TESTDATA} below for a description of the format).
+ */
+function doTranslationTest(name, contracted, valueExpansion, text,
+ expectedOutput) {
+ totalRunTranslationTests++;
+ var uncontractedTranslator = new FakeTranslator('u');
+ var expandingTranslator;
+ if (contracted) {
+ var contractedTranslator = new FakeTranslator('c');
+ expandingTranslator = new cvox.ExpandingBrailleTranslator(
+ contractedTranslator, uncontractedTranslator);
+ } else {
+ expandingTranslator = new cvox.ExpandingBrailleTranslator(
+ uncontractedTranslator);
+ }
+ var expectedMapping = [];
+ for (var i = 0; i < expectedOutput.length; ++i) {
+ expectedMapping[i] = i;
+ }
+
+ expandingTranslator.translate(
+ text, valueExpansion, function(cells, textToBraille, brailleToText) {
+ assertArrayBufferMatches(expectedOutput, cells, name);
+ assertEqualsJSON(expectedMapping, textToBraille, name);
+ assertEqualsJSON(expectedMapping, brailleToText, name);
+ });
+};
+
+/**
+ * Runs two tests, one with the given values and one with the given values
+ * where the text is surrounded by a typical name and role.
+ * @param {{name: string, input: string, contractedOutput: string}}
+ * testCase An entry of {@code TESTDATA}.
+ * @param {boolean} contracted Whether to use both uncontracted
+ * and contracted translators.
+ * @param {cvox.ExpandingBrailleTranslation.ExpansionType} valueExpansion
+ * What kind of value expansion to apply.
+ * @param {cvox.Spannable} text Input text.
+ * @param {string=} opt_expectedContractedOutput Expected output (see
+ * {@code TESTDATA}).
+ */
+function runTranslationTestVariants(testCase, contracted, valueExpansion) {
+ var expType = cvox.ExpandingBrailleTranslator.ExpansionType;
+ // Construct the full name.
+ var fullName = contracted ? 'Contracted_' : 'Uncontracted_';
+ fullName += 'Expansion' + valueExpansion + '_';
+ fullName += testCase.name;
+ // The expected output depends on the contraction mode and value expansion.
+ var outputChar = contracted ? 'c' : 'u';
+ var expectedOutput;
+ if (contracted && valueExpansion === expType.SELECTION) {
+ expectedOutput = testCase.contractedOutput;
+ } else if (contracted && valueExpansion === expType.ALL) {
+ expectedOutput = new Array(testCase.input.getLength() + 1).join('u');
+ } else {
+ expectedOutput =
+ new Array(testCase.input.getLength() + 1).join(outputChar);
+ }
+ doTranslationTest(fullName, contracted, valueExpansion, testCase.input,
+ expectedOutput);
+
+ // Run another test, with the value surrounded by some text.
+ var surroundedText = new cvox.Spannable('Name: ');
+ var surroundedExpectedOutput =
+ new Array('Name: '.length + 1).join(outputChar);
+ surroundedText.append(testCase.input);
+ surroundedExpectedOutput += expectedOutput;
+ if (testCase.input.getLength() > 0) {
+ surroundedText.append(' ');
+ surroundedExpectedOutput += outputChar;
+ }
+ surroundedText.append('edtxt');
+ surroundedExpectedOutput +=
+ new Array('edtxt'.length + 1).join(outputChar);
+ doTranslationTest(fullName + '_Surrounded', contracted, valueExpansion,
+ surroundedText, surroundedExpectedOutput);
+}
+
+/**
+ * Creates a spannable text with optional selection.
+ * @param {string} text The text.
+ * @param {=opt_selectionStart} Selection start or caret position. No
+ * selection is added if undefined.
+ * @param {=opt_selectionEnd} Selection end if selection is not a caret.
+ */
+function createText(text, opt_selectionStart, opt_selectionEnd) {
+ var result = new cvox.Spannable(text);
+
+ result.setSpan(new cvox.ValueSpan, 0, text.length);
+ if (goog.isDef(opt_selectionStart)) {
+ result.setSpan(
+ new cvox.ValueSelectionSpan,
+ opt_selectionStart,
+ goog.isDef(opt_selectionEnd) ? opt_selectionEnd : opt_selectionStart);
+ }
+ return result;
+}
+
+
+var TEXT = 'Hello, world!';
+
+TEST_F('CvoxExpandingBrailleTranslatorUnitTest', 'successfulTranslations',
+ function() {
+ /**
+ * Dictionary of test strings, keyed on a descriptive name for the
+ * test case. The value is an array of the input string to the translation
+ * and the expected output using a translator with both uncontracted
+ * and contracted underlying translators. The expected output is
+ * in the form of a string of the same length as the input, where an 'u'
+ * means that the uncontracted translator was used at this location and a
+ * 'c' means that the contracted translator was used.
+ */
+ var TESTDATA = [
+ { name: 'emptyText',
+ input: createText(''),
+ contractedOutput: '' },
+ { name: 'emptyTextWithCaret',
+ input: createText('', 0),
+ contractedOutput: '' },
+ { name: 'textWithNoSelection',
+ input: createText(TEXT),
+ contractedOutput: 'ccccccccccccc' },
+ { name: 'textWithCaretAtStart',
+ input: createText(TEXT, 0),
+ contractedOutput: 'uuuuuuccccccc' },
+ { name: 'textWithCaretAtEnd',
+ input: createText(TEXT, TEXT.length),
+ contractedOutput: 'cccccccuuuuuu' },
+ { name: 'textWithCaretInWhitespace',
+ input: createText(TEXT, 6),
+ contractedOutput: 'uuuuuuucccccc' },
+ { name: 'textWithSelectionEndInWhitespace',
+ input: createText(TEXT, 0, 7),
+ contractedOutput: 'uuuuuuucccccc' },
+ { name: 'textWithSelectionInTwoWords',
+ input: createText(TEXT, 2, 9),
+ contractedOutput: 'uuuuuucuuuuuu' }
+ ];
+
+ var expType = cvox.ExpandingBrailleTranslator.ExpansionType;
+ for (var i = 0, testCase; testCase = TESTDATA[i]; ++i) {
+ runTranslationTestVariants(testCase, false, expType.SELECTION);
+ runTranslationTestVariants(testCase, true, expType.NONE);
+ runTranslationTestVariants(testCase, true, expType.SELECTION);
+ runTranslationTestVariants(testCase, true, expType.ALL);
+ }
+ // Make sure that the logic above runs the tests, adjust when adding more
+ // tests.
+ assertEquals(64, totalRunTranslationTests);
+});