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