OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** @fileoverview Suite of tests for settings-languages-page. */ | 5 cr.define('languages_page_tests', function() { |
6 | 6 /** @enum {string} */ |
7 /** @const {string} Path to root from chrome/test/data/webui/settings/. */ | 7 const TestNames = { |
dpapad
2017/04/25 20:41:17
See other comment in this file about ES6 usage.
michaelpg
2017/05/04 22:54:19
Acknowledged.
| |
8 var ROOT_PATH = '../../../../../'; | 8 AddLanguagesDialog: 'add languages dialog', |
9 | 9 LanguageMenu: 'language menu', |
10 // Polymer BrowserTest fixture. | 10 InputMethods: 'input methods', |
11 GEN_INCLUDE( | 11 Spellcheck: 'spellcheck', |
12 [ROOT_PATH + 'chrome/test/data/webui/polymer_browser_test_base.js']); | 12 }; |
13 // SettingsPageBrowserTest fixture. | |
14 GEN_INCLUDE([ROOT_PATH + | |
15 'chrome/test/data/webui/settings/settings_page_browsertest.js']); | |
16 | |
17 /** | |
18 * Test class for settings-languages-page UI. | |
19 * @constructor | |
20 * @extends {SettingsPageBrowserTest} | |
21 */ | |
22 function SettingsLanguagesPageBrowserTest() {} | |
23 | |
24 SettingsLanguagesPageBrowserTest.prototype = { | |
25 __proto__: SettingsPageBrowserTest.prototype, | |
26 | |
27 /** @override */ | |
28 preLoad: function() { | |
29 SettingsPageBrowserTest.prototype.preLoad.call(this); | |
30 settingsHidePagesByDefaultForTest = true; | |
31 }, | |
32 }; | |
33 | |
34 // Flaky on Windows, Mac and Linux. See https://crbug.com/641400. | |
35 // | |
36 // May time out on debug builders and memory bots because the Settings page can | |
37 // take several seconds to load in a Release build and several times that in a | |
38 // Debug build. See https://crbug.com/558434. | |
39 // | |
40 // Disabling this test in general. | |
41 GEN('#define MAYBE_LanguagesPage DISABLED_LanguagesPage'); | |
42 | |
43 // Runs languages page tests. | |
44 TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { | |
45 var self = this; | |
46 | |
47 suiteSetup(function() { | |
48 self.toggleAdvanced(); | |
49 }); | |
50 | 13 |
51 suite('languages page', function() { | 14 suite('languages page', function() { |
52 testing.Test.disableAnimationsAndTransitions(); | 15 /** @type {?LanguageHelper} */ |
16 var languageHelper = null; | |
17 /** @type {?SettingsLanguagesPageElement} */ | |
18 var languagesPage = null; | |
19 /** @type {?IronCollapseElement} */ | |
20 var languagesCollapse = null; | |
21 /** @type {?CrActionMenuElement} */ | |
22 var actionMenu = null; | |
23 /** @type {?settings.LanguagesBrowserProxy} */ | |
24 var browserProxy = null; | |
53 | 25 |
54 var languagesSection; | 26 // Enabled language pref name for the platform. |
55 var languagesPage; | 27 const languagesPref = |
56 var languagesCollapse; | 28 cr.isChromeOS ? 'settings.language.preferred_languages' |
57 var languageHelper; | 29 : 'intl.accept_languages'; |
58 var actionMenu; | |
59 | 30 |
60 /** | 31 // Initial value of enabled languages pref used in tests. |
61 * @param {numExpected} Expected number of languages to eventually be | 32 const initialLanguages = 'en-US,sw'; |
62 * enabled. | |
63 * @return {!Promise} Resolved when the number of enabled languages changes | |
64 * to match expectations. | |
65 */ | |
66 function whenNumEnabledLanguagesBecomes(numExpected) { | |
67 assert(!!languagesPage); | |
68 return new Promise(function(resolve, reject) { | |
69 languagesPage.addEventListener('languages-changed', function changed() { | |
70 if (languagesPage.languages.enabled.length != numExpected) | |
71 return; | |
72 resolve(); | |
73 languagesPage.removeEventListener('languages-changed', changed); | |
74 }); | |
75 }); | |
76 } | |
77 | |
78 // Returns supported languages that are not enabled. | |
79 function getAvailableLanguages() { | |
80 return languagesPage.languages.supported.filter(function(language) { | |
81 return !languageHelper.isLanguageEnabled(language.code); | |
82 }); | |
83 } | |
84 | 33 |
85 suiteSetup(function() { | 34 suiteSetup(function() { |
86 var page = self.basicPage; | 35 testing.Test.disableAnimationsAndTransitions(); |
87 page.set('pageVisibility.languages', true); | 36 PolymerTest.clearBody(); |
88 Polymer.dom.flush(); | 37 CrSettingsPrefs.deferInitialization = true; |
89 | |
90 languagesSection = assert(this.getSection(page, 'languages')); | |
91 languagesPage = assert( | |
92 languagesSection.querySelector('settings-languages-page')); | |
93 languagesCollapse = languagesPage.$.languagesCollapse; | |
94 languagesCollapse.opened = true; | |
95 actionMenu = languagesPage.$.menu.get(); | |
96 | |
97 languageHelper = languagesPage.languageHelper; | |
98 return languageHelper.whenReady(); | |
99 }.bind(this)); | |
100 | |
101 teardown(function(done) { | |
102 if (actionMenu.open) | |
103 actionMenu.close(); | |
104 | |
105 // Close the section if we're in a sub-page. | |
106 if (settings.getCurrentRoute().isSubpage()) { | |
107 settings.navigateTo(settings.Route.BASIC); | |
108 setTimeout(done); | |
109 } else { | |
110 done(); | |
111 } | |
112 }); | 38 }); |
113 | 39 |
114 suite('add languages dialog', function() { | 40 setup(function() { |
41 var settingsPrefs = document.createElement('settings-prefs'); | |
42 var settingsPrivate = | |
43 new settings.FakeSettingsPrivate(settings.getFakeLanguagePrefs()); | |
44 settingsPrefs.initialize(settingsPrivate); | |
45 document.body.appendChild(settingsPrefs); | |
46 return CrSettingsPrefs.initialized.then(function() { | |
47 // Set up test browser proxy. | |
48 browserProxy = new settings.TestLanguagesBrowserProxy(); | |
49 settings.LanguagesBrowserProxyImpl.instance_ = browserProxy; | |
50 | |
51 // Set up fake languageSettingsPrivate API. | |
52 var languageSettingsPrivate = browserProxy.getLanguageSettingsPrivate(); | |
53 languageSettingsPrivate.setSettingsPrefs(settingsPrefs); | |
54 | |
55 languagesPage = document.createElement('settings-languages-page'); | |
56 | |
57 // Prefs would normally be data-bound to settings-languages-page. | |
58 languagesPage.prefs = settingsPrefs.prefs; | |
59 test_util.fakeDataBind(settingsPrefs, languagesPage, 'prefs'); | |
60 | |
61 document.body.appendChild(languagesPage); | |
62 languagesCollapse = languagesPage.$.languagesCollapse; | |
63 languagesCollapse.opened = true; | |
64 actionMenu = languagesPage.$.menu.get(); | |
65 | |
66 languageHelper = languagesPage.languageHelper; | |
67 return languageHelper.whenReady(); | |
68 }); | |
69 }); | |
70 | |
71 teardown(function() { | |
72 PolymerTest.clearBody(); | |
73 }); | |
74 | |
75 suite(TestNames.AddLanguagesDialog, function() { | |
115 var dialog; | 76 var dialog; |
116 var dialogItems; | 77 var dialogItems; |
117 var cancelButton; | 78 var cancelButton; |
118 var actionButton; | 79 var actionButton; |
119 | 80 |
120 setup(function(done) { | 81 setup(function(done) { |
121 var addLanguagesButton = | 82 var addLanguagesButton = |
122 languagesCollapse.querySelector('#addLanguages'); | 83 languagesCollapse.querySelector('#addLanguages'); |
123 MockInteractions.tap(addLanguagesButton); | 84 MockInteractions.tap(addLanguagesButton); |
124 | 85 |
(...skipping 26 matching lines...) Expand all Loading... | |
151 Polymer.dom.flush(); | 112 Polymer.dom.flush(); |
152 assertEquals(null, languagesPage.$$('settings-add-languages-dialog')); | 113 assertEquals(null, languagesPage.$$('settings-add-languages-dialog')); |
153 }); | 114 }); |
154 | 115 |
155 test('cancel', function() { | 116 test('cancel', function() { |
156 // Canceling the dialog should close and remove it. | 117 // Canceling the dialog should close and remove it. |
157 MockInteractions.tap(cancelButton); | 118 MockInteractions.tap(cancelButton); |
158 }); | 119 }); |
159 | 120 |
160 test('add languages and cancel', function(done) { | 121 test('add languages and cancel', function(done) { |
161 var numEnabled = languagesPage.languages.enabled.length; | |
162 | |
163 // Check some languages. | 122 // Check some languages. |
164 MockInteractions.tap(dialogItems[0]); | 123 MockInteractions.tap(dialogItems[1]); // en-CA. |
165 MockInteractions.tap(dialogItems[1]); | 124 MockInteractions.tap(dialogItems[2]); // tk. |
166 | 125 |
167 // Canceling the dialog should close and remove it without enabling | 126 // Canceling the dialog should close and remove it without enabling |
168 // the checked languages. A small timeout lets us check this. | 127 // the checked languages. A small timeout lets us check this. |
169 MockInteractions.tap(cancelButton); | 128 MockInteractions.tap(cancelButton); |
170 setTimeout(function() { | 129 setTimeout(function() { |
171 // Number of enabled languages should be the same. | 130 assertEquals(initialLanguages, |
172 assertEquals(numEnabled, languagesPage.languages.enabled.length); | 131 languageHelper.getPref(languagesPref).value); |
173 done(); | 132 done(); |
174 }, 100); | 133 }, 100); |
175 }); | 134 }); |
176 | 135 |
177 test('add languages and confirm', function() { | 136 test('add languages and confirm', function() { |
178 var numEnabled = languagesPage.languages.enabled.length; | |
179 | |
180 // No languages have been checked, so the action button is inert. | 137 // No languages have been checked, so the action button is inert. |
181 MockInteractions.tap(actionButton); | 138 MockInteractions.tap(actionButton); |
182 Polymer.dom.flush(); | 139 Polymer.dom.flush(); |
183 assertEquals(dialog, languagesPage.$$('settings-add-languages-dialog')); | 140 assertEquals(dialog, languagesPage.$$('settings-add-languages-dialog')); |
184 | 141 |
185 // Check and uncheck one language. | 142 // Check and uncheck one language. |
186 MockInteractions.tap(dialogItems[0]); | 143 MockInteractions.tap(dialogItems[0]); |
187 assertFalse(actionButton.disabled); | 144 assertFalse(actionButton.disabled); |
188 MockInteractions.tap(dialogItems[0]); | 145 MockInteractions.tap(dialogItems[0]); |
189 assertTrue(actionButton.disabled); | 146 assertTrue(actionButton.disabled); |
190 | 147 |
191 // Check multiple languages. | 148 // Check multiple languages. |
192 MockInteractions.tap(dialogItems[0]); | 149 MockInteractions.tap(dialogItems[0]); // en. |
193 MockInteractions.tap(dialogItems[1]); | 150 MockInteractions.tap(dialogItems[2]); // tk. |
194 assertFalse(actionButton.disabled); | 151 assertFalse(actionButton.disabled); |
195 | 152 |
196 // The action button should close and remove the dialog, enabling the | 153 // The action button should close and remove the dialog, enabling the |
197 // checked languages. | 154 // checked languages. |
198 MockInteractions.tap(actionButton); | 155 MockInteractions.tap(actionButton); |
199 | 156 |
200 // Wait for the languages to be enabled by the browser. | 157 assertEquals( |
201 return whenNumEnabledLanguagesBecomes(numEnabled + 2); | 158 initialLanguages + ',en,tk', |
159 languageHelper.getPref(languagesPref).value); | |
202 }); | 160 }); |
203 }); | 161 }); |
204 | 162 |
205 suite('language menu', function() { | 163 suite(TestNames.LanguageMenu, function() { |
206 var origTranslateEnabled; | 164 /* |
207 | |
208 /** | |
209 * Finds, asserts and returns the menu item for the given i18n key. | 165 * Finds, asserts and returns the menu item for the given i18n key. |
210 * @param {string} i18nKey Name of the i18n string for the item's text. | 166 * @param {string} i18nKey Name of the i18n string for the item's text. |
211 * @return {!HTMLElement} Menu item. | 167 * @return {!HTMLElement} Menu item. |
212 */ | 168 */ |
213 function getMenuItem(i18nKey) { | 169 function getMenuItem(i18nKey) { |
214 var i18nString = assert(loadTimeData.getString(i18nKey)); | 170 var i18nString = assert(loadTimeData.getString(i18nKey)); |
215 var menuItems = actionMenu.querySelectorAll('.dropdown-item'); | 171 var menuItems = actionMenu.querySelectorAll('.dropdown-item'); |
216 var menuItem = Array.from(menuItems).find( | 172 var menuItem = Array.from(menuItems).find( |
217 item => item.textContent.trim() == i18nString); | 173 item => item.textContent.trim() == i18nString); |
218 return assert(menuItem, 'Menu item "' + i18nKey + '" not found'); | 174 return assert(menuItem, 'Menu item "' + i18nKey + '" not found'); |
219 } | 175 } |
220 | 176 |
221 /** | 177 /* |
222 * Checks the visibility of each expected menu item button. | 178 * Checks the visibility of each expected menu item button. |
223 * param {!Object<boolean>} Dictionary from i18n keys to expected | 179 * param {!Object<boolean>} Dictionary from i18n keys to expected |
224 * visibility of those menu items. | 180 * visibility of those menu items. |
225 */ | 181 */ |
226 function assertMenuItemButtonsVisible(buttonVisibility) { | 182 function assertMenuItemButtonsVisible(buttonVisibility) { |
227 assertTrue(actionMenu.open); | 183 assertTrue(actionMenu.open); |
228 for (var buttonKey of Object.keys(buttonVisibility)) { | 184 for (var buttonKey of Object.keys(buttonVisibility)) { |
229 var buttonItem = getMenuItem(buttonKey); | 185 var buttonItem = getMenuItem(buttonKey); |
230 assertEquals(!buttonVisibility[buttonKey], buttonItem.hidden, | 186 assertEquals(!buttonVisibility[buttonKey], buttonItem.hidden, |
231 'Menu item "' + buttonKey + '" hidden'); | 187 'Menu item "' + buttonKey + '" hidden'); |
232 } | 188 } |
233 } | 189 } |
234 | 190 |
235 suiteSetup(function() { | |
236 // Cache the value of Translate to avoid side effects. | |
237 origTranslateEnabled = languageHelper.prefs.translate.enabled.value; | |
238 }); | |
239 | |
240 suiteTeardown(function() { | |
241 var cur = languageHelper.prefs.translate.enabled.value; | |
242 // Restore the value of Translate. | |
243 languageHelper.setPrefValue('translate.enabled', origTranslateEnabled); | |
244 cur = languageHelper.prefs.translate.enabled.value; | |
245 }); | |
246 | |
247 test('structure', function() { | 191 test('structure', function() { |
248 var languageOptionsDropdownTrigger = languagesCollapse.querySelector( | 192 var languageOptionsDropdownTrigger = languagesCollapse.querySelector( |
249 'paper-icon-button'); | 193 'paper-icon-button'); |
250 assertTrue(!!languageOptionsDropdownTrigger); | 194 assertTrue(!!languageOptionsDropdownTrigger); |
251 MockInteractions.tap(languageOptionsDropdownTrigger); | 195 MockInteractions.tap(languageOptionsDropdownTrigger); |
252 assertTrue(actionMenu.open); | 196 assertTrue(actionMenu.open); |
253 | 197 |
254 // Enable Translate so the menu always shows the Translate checkbox. | |
255 languageHelper.setPrefValue('translate.enabled', true); | |
256 | |
257 var separator = actionMenu.querySelector('hr'); | 198 var separator = actionMenu.querySelector('hr'); |
258 assertEquals(1, separator.offsetHeight); | 199 assertEquals(1, separator.offsetHeight); |
259 | 200 |
260 // Disable Translate. On platforms that can't change the UI language, | 201 // Disable Translate. On platforms that can't change the UI language, |
261 // this hides all the checkboxes, so the separator isn't needed. | 202 // this hides all the checkboxes, so the separator isn't needed. |
262 // Chrome OS and Windows still show a checkbox and thus the separator. | 203 // Chrome OS and Windows still show a checkbox and thus the separator. |
263 languageHelper.setPrefValue('translate.enabled', false); | 204 languageHelper.setPrefValue('translate.enabled', false); |
264 assertEquals( | 205 assertEquals( |
265 cr.isChromeOS || cr.isWindows ? 1 : 0, separator.offsetHeight); | 206 cr.isChromeOS || cr.isWindows ? 1 : 0, separator.offsetHeight); |
266 }); | 207 }); |
267 | 208 |
268 test('test translate.enable toggle', function() { | 209 test('test translate.enable toggle', function() { |
269 languageHelper.setPrefValue('translate.enabled', true); | 210 var settingsToggle = languagesPage.$.offerTranslateOtherLangs; |
270 var toggle = languagesPage.$.offerTranslateOtherLangs.root | 211 assertTrue(!!settingsToggle); |
271 .querySelectorAll('paper-toggle-button')[0]; | 212 var paperToggle = settingsToggle.$$('paper-toggle-button'); |
272 assertTrue(!!toggle); | 213 assertTrue(!!paperToggle); |
273 | 214 |
274 // Clicking on toggle switch it to false. | 215 // Clicking on the toggle switches it to false. |
275 MockInteractions.tap(toggle); | 216 MockInteractions.tap(paperToggle); |
dpapad
2017/04/25 20:41:17
Is taping the internal paper-toggle necessary? Wou
michaelpg
2017/05/04 22:54:19
Yes, it's necessary; nothing forwards the mock tap
| |
276 var newToggleValue = languageHelper.prefs.translate.enabled.value; | 217 var newToggleValue = languageHelper.prefs.translate.enabled.value; |
277 assertFalse(newToggleValue); | 218 assertFalse(newToggleValue); |
278 | 219 |
279 // Clicking on toggle switch it to true again. | 220 // Clicking on the toggle switches it to true again. |
280 MockInteractions.tap(toggle); | 221 MockInteractions.tap(paperToggle); |
281 newToggleValue = languageHelper.prefs.translate.enabled.value; | 222 newToggleValue = languageHelper.prefs.translate.enabled.value; |
282 assertTrue(newToggleValue); | 223 assertTrue(newToggleValue); |
283 }); | 224 }); |
284 | 225 |
285 test('toggle translate for a specific language', function(done) { | 226 test('toggle translate for a specific language', function(done) { |
286 // Enable Translate so the menu always shows the Translate checkbox. | 227 // Open options for 'sw'. |
287 languageHelper.setPrefValue('translate.enabled', true); | |
288 languagesPage.set('languages.translateTarget', 'foo'); | |
289 languagesPage.set('languages.enabled.1.supportsTranslate', true); | |
290 | |
291 var languageOptionsDropdownTrigger = | 228 var languageOptionsDropdownTrigger = |
292 languagesCollapse.querySelectorAll('paper-icon-button')[1]; | 229 languagesCollapse.querySelectorAll('paper-icon-button')[1]; |
293 assertTrue(!!languageOptionsDropdownTrigger); | 230 assertTrue(!!languageOptionsDropdownTrigger); |
294 MockInteractions.tap(languageOptionsDropdownTrigger); | 231 MockInteractions.tap(languageOptionsDropdownTrigger); |
295 assertTrue(actionMenu.open); | 232 assertTrue(actionMenu.open); |
296 | 233 |
297 // Toggle the translate option. | 234 // 'sw' supports translate to the target language ('en'). |
298 var translateOption = getMenuItem('offerToTranslateInThisLanguage'); | 235 var translateOption = getMenuItem('offerToTranslateInThisLanguage'); |
299 assertFalse(translateOption.disabled); | 236 assertFalse(translateOption.disabled); |
237 assertTrue(translateOption.checked); | |
238 | |
239 // Toggle the translate option. | |
300 MockInteractions.tap(translateOption); | 240 MockInteractions.tap(translateOption); |
301 | 241 |
302 // Menu should stay open briefly. | 242 // Menu should stay open briefly. |
303 assertTrue(actionMenu.open); | 243 assertTrue(actionMenu.open); |
304 // Guaranteed to run later than the menu close delay. | 244 // Guaranteed to run later than the menu close delay. |
305 setTimeout(function() { | 245 setTimeout(function() { |
306 assertFalse(actionMenu.open); | 246 assertFalse(actionMenu.open); |
247 assertDeepEquals( | |
248 ['en-US', 'sw'], | |
249 languageHelper.prefs.translate_blocked_languages.value); | |
307 done(); | 250 done(); |
308 }, settings.kMenuCloseDelay + 1); | 251 }, settings.kMenuCloseDelay + 1); |
309 }); | 252 }); |
310 | 253 |
311 test('disable translate hides language-specific option', function() { | 254 test('disable translate hides language-specific option', function() { |
312 // Disables translate. | 255 // Disables translate. |
313 languageHelper.setPrefValue('translate.enabled', false); | 256 languageHelper.setPrefValue('translate.enabled', false); |
314 languagesPage.set('languages.translateTarget', 'foo'); | |
315 languagesPage.set('languages.enabled.1.supportsTranslate', true); | |
316 | 257 |
317 // Makes sure language-specific menu exists. | 258 // Open options for 'sw'. |
318 var languageOptionsDropdownTrigger = | 259 var languageOptionsDropdownTrigger = |
319 languagesCollapse.querySelectorAll('paper-icon-button')[1]; | 260 languagesCollapse.querySelectorAll('paper-icon-button')[1]; |
320 assertTrue(!!languageOptionsDropdownTrigger); | 261 assertTrue(!!languageOptionsDropdownTrigger); |
321 MockInteractions.tap(languageOptionsDropdownTrigger); | 262 MockInteractions.tap(languageOptionsDropdownTrigger); |
322 assertTrue(actionMenu.open); | 263 assertTrue(actionMenu.open); |
323 | 264 |
324 // The language-specific translation option should be hidden. | 265 // The language-specific translation option should be hidden. |
325 var translateOption = actionMenu.querySelector('#offerTranslations'); | 266 var translateOption = actionMenu.querySelector('#offerTranslations'); |
326 assertTrue(!!translateOption); | 267 assertTrue(!!translateOption); |
327 assertTrue(translateOption.hidden); | 268 assertTrue(translateOption.hidden); |
328 }); | 269 }); |
329 | 270 |
330 test('remove language', function() { | 271 test('remove language', function() { |
331 var numEnabled = languagesPage.languages.enabled.length; | 272 // Enable a language which we can then disable. |
273 languageHelper.enableLanguage('no'); | |
332 | 274 |
333 // Enabled a language which we can then disable. | 275 // Populate the dom-repeat. |
334 var newLanguage = assert(getAvailableLanguages()[0]); | 276 Polymer.dom.flush(); |
335 languageHelper.enableLanguage(newLanguage.code); | |
336 | 277 |
337 // Wait for the language to be enabled. | 278 // Find the new language item. |
338 return whenNumEnabledLanguagesBecomes(numEnabled + 1).then(function() { | 279 var items = languagesCollapse.querySelectorAll('.list-item'); |
339 // Populate the dom-repeat. | 280 var domRepeat = assert( |
340 Polymer.dom.flush(); | 281 languagesCollapse.querySelector('template[is="dom-repeat"]')); |
282 var item = Array.from(items).find(function(el) { | |
283 return domRepeat.itemForElement(el) && | |
284 domRepeat.itemForElement(el).language.code == 'no'; | |
285 }); | |
341 | 286 |
342 // Find the new language item. | 287 // Open the menu and select Remove. |
343 var items = languagesCollapse.querySelectorAll('.list-item'); | 288 MockInteractions.tap(item.querySelector('paper-icon-button')); |
344 var domRepeat = assert( | |
345 languagesCollapse.querySelector('template[is="dom-repeat"]')); | |
346 var item = Array.from(items).find(function(el) { | |
347 return domRepeat.itemForElement(el) && | |
348 domRepeat.itemForElement(el).language == newLanguage; | |
349 }); | |
350 | 289 |
351 // Open the menu and select Remove. | 290 assertTrue(actionMenu.open); |
352 MockInteractions.tap(item.querySelector('paper-icon-button')); | 291 var removeMenuItem = getMenuItem('removeLanguage'); |
292 assertFalse(removeMenuItem.disabled); | |
293 MockInteractions.tap(removeMenuItem); | |
294 assertFalse(actionMenu.open); | |
353 | 295 |
354 assertTrue(actionMenu.open); | 296 assertEquals( |
355 var removeMenuItem = getMenuItem('removeLanguage'); | 297 initialLanguages, languageHelper.getPref(languagesPref).value); |
356 assertFalse(removeMenuItem.disabled); | |
357 MockInteractions.tap(removeMenuItem); | |
358 assertFalse(actionMenu.open); | |
359 | |
360 // We should go back down to the original number of enabled languages. | |
361 return whenNumEnabledLanguagesBecomes(numEnabled); | |
362 }).then(function() { | |
363 assertFalse(languageHelper.isLanguageEnabled(newLanguage.code)); | |
364 }); | |
365 }); | 298 }); |
366 | 299 |
367 test('move up/down buttons', function() { | 300 test('move up/down buttons', function() { |
368 // Add several languages. | 301 // Add several languages. |
369 var numEnabled = languagesPage.languages.enabled.length; | 302 for (var language of ['en-CA', 'en-US', 'tk', 'no']) |
dpapad
2017/04/25 20:41:17
Technically the guide at https://chromium.googleso
michaelpg
2017/05/04 22:54:19
As discussed in standup, since our tests already u
| |
370 var available = getAvailableLanguages(); | 303 languageHelper.enableLanguage(language); |
371 for (var i = 0; i < 4; i++) | |
372 languageHelper.enableLanguage(assert(available[i]).code); | |
373 | 304 |
374 return whenNumEnabledLanguagesBecomes(numEnabled + 4).then(function() { | 305 Polymer.dom.flush(); |
375 Polymer.dom.flush(); | |
376 | 306 |
377 var menuButtons = | 307 var menuButtons = |
378 languagesCollapse.querySelectorAll( | 308 languagesCollapse.querySelectorAll( |
379 '.list-item paper-icon-button[icon="cr:more-vert"]'); | 309 '.list-item paper-icon-button[icon="cr:more-vert"]'); |
380 | 310 |
381 // First language should not have "Move up" or "Move to top". | 311 // First language should not have "Move up" or "Move to top". |
382 MockInteractions.tap(menuButtons[0]); | 312 MockInteractions.tap(menuButtons[0]); |
383 assertMenuItemButtonsVisible({ | 313 assertMenuItemButtonsVisible({ |
384 moveToTop: false, moveUp: false, moveDown: true, | 314 moveToTop: false, moveUp: false, moveDown: true, |
385 }); | 315 }); |
386 actionMenu.close(); | 316 actionMenu.close(); |
387 | 317 |
388 // Second language should not have "Move up". | 318 // Second language should not have "Move up". |
389 MockInteractions.tap(menuButtons[1]); | 319 MockInteractions.tap(menuButtons[1]); |
390 assertMenuItemButtonsVisible({ | 320 assertMenuItemButtonsVisible({ |
391 moveToTop: true, moveUp: false, moveDown: true, | 321 moveToTop: true, moveUp: false, moveDown: true, |
392 }); | 322 }); |
393 actionMenu.close(); | 323 actionMenu.close(); |
394 | 324 |
395 // Middle languages should have all buttons. | 325 // Middle languages should have all buttons. |
396 MockInteractions.tap(menuButtons[2]); | 326 MockInteractions.tap(menuButtons[2]); |
397 assertMenuItemButtonsVisible({ | 327 assertMenuItemButtonsVisible({ |
398 moveToTop: true, moveUp: true, moveDown: true, | 328 moveToTop: true, moveUp: true, moveDown: true, |
399 }); | 329 }); |
400 actionMenu.close(); | 330 actionMenu.close(); |
401 | 331 |
402 // Last language should not have "Move down". | 332 // Last language should not have "Move down". |
403 MockInteractions.tap(menuButtons[menuButtons.length - 1]); | 333 MockInteractions.tap(menuButtons[menuButtons.length - 1]); |
404 assertMenuItemButtonsVisible({ | 334 assertMenuItemButtonsVisible({ |
405 moveToTop: true, moveUp: true, moveDown: false, | 335 moveToTop: true, moveUp: true, moveDown: false, |
406 }); | |
407 actionMenu.close(); | |
408 }); | 336 }); |
337 actionMenu.close(); | |
409 }); | 338 }); |
410 }); | 339 }); |
411 | 340 |
412 test('manage input methods', function() { | 341 test(TestNames.InputMethods, function() { |
413 var inputMethodsCollapse = languagesPage.$.inputMethodsCollapse; | 342 var inputMethodsCollapse = languagesPage.$.inputMethodsCollapse; |
414 var inputMethodSettingsExist = !!inputMethodsCollapse; | 343 var inputMethodSettingsExist = !!inputMethodsCollapse; |
415 if (cr.isChromeOS) { | 344 if (cr.isChromeOS) { |
416 assertTrue(inputMethodSettingsExist); | 345 assertTrue(inputMethodSettingsExist); |
417 var manageInputMethodsButton = | 346 var manageInputMethodsButton = |
418 inputMethodsCollapse.querySelector('#manageInputMethods'); | 347 inputMethodsCollapse.querySelector('#manageInputMethods'); |
419 MockInteractions.tap(manageInputMethodsButton); | 348 MockInteractions.tap(manageInputMethodsButton); |
420 assertTrue(!!languagesPage.$$('settings-manage-input-methods-page')); | 349 assertTrue(!!languagesPage.$$('settings-manage-input-methods-page')); |
421 } else { | 350 } else { |
422 assertFalse(inputMethodSettingsExist); | 351 assertFalse(inputMethodSettingsExist); |
423 } | 352 } |
424 }); | 353 }); |
425 | 354 |
426 test('spellcheck', function() { | 355 test(TestNames.Spellcheck, function() { |
427 var spellCheckCollapse = languagesPage.$.spellCheckCollapse; | 356 var spellCheckCollapse = languagesPage.$.spellCheckCollapse; |
428 var spellCheckSettingsExist = !!spellCheckCollapse; | 357 var spellCheckSettingsExist = !!spellCheckCollapse; |
429 if (cr.isMac) { | 358 if (cr.isMac) { |
430 assertFalse(spellCheckSettingsExist); | 359 assertFalse(spellCheckSettingsExist); |
431 } else { | 360 } else { |
432 assertTrue(spellCheckSettingsExist); | 361 assertTrue(spellCheckSettingsExist); |
433 | 362 |
434 // Ensure no language has spell check enabled. | 363 // The row button should have a secondary row specifying which language |
435 for (var i = 0; i < languagesPage.languages.enabled.length; i++) { | 364 // spell check is enabled for. |
436 languagesPage.set( | 365 var triggerRow = languagesPage.$.spellCheckSubpageTrigger; |
437 'languages.enabled.' + i + '.spellCheckEnabled', false); | |
438 } | |
439 | 366 |
440 // The row button should have the extra row only if some language has | 367 // en-US starts with spellcheck enabled, so the secondary row is |
441 // spell check enabled. | 368 // populated. |
442 var triggerRow = languagesPage.$.spellCheckSubpageTrigger; | 369 assertTrue(triggerRow.classList.contains('two-line')); |
370 assertLT( | |
371 0, triggerRow.querySelector('.secondary').textContent.length); | |
372 | |
373 MockInteractions.tap(triggerRow); | |
374 Polymer.dom.flush(); | |
375 | |
376 // Disable spellcheck for en-US. | |
377 var spellcheckLanguageToggle = | |
378 spellCheckCollapse.querySelector('paper-toggle-button[checked]'); | |
379 assertTrue(!!spellcheckLanguageToggle); | |
380 MockInteractions.tap(spellcheckLanguageToggle); | |
381 assertFalse(spellcheckLanguageToggle.checked); | |
382 assertEquals( | |
383 0, | |
384 languageHelper.prefs.spellcheck.dictionaries.value.length); | |
385 | |
386 // Now the secondary row is empty, so it shouldn't be shown. | |
443 assertFalse(triggerRow.classList.contains('two-line')); | 387 assertFalse(triggerRow.classList.contains('two-line')); |
444 assertEquals( | 388 assertEquals( |
445 0, triggerRow.querySelector('.secondary').textContent.length); | 389 0, triggerRow.querySelector('.secondary').textContent.length); |
446 | |
447 languagesPage.set( | |
448 'languages.enabled.0.language.supportsSpellcheck', true); | |
449 languagesPage.set('languages.enabled.0.spellCheckEnabled', true); | |
450 assertTrue(triggerRow.classList.contains('two-line')); | |
451 assertLT( | |
452 0, triggerRow.querySelector('.secondary').textContent.length); | |
453 } | 390 } |
454 }); | 391 }); |
455 }.bind(this)); | 392 }); |
456 | 393 |
457 // TODO(michaelpg): Test more aspects of the languages UI. | 394 return {TestNames: TestNames}; |
458 | |
459 // Run all registered tests. | |
460 mocha.run(); | |
461 }); | 395 }); |
OLD | NEW |