Add new certificateProvider extension API.
[chromium-blink-merge.git] / chrome / browser / resources / chromeos / chromevox / braille / braille_display_manager_test.unitjs
blobdb4b37fed45f2c875d940cf4dcc0ad4b52f0541b
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Include test fixture.
6 GEN_INCLUDE(['../testing/chromevox_unittest_base.js',
7              '../testing/fake_objects.js']);
9 /**
10  * Test fixture.
11  * @constructor
12  * @extends {ChromeVoxUnitTestBase}
13  */
14 function CvoxBrailleDisplayManagerUnitTest() {}
16 CvoxBrailleDisplayManagerUnitTest.prototype = {
17   __proto__: ChromeVoxUnitTestBase.prototype,
19   /** @override */
20   closureModuleDeps: [
21     'cvox.BrailleDisplayManager',
22     'cvox.BrailleInterface',
23     'cvox.LibLouis',
24     'cvox.NavBraille',
25   ],
27   /** @override */
28   setUp: function() {
29     /** @const */
30     this.NAV_BRAILLE = new cvox.NavBraille({ text: 'Hello, world!' });
31     this.EMPTY_NAV_BRAILLE = new cvox.NavBraille({ text: '' });
32     this.translator = new FakeTranslator();
33     this.translatorManager = new FakeTranslatorManager();
34     /** @const */
35     this.DISPLAY_SIZE = 12;
36   },
38   addFakeApi: function() {
39     chrome.brailleDisplayPrivate = {};
40     chrome.brailleDisplayPrivate.getDisplayState = function(callback) {
41       callback(this.displayState);
42     }.bind(this);
43     this.writtenCells = [];
44     chrome.brailleDisplayPrivate.writeDots = function(cells) {
45       this.writtenCells.push(cells);
46     }.bind(this);
47     chrome.brailleDisplayPrivate.onDisplayStateChanged = new FakeChromeEvent();
48     chrome.brailleDisplayPrivate.onKeyEvent = new FakeChromeEvent();
49   },
51   displayAvailable: function() {
52     this.displayState = {available: true, textCellCount: this.DISPLAY_SIZE};
53   },
55   /**
56    * Asserts display pan position and selection markers on the last written
57    * display content and clears it.  There must be exactly one
58    * set of cells written.
59    * @param {number} start expected pan position
60    * @param {number=} opt_selStart first cell (relative to buffer start that
61    *                               should have a selection
62    * @param {number=} opt_selEnd last cell that should have a selection.
63    */
64   assertDisplayPositionAndClear: function(start, opt_selStart, opt_selEnd) {
65     if (opt_selStart !== undefined && opt_selEnd === undefined) {
66       opt_selEnd = opt_selStart + 1;
67     }
68     assertEquals(1, this.writtenCells.length);
69     var a = new Uint8Array(this.writtenCells[0]);
70     this.writtenCells.length = 0;
71     var firstCell = a[0] & ~cvox.BrailleDisplayManager.CURSOR_DOTS_;
72     assertEquals(start, firstCell,
73                  'Start mismatch: ' + start + ' vs. ' + firstCell);
74     if (opt_selStart !== undefined) {
75       for (var i = opt_selStart; i < opt_selEnd; ++i) {
76         assertEquals(cvox.BrailleDisplayManager.CURSOR_DOTS_,
77                      a[i] & cvox.BrailleDisplayManager.CURSOR_DOTS_,
78                      'Missing cursor marker at position ' + i);
79       }
80     }
81   },
83   /**
84    * Asserts that the last written display content is an empty buffer of
85    * of cells and clears the list of written cells.
86    * There must be only one buffer in the list.
87    */
88   assertEmptyDisplayAndClear: function() {
89     assertEquals(1, this.writtenCells.length);
90     var content = this.writtenCells[0];
91     this.writtenCells.length = 0;
92     assertTrue(content instanceof ArrayBuffer);
93     assertTrue(content.byteLength == 0);
94   }
97 /** @extends {cvox.ExpandingBrailleTranslator} */
98 function FakeTranslator() {
101 FakeTranslator.prototype = {
102   /**
103    * Does a translation where every other character becomes two cells.
104    * @override
105    */
106   translate: function(spannable, expansionType, callback) {
107     text = spannable.toString();
108     var buf = new Uint8Array(text.length + text.length / 2);
109     var textToBraille = [];
110     var brailleToText = [];
111     var idx = 0;
112     for (var i = 0; i < text.length; ++i) {
113       textToBraille.push(idx);
114       brailleToText.push(i);
115       buf[idx] = idx;
116       idx++;
117       if ((i % 2) == 1) {
118         buf[idx] = idx;
119         idx++;
120         brailleToText.push(i);
121       }
122     }
123     callback(buf.buffer, textToBraille, brailleToText);
124   }
127 /** @extends {cvox.BrailleTranslatorManager} */
128 function FakeTranslatorManager() {
131 FakeTranslatorManager.prototype = {
132   changeListener: null,
133   translator: null,
135   setTranslator: function(translator) {
136     this.translator = translator;
137     if (this.changeListener) {
138       this.changeListener();
139     }
140   },
142   addChangeListener: function(listener) {
143     assertEquals(null, this.changeListener);
144     this.changeListener = listener;
145   },
147   getExpandingTranslator: function() {
148     return this.translator;
149   }
152 var chrome = {};
154 // Fake chrome.storage API.
155 chrome.storage = {
156   onChanged: new FakeChromeEvent(),
158   local: {
159     get: function(object, callback) {
160       callback({brailleWordWrap: false});
161     }
162   }
166 TEST_F('CvoxBrailleDisplayManagerUnitTest', 'NoApi', function() {
167   var manager = new cvox.BrailleDisplayManager(this.translatorManager);
168   manager.setContent(this.NAV_BRAILLE);
169   this.translatorManager.setTranslator(this.translator);
170   manager.setContent(this.NAV_BRAILLE);
174  * Test that we don't write to the display when the API is available, but
175  * the display is not.
176  */
177 TEST_F('CvoxBrailleDisplayManagerUnitTest', 'NoDisplay', function() {
178   this.addFakeApi();
179   this.displayState = {available: false};
181   var manager = new cvox.BrailleDisplayManager(this.translatorManager);
182   manager.setContent(this.NAV_BRAILLE);
183   this.translatorManager.setTranslator(this.translator);
184   manager.setContent(this.NAV_BRAILLE);
185   assertEquals(0, this.writtenCells.length);
190  * Tests the typical sequence: setContent, setTranslator, setContent.
191  */
192 TEST_F('CvoxBrailleDisplayManagerUnitTest', 'BasicSetContent', function() {
193   this.addFakeApi();
194   this.displayAvailable();
195   var manager = new cvox.BrailleDisplayManager(this.translatorManager);
196   this.assertEmptyDisplayAndClear();
197   manager.setContent(this.NAV_BRAILLE);
198   this.assertEmptyDisplayAndClear();
199   this.translatorManager.setTranslator(this.translator);
200   this.assertDisplayPositionAndClear(0);
201   manager.setContent(this.NAV_BRAILLE);
202   this.assertDisplayPositionAndClear(0);
207  * Tests that setting empty content clears the display.
208  */
209 TEST_F('CvoxBrailleDisplayManagerUnitTest', 'SetEmptyContentWithTranslator',
210        function() {
211   this.addFakeApi();
212   this.displayAvailable();
214   var manager = new cvox.BrailleDisplayManager(this.translatorManager);
215   this.assertEmptyDisplayAndClear();
216   manager.setContent(this.NAV_BRAILLE);
217   this.assertEmptyDisplayAndClear();
218   this.translatorManager.setTranslator(this.translator);
219   this.assertDisplayPositionAndClear(0);
220   manager.setContent(this.EMPTY_NAV_BRAILLE);
221   this.assertEmptyDisplayAndClear();
225 TEST_F('CvoxBrailleDisplayManagerUnitTest', 'CursorAndPanning', function() {
226   var text = 'This is a test string';
227   function createNavBrailleWithCursor(start, end) {
228     return new cvox.NavBraille({ text: text, startIndex: start,
229                                  endIndex: end});
230   }
232   var translatedSize = Math.floor(text.length + text.length / 2);
234   this.addFakeApi();
235   this.displayAvailable();
237   var manager = new cvox.BrailleDisplayManager(this.translatorManager);
238   this.assertEmptyDisplayAndClear();
239   this.translatorManager.setTranslator(this.translator);
240   this.assertEmptyDisplayAndClear();
242   // Cursor at beginning of line.
243   manager.setContent(createNavBrailleWithCursor(0, 0));
244   this.assertDisplayPositionAndClear(0, 0);
245   // Cursor at end of line.
246   manager.setContent(createNavBrailleWithCursor(text.length, text.length));
247   this.assertDisplayPositionAndClear(
248       2 * this.DISPLAY_SIZE,
249       translatedSize % this.DISPLAY_SIZE);
250   // Selection from the end of what fits on the first display to the end of the
251   // line.
252   manager.setContent(createNavBrailleWithCursor(7, text.length));
253   this.assertDisplayPositionAndClear(0, 10, this.DISPLAY_SIZE);
254   // Selection on all of the line.
255   manager.setContent(createNavBrailleWithCursor(0, text.length));
256   this.assertDisplayPositionAndClear(0, 0, this.DISPLAY_SIZE);