Index: chrome/browser/resources/chromeos/chromevox/common/braille_util_test.js |
diff --git a/chrome/browser/resources/chromeos/chromevox/common/braille_util_test.js b/chrome/browser/resources/chromeos/chromevox/common/braille_util_test.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c32ac8017ca08be46af97ab28845b55d64ecb9f4 |
--- /dev/null |
+++ b/chrome/browser/resources/chromeos/chromevox/common/braille_util_test.js |
@@ -0,0 +1,400 @@ |
+// Copyright 2013 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']); |
+ |
+/** |
+ * Test fixture. |
+ * @constructor |
+ * @extends {ChromeVoxUnitTestBase} |
+ */ |
+function CvoxBrailleUtilUnitTest() {} |
+ |
+CvoxBrailleUtilUnitTest.prototype = { |
+ __proto__: ChromeVoxUnitTestBase.prototype, |
+ |
+ /** @override */ |
+ closureModuleDeps: [ |
+ 'cvox.BrailleUtil', |
+ 'cvox.CursorSelection', |
+ 'cvox.NavigationShifter', |
+ 'cvox.TestMsgs', |
+ ], |
+ |
+ /** @override */ |
+ setUp: function() { |
+ cvox.ChromeVox.msgs = new cvox.TestMsgs(); |
+ }, |
+ |
+ /** |
+ * @param {!Node} expectedParent Expected parent node. |
+ * @param {!Node} node Node to examine. |
+ * @private |
+ */ |
+ assertTextNodeChildOf_: function(expectedParent, node) { |
+ assertEquals(Node.TEXT_NODE, node.nodeType); |
+ assertEquals(expectedParent, node.parentNode); |
+ }, |
+ |
+ /** |
+ * Helper to retrieve braille for testing. |
+ * @param {!cvox.CursorSelection} prevSel Previous selection. |
+ * @param {!cvox.CursorSelection} sel Current selection. |
+ * @return {!cvox.NavBraille} Resulting braille. |
+ * @private |
+ */ |
+ getBraille_: function(prevSel, sel) { |
+ return (new cvox.NavigationShifter).getBraille(prevSel, sel); |
+ }, |
+ |
+ /** |
+ * Asserts that two NavBraille objects are equal, ignoring spans. |
+ * @param {Object} expected Expected result, should have no spans. |
+ * @param {cvox.NavBraille} actual Actual result. |
+ */ |
+ assertBrailleEquals: function(expected, actual) { |
+ actual = new cvox.NavBraille({ |
+ text: actual.text.toString(), |
+ startIndex: actual.startIndex, |
+ endIndex: actual.endIndex |
+ }); |
+ assertThat(new cvox.NavBraille(expected), eqJSON(actual)); |
+ } |
+}; |
+ |
+TEST_F('CvoxBrailleUtilUnitTest', 'BrailleName', function() { |
+ this.loadHtml( |
+ '<div id="navbar">' + |
+ '<a id="1" href="one.com">one</a>' + |
+ '<a id="2" href="two.com">two</a>' + |
+ '<a id="3" href="three.com">three</a>' + |
+ '</div>'); |
+ var navbar = cvox.CursorSelection.fromNode($('navbar')); |
+ var braille = this.getBraille_(navbar, navbar); |
+ this.assertBrailleEquals( |
+ {text: 'one lnk two lnk three lnk', |
+ startIndex: 0, |
+ endIndex: 1 |
+ }, braille); |
+ |
+ var one = |
+ cvox.CursorSelection.fromNode($('1').firstChild); |
+ braille = this.getBraille_(one, one); |
+ this.assertBrailleEquals( |
+ {text: 'one lnk two lnk three lnk', |
+ startIndex: 0, |
+ endIndex: 1 |
+ }, braille); |
+ |
+ var two = |
+ cvox.CursorSelection.fromNode($('2').firstChild); |
+ braille = this.getBraille_(one, two); |
+ this.assertBrailleEquals( |
+ {text: 'one lnk two lnk three lnk', |
+ startIndex: 8, |
+ endIndex: 9 |
+ }, braille); |
+ |
+ var three = |
+ cvox.CursorSelection.fromNode($('3').firstChild); |
+ braille = this.getBraille_(two, three); |
+ this.assertBrailleEquals( |
+ {text: 'one lnk two lnk three lnk', |
+ startIndex: 16, |
+ endIndex: 17 |
+ }, braille); |
+}); |
+ |
+ |
+/** |
+ * @export |
+ */ |
+TEST_F('CvoxBrailleUtilUnitTest', 'NameTemplate', function() { |
+ this.loadHtml( |
+ '<button id="1">Submit</button>' + |
+ '<input id="2" type="text" aria-label="Search">' |
+ ); |
+ |
+ var button = cvox.CursorSelection.fromNode($('1')); |
+ |
+ this.assertBrailleEquals( |
+ {text: '[Submit]', |
+ startIndex: 0, |
+ endIndex: 1 |
+ }, this.getBraille_(button, button)); |
+ |
+ var inputElement = $('2'); |
+ var input = cvox.CursorSelection.fromNode(inputElement); |
+ |
+ // Note: the cursor appears where text would be typed. |
+ this.assertBrailleEquals( |
+ {text: 'Search: edtxt', |
+ startIndex: 0, |
+ endIndex: 1 |
+ }, this.getBraille_(input, input)); |
+ inputElement.focus(); |
+ this.assertBrailleEquals( |
+ {text: 'Search: edtxt', |
+ startIndex: 8, |
+ endIndex: 8 |
+ }, this.getBraille_(input, input)); |
+}); |
+ |
+ |
+/** |
+ * @export |
+ */ |
+TEST_F('CvoxBrailleUtilUnitTest', 'TextField', function() { |
+ this.loadHtml( |
+ '<input id="1" type="text" aria-label="Search" value="larry">' |
+ ); |
+ |
+ var inputElement = $('1'); |
+ var input = cvox.CursorSelection.fromNode(inputElement); |
+ |
+ // Note: the cursor appears where text would be typed. |
+ // The cursor is at the beginning by default. |
+ this.assertBrailleEquals( |
+ {text: 'Search: larry edtxt', |
+ startIndex: 0, |
+ endIndex: 1 |
+ }, this.getBraille_(input, input)); |
+ inputElement.focus(); |
+ inputElement.selectionStart = 0; |
+ inputElement.selectionEnd = 5; |
+ this.assertBrailleEquals( |
+ {text: 'Search: larry edtxt', |
+ startIndex: 8, |
+ endIndex: 13 |
+ }, this.getBraille_(input, input)); |
+}); |
+ |
+ |
+/** |
+ * @export |
+ */ |
+TEST_F('CvoxBrailleUtilUnitTest', 'TextFieldEmpty', function() { |
+ this.loadHtml( |
+ '<input id="1" type="text">' |
+ ); |
+ |
+ var inputElement = $('1'); |
+ var input = cvox.CursorSelection.fromNode($('1')); |
+ |
+ this.assertBrailleEquals( |
+ {text: ': edtxt', |
+ startIndex: 0, |
+ endIndex: 1 |
+ }, this.getBraille_(input, input)); |
+ inputElement.focus(); |
+ this.assertBrailleEquals( |
+ {text: ': edtxt', |
+ startIndex: 2, |
+ endIndex: 2 |
+ }, this.getBraille_(input, input)); |
+}); |
+ |
+ |
+/** |
+ * @export |
+ */ |
+TEST_F('CvoxBrailleUtilUnitTest', 'TextFieldSelection', function() { |
+ this.loadHtml( |
+ '<input id="1" type="text" value="strawberry">' |
+ ); |
+ |
+ var inputElem = $('1'); |
+ var input = cvox.CursorSelection.fromNode(inputElem); |
+ |
+ // Selection. |
+ inputElem.selectionStart = 2; |
+ inputElem.selectionEnd = 5; |
+ this.assertBrailleEquals( |
+ {text: ': strawberry edtxt', |
+ startIndex: 4, |
+ endIndex: 7 |
+ }, this.getBraille_(input, input)); |
+ |
+ // Cursor at end. |
+ inputElem.selectionStart = 10; |
+ inputElem.selectionEnd = 10; |
+ this.assertBrailleEquals( |
+ {text: ': strawberry edtxt', |
+ startIndex: 12, |
+ endIndex: 12 |
+ }, this.getBraille_(input, input)); |
+}); |
+ |
+ |
+/** |
+ * @export |
+ */ |
+TEST_F('CvoxBrailleUtilUnitTest', 'StateTemplate', function() { |
+ this.loadHtml( |
+ '<input id="1" type="checkbox" aria-label="Save">'); |
+ |
+ var checkbox = cvox.CursorSelection.fromNode($('1')); |
+ |
+ this.assertBrailleEquals( |
+ {text: 'Save ( )', |
+ startIndex: 0, |
+ endIndex: 1 |
+ }, this.getBraille_(checkbox, checkbox)); |
+ |
+ $('1').checked = true; |
+ |
+ this.assertBrailleEquals( |
+ {text: 'Save (x)', |
+ startIndex: 0, |
+ endIndex: 1 |
+ }, this.getBraille_(checkbox, checkbox)); |
+}); |
+ |
+ |
+/** |
+ * @export |
+ */ |
+TEST_F('CvoxBrailleUtilUnitTest', 'AccessKey', function() { |
+ this.loadHtml( |
+ '<a href="http://www.google.com" id="1" accesskey="g">Google</a>'); |
+ |
+ var link = cvox.CursorSelection.fromNode($('1')); |
+ |
+ this.assertBrailleEquals( |
+ {text: 'Google lnk access key:g', |
+ startIndex: 0, |
+ endIndex: 1 |
+ }, this.getBraille_(link, link)); |
+}); |
+ |
+ |
+/** |
+ * @export |
+ */ |
+TEST_F('CvoxBrailleUtilUnitTest', 'ContainerTemplate', function() { |
+ this.loadHtml( |
+ '<h1>' + |
+ '<a id="1" href="#menu">Skip To Menu</a>' + |
+ '</h1>' |
+ ); |
+ |
+ var link = cvox.CursorSelection.fromNode($('1')); |
+ |
+ var navBraille = this.getBraille_( |
+ cvox.CursorSelection.fromBody(), link); |
+ this.assertBrailleEquals( |
+ {text: 'h1 Skip To Menu int lnk', |
+ startIndex: 0, |
+ endIndex: 1 |
+ }, navBraille); |
+}); |
+ |
+ |
+/** |
+ * @export |
+ */ |
+TEST_F('CvoxBrailleUtilUnitTest', 'LinkSpans', function() { |
+ this.loadHtml('<p><a id="1" href="#1">Hello</a> from' + |
+ ' <a id="2" href="//www.google.com/">ChromeVox</a>'); |
+ var link1 = $('1'); |
+ var link2 = $('2'); |
+ var navBraille = this.getBraille_( |
+ cvox.CursorSelection.fromBody(), cvox.CursorSelection.fromNode(link1)); |
+ assertEquals('Hello int lnk from ChromeVox lnk', |
+ navBraille.text.toString()); |
+ assertEquals(link1, navBraille.text.getSpan(0)); |
+ assertEquals(link1, navBraille.text.getSpan(12)); |
+ assertEquals('undefined', typeof navBraille.text.getSpan(13)); |
+ assertEquals('undefined', typeof navBraille.text.getSpan(18)); |
+ assertEquals(link2, navBraille.text.getSpan(19)); |
+ assertEquals(link2, navBraille.text.getSpan(31)); |
+}); |
+ |
+ |
+/** |
+ * @export |
+ */ |
+TEST_F('CvoxBrailleUtilUnitTest', 'NestedElements', function() { |
+ this.loadHtml('<h1 id="test-h1">Larry, ' + |
+ '<a href="#batman" id="batman-link">Sergey</a> and Eric</h1>'); |
+ var h1 = $('test-h1'); |
+ var link = $('batman-link'); |
+ var navBraille = this.getBraille_( |
+ cvox.CursorSelection.fromBody(), cvox.CursorSelection.fromNode(h1)); |
+ assertEquals('h1 Larry, Sergey int lnk and Eric', |
+ navBraille.text.toString()); |
+ this.assertTextNodeChildOf_(h1, navBraille.text.getSpan(0)); |
+ this.assertTextNodeChildOf_(h1, navBraille.text.getSpan(5)); |
+ assertEquals(link, navBraille.text.getSpan(15)); |
+ this.assertTextNodeChildOf_(h1, navBraille.text.getSpan(30)); |
+}); |
+ |
+ |
+/** |
+ * @export |
+ */ |
+TEST_F('CvoxBrailleUtilUnitTest', 'GetTemplatedOverride', function() { |
+ assertEquals('Menu mnu', |
+ cvox.BrailleUtil.getTemplated(null, null, |
+ { 'name': 'Menu', |
+ 'roleMsg': 'aria_role_menu' }). |
+ toString()); |
+ assertEquals('alrt: Watch out!', |
+ cvox.BrailleUtil.getTemplated(null, null, |
+ { 'name': 'Watch out!', |
+ 'roleMsg': 'aria_role_alert' }). |
+ toString()); |
+ // Test all properties. role, if present, overrides roleMsg. |
+ assertEquals('Name Value Role State', |
+ cvox.BrailleUtil.getTemplated(null, null, |
+ { 'name': 'Name', |
+ 'role': 'Role', |
+ 'roleMsg': 'excluded', |
+ 'value': 'Value', |
+ 'state': 'State' |
+ }).toString()); |
+}); |
+ |
+ |
+/** |
+ * @export |
+ */ |
+TEST_F('CvoxBrailleUtilUnitTest', 'CreateValue', function() { |
+ var s; |
+ var valueSpan; |
+ var selectiponSpan; |
+ |
+ // Value without a selection. |
+ s = cvox.BrailleUtil.createValue('value'); |
+ assertEquals('value', s.toString()); |
+ assertUndefined(s.getSpanInstanceOf(cvox.BrailleUtil.ValueSelectionSpan)); |
+ valueSpan = s.getSpanInstanceOf(cvox.BrailleUtil.ValueSpan); |
+ assertEquals(0, s.getSpanStart(valueSpan)); |
+ assertEquals(s.getLength(), s.getSpanEnd(valueSpan)); |
+ |
+ // Value with a carret at the start of the text. |
+ s = cvox.BrailleUtil.createValue('value', 0); |
+ selectionSpan = s.getSpanInstanceOf(cvox.BrailleUtil.ValueSelectionSpan); |
+ assertEquals(0, s.getSpanStart(selectionSpan)); |
+ assertEquals(0, s.getSpanEnd(selectionSpan)); |
+ |
+ // Value with a carret inside the text. |
+ s = cvox.BrailleUtil.createValue('value', 1); |
+ selectionSpan = s.getSpanInstanceOf(cvox.BrailleUtil.ValueSelectionSpan); |
+ assertEquals(1, s.getSpanStart(selectionSpan)); |
+ assertEquals(1, s.getSpanEnd(selectionSpan)); |
+ |
+ // Value with a carret at the end of the text. |
+ s = cvox.BrailleUtil.createValue('value', 5); |
+ selectionSpan = s.getSpanInstanceOf(cvox.BrailleUtil.ValueSelectionSpan); |
+ assertEquals(5, s.getSpanStart(selectionSpan)); |
+ assertEquals(5, s.getSpanEnd(selectionSpan)); |
+ |
+ // All of the value selected selected with reversed start and end. |
+ s = cvox.BrailleUtil.createValue('value', 5, 0); |
+ selectionSpan = s.getSpanInstanceOf(cvox.BrailleUtil.ValueSelectionSpan); |
+ assertEquals(0, s.getSpanStart(selectionSpan)); |
+ assertEquals(5, s.getSpanEnd(selectionSpan)); |
+}); |