braille_display_manager_test.unitjs revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
18cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar// Copyright 2014 The Chromium Authors. All rights reserved. 28cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar// Use of this source code is governed by a BSD-style license that can be 38cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar// found in the LICENSE file. 4b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 5b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// Include test fixture. 6b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel DunbarGEN_INCLUDE(['../../testing/chromevox_unittest_base.js', 7b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar '../../testing/fake_objects.js']); 8b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 9b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar/** 10b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar * Test fixture. 11b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar * @constructor 12b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar * @extends {ChromeVoxUnitTestBase} 13b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar */ 14b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbarfunction CvoxBrailleDisplayManagerUnitTest() {} 15b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 16b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel DunbarCvoxBrailleDisplayManagerUnitTest.prototype = { 17b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar __proto__: ChromeVoxUnitTestBase.prototype, 18b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 19b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar /** @override */ 20b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar closureModuleDeps: [ 21b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 'cvox.BrailleDisplayManager', 22b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 'cvox.BrailleInterface', 238cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 'cvox.LibLouis', 248cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 'cvox.NavBraille', 258cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar ], 268cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 278cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar /** @override */ 288cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar setUp: function() { 298cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar /** @const */ 308cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.NAV_BRAILLE = new cvox.NavBraille({ text: 'Hello, world!' }); 318cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.EMPTY_NAV_BRAILLE = new cvox.NavBraille({ text: '' }); 328cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.translator = new FakeTranslator(); 338cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar /** @const */ 348cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.DISPLAY_SIZE = 12; 358cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar }, 368cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 378cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar addFakeApi: function() { 388cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar chrome.brailleDisplayPrivate = {}; 398cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar chrome.brailleDisplayPrivate.getDisplayState = function(callback) { 408cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar callback(this.displayState); 418cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar }.bind(this); 428cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.writtenCells = []; 438cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar chrome.brailleDisplayPrivate.writeDots = function(cells) { 448cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.writtenCells.push(cells); 458cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar }.bind(this); 468cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar chrome.brailleDisplayPrivate.onDisplayStateChanged = new FakeChromeEvent(); 478cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar chrome.brailleDisplayPrivate.onKeyEvent = new FakeChromeEvent(); 488cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar }, 498cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 508cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar displayAvailable: function() { 518cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.displayState = {available: true, textCellCount: this.DISPLAY_SIZE}; 528cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar }, 538cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 548cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar /** 558cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * Asserts display pan position and selection markers on the last written 568cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * display content and clears it. There must be exactly one 578cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * set of cells written. 588cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * @param {number} start expected pan position 598cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * @param {number=} opt_selStart first cell (relative to buffer start that 608cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * should have a selection 618cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * @param {number=} opt_selEnd last cell that should have a selection. 628cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar */ 638cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar assertDisplayPositionAndClear: function(start, opt_selStart, opt_selEnd) { 648cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar if (opt_selStart !== undefined && opt_selEnd === undefined) { 658cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar opt_selEnd = opt_selStart + 1; 668cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar } 678cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar assertEquals(1, this.writtenCells.length); 688cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar var a = new Uint8Array(this.writtenCells[0]); 698cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.writtenCells.length = 0; 708cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar assertEquals(start, a[0] & ~cvox.BrailleDisplayManager.CURSOR_DOTS_, 718cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 'Start mismatch: ' + start + ' vs. ' + a[0]); 728cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar if (opt_selStart !== undefined) { 738cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar for (var i = opt_selStart; i < opt_selEnd; ++i) { 748cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar assertEquals(cvox.BrailleDisplayManager.CURSOR_DOTS_, 758cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar a[i] & cvox.BrailleDisplayManager.CURSOR_DOTS_, 768cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 'Missing cursor marker at position ' + i); 778cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar } 788cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar } 798cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar }, 808cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 818cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar /** 828cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * Asserts that the last written display content is an empty buffer of 838cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * of cells and clears the list of written cells. 848cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * There must be only one buffer in the list. 858cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar */ 868cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar assertEmptyDisplayAndClear: function() { 878cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar assertEquals(1, this.writtenCells.length); 888cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar var content = this.writtenCells[0]; 898cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.writtenCells.length = 0; 908cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar assertTrue(content instanceof ArrayBuffer); 918cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar assertTrue(content.byteLength == 0); 928cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar } 938cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar}; 948cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 958cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar/** @extends {cvox.LibLouis.Translator} */ 968cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbarfunction FakeTranslator() { 978cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar} 988cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 998cbe163cba77c772621f89ddb33793ac170b1faDaniel DunbarFakeTranslator.prototype = { 1008cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar /** 1018cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * Does a translation where every other character becomes two cells. 1028cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * @override 1038cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar */ 1048cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar translate: function(text, callback) { 1058cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar var buf = new Uint8Array(text.length + text.length / 2); 1068cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar var textToBraille = []; 1078cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar var brailleToText = []; 1088cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar var idx = 0; 1098cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar for (var i = 0; i < text.length; ++i) { 1108cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar textToBraille.push(idx); 1118cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar brailleToText.push(i); 1128cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar buf[idx] = idx; 1138cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar idx++; 1148cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar if ((i % 2) == 1) { 1158cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar buf[idx] = idx; 1168cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar idx++; 1178cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar brailleToText.push(i); 1188cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar } 1198cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar } 1208cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar callback(buf.buffer, textToBraille, brailleToText); 1218cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar } 1228cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar}; 1238cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 1248cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbarvar chrome = {}; 1258cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 1268cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 1278cbe163cba77c772621f89ddb33793ac170b1faDaniel DunbarTEST_F('CvoxBrailleDisplayManagerUnitTest', 'NoApi', function() { 1288cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar var manager = new cvox.BrailleDisplayManager(); 1298cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar manager.setContent(this.NAV_BRAILLE); 1308cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar manager.setTranslator(this.translator); 1318cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar manager.setContent(this.NAV_BRAILLE); 1328cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar}); 1338cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 1348cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar/** 1358cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * Test that we don't write to the display when the API is available, but 1368cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * the display is not. 1378cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar */ 1388cbe163cba77c772621f89ddb33793ac170b1faDaniel DunbarTEST_F('CvoxBrailleDisplayManagerUnitTest', 'NoDisplay', function() { 1398cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.addFakeApi(); 1408cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.displayState = {available: false}; 1418cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 1428cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar var manager = new cvox.BrailleDisplayManager(); 1438cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar manager.setContent(this.NAV_BRAILLE); 1448cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar manager.setTranslator(this.translator); 1458cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar manager.setContent(this.NAV_BRAILLE); 1468cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar assertEquals(0, this.writtenCells.length); 1478cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar}); 1488cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 1498cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 1508cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar/** 1518cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * Tests the typical sequence: setContent, setTranslator, setContent. 1528cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar */ 1538cbe163cba77c772621f89ddb33793ac170b1faDaniel DunbarTEST_F('CvoxBrailleDisplayManagerUnitTest', 'BasicSetContent', function() { 1548cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.addFakeApi(); 1558cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.displayAvailable(); 1568cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar var manager = new cvox.BrailleDisplayManager(); 1578cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.assertEmptyDisplayAndClear(); 1588cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar manager.setContent(this.NAV_BRAILLE); 1598cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar manager.setTranslator(this.translator); 1608cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.assertDisplayPositionAndClear(0); 1618cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar manager.setContent(this.NAV_BRAILLE); 1628cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.assertDisplayPositionAndClear(0); 1638cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar}); 1648cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 1658cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 1668cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar/** 1678cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar * Tests that setting empty content clears the display. 1688cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar */ 1698cbe163cba77c772621f89ddb33793ac170b1faDaniel DunbarTEST_F('CvoxBrailleDisplayManagerUnitTest', 'SetEmptyContentWithTranslator', 1708cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar function() { 1718cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.addFakeApi(); 1728cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar this.displayAvailable(); 1738cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar 1748cbe163cba77c772621f89ddb33793ac170b1faDaniel Dunbar var manager = new cvox.BrailleDisplayManager(); 175 this.assertEmptyDisplayAndClear(); 176 manager.setContent(this.NAV_BRAILLE); 177 manager.setTranslator(this.translator); 178 this.assertDisplayPositionAndClear(0); 179 manager.setContent(this.EMPTY_NAV_BRAILLE); 180 this.assertEmptyDisplayAndClear(); 181}); 182 183 184TEST_F('CvoxBrailleDisplayManagerUnitTest', 'CursorAndPanning', function() { 185 var text = 'This is a test string'; 186 function createNavBrailleWithCursor(start, end) { 187 return new cvox.NavBraille({ text: text, startIndex: start, 188 endIndex: end}); 189 } 190 191 var translatedSize = Math.floor(text.length + text.length / 2); 192 193 this.addFakeApi(); 194 this.displayAvailable(); 195 196 var manager = new cvox.BrailleDisplayManager(); 197 this.assertEmptyDisplayAndClear(); 198 manager.setTranslator(this.translator); 199 this.assertEmptyDisplayAndClear(); 200 201 // Cursor at beginning of line. 202 manager.setContent(createNavBrailleWithCursor(0, 0)); 203 this.assertDisplayPositionAndClear(0, 0); 204 // Cursor at end of line. 205 manager.setContent(createNavBrailleWithCursor(text.length, text.length)); 206 this.assertDisplayPositionAndClear( 207 2 * this.DISPLAY_SIZE, 208 translatedSize % this.DISPLAY_SIZE); 209 // Selection from the end of what fits on the first display to the end of the 210 // line. 211 manager.setContent(createNavBrailleWithCursor(7, text.length)); 212 this.assertDisplayPositionAndClear(0, 10, this.DISPLAY_SIZE); 213 // Selection on all of the line. 214 manager.setContent(createNavBrailleWithCursor(0, text.length)); 215 this.assertDisplayPositionAndClear(0, 0, this.DISPLAY_SIZE); 216}); 217