OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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-dropdown-menu. */ | 5 /** @fileoverview Suite of tests for settings-dropdown-menu. */ |
6 cr.define('settings_dropdown_menu', function() { | 6 cr.define('settings_dropdown_menu', function() { |
7 function registerTests() { | 7 function registerTests() { |
8 suite('SettingsDropdownMenu', function() { | 8 suite('SettingsDropdownMenu', function() { |
9 /** @type {SettingsDropdownMenu} */ | 9 /** @type {SettingsDropdownMenu} */ |
10 var dropdown; | 10 var dropdown; |
11 | 11 |
12 /** | 12 /** |
13 * The IronSelectable (paper-listbox) used internally by the dropdown | 13 * The <select> used internally by the dropdown menu. |
14 * menu. | 14 * @type {HTMLSelectElement} |
15 * @type {Polymer.IronSelectableBehavior} | |
16 */ | 15 */ |
17 var selectable; | 16 var selectElement; |
| 17 |
| 18 function waitUntilDropdownUpdated() { |
| 19 return new Promise(function(resolve) { dropdown.async(resolve); }); |
| 20 } |
| 21 |
| 22 function simulateChangeEvent(value) { |
| 23 selectElement.value = value; |
| 24 selectElement.dispatchEvent(new CustomEvent('change')); |
| 25 return waitUntilDropdownUpdated(); |
| 26 } |
18 | 27 |
19 setup(function() { | 28 setup(function() { |
20 PolymerTest.clearBody(); | 29 PolymerTest.clearBody(); |
21 dropdown = document.createElement('settings-dropdown-menu'); | 30 dropdown = document.createElement('settings-dropdown-menu'); |
22 selectable = dropdown.$$('paper-listbox'); | 31 selectElement = dropdown.$$('select'); |
23 document.body.appendChild(dropdown); | 32 document.body.appendChild(dropdown); |
24 }); | 33 }); |
25 | 34 |
26 test('with number options', function testNumberOptions() { | 35 test('with number options', function testNumberOptions() { |
27 dropdown.pref = { | 36 dropdown.pref = { |
28 key: 'test.number', | 37 key: 'test.number', |
29 type: chrome.settingsPrivate.PrefType.NUMBER, | 38 type: chrome.settingsPrivate.PrefType.NUMBER, |
30 value: 100, | 39 value: 100, |
31 }; | 40 }; |
32 dropdown.menuOptions = [{value: 100, name: 'Option 100'}, | 41 dropdown.menuOptions = [{value: 100, name: 'Option 100'}, |
33 {value: 200, name: 'Option 200'}, | 42 {value: 200, name: 'Option 200'}, |
34 {value: 300, name: 'Option 300'}, | 43 {value: 300, name: 'Option 300'}, |
35 {value: 400, name: 'Option 400'}]; | 44 {value: 400, name: 'Option 400'}]; |
36 | 45 |
37 // IronSelectable uses a DOM observer, which uses a debouncer. | 46 return waitUntilDropdownUpdated().then(function() { |
38 Polymer.dom.flush(); | 47 // Initially selected item. |
| 48 assertEquals( |
| 49 'Option 100', |
| 50 selectElement.selectedOptions[0].textContent.trim()); |
39 | 51 |
40 // Initially selected item. | 52 // Selecting an item updates the pref. |
41 assertEquals('Option 100', selectable.selectedItem.textContent.trim()); | 53 return simulateChangeEvent('200'); |
| 54 }).then(function() { |
| 55 assertEquals(200, dropdown.pref.value); |
42 | 56 |
43 // Selecting an item updates the pref. | 57 // Updating the pref selects an item. |
44 selectable.selected = '200'; | 58 dropdown.set('pref.value', 400); |
45 assertEquals(200, dropdown.pref.value); | 59 return waitUntilDropdownUpdated(); |
46 | 60 }).then(function() { |
47 // Updating the pref selects an item. | 61 assertEquals('400', selectElement.value); |
48 dropdown.set('pref.value', 400); | 62 }); |
49 assertEquals('400', selectable.selected); | |
50 }); | 63 }); |
51 | 64 |
52 test('with string options', function testStringOptions() { | 65 test('with string options', function testStringOptions() { |
53 dropdown.pref = { | 66 dropdown.pref = { |
54 key: 'test.string', | 67 key: 'test.string', |
55 type: chrome.settingsPrivate.PrefType.STRING, | 68 type: chrome.settingsPrivate.PrefType.STRING, |
56 value: 'c', | 69 value: 'c', |
57 }; | 70 }; |
58 dropdown.menuOptions = | 71 dropdown.menuOptions = |
59 [{value: 'a', name: 'AAA'}, | 72 [{value: 'a', name: 'AAA'}, |
60 {value: 'b', name: 'BBB'}, | 73 {value: 'b', name: 'BBB'}, |
61 {value: 'c', name: 'CCC'}, | 74 {value: 'c', name: 'CCC'}, |
62 {value: 'd', name: 'DDD'}]; | 75 {value: 'd', name: 'DDD'}]; |
63 Polymer.dom.flush(); | |
64 | 76 |
65 // Initially selected item. | 77 return waitUntilDropdownUpdated().then(function() { |
66 assertEquals('CCC', selectable.selectedItem.textContent.trim()); | 78 // Initially selected item. |
| 79 assertEquals( |
| 80 'CCC', selectElement.selectedOptions[0].textContent.trim()); |
67 | 81 |
68 // Selecting an item updates the pref. | 82 // Selecting an item updates the pref. |
69 selectable.selected = 'a'; | 83 return simulateChangeEvent('a'); |
70 assertEquals('a', dropdown.pref.value); | 84 }).then(function() { |
| 85 assertEquals('a', dropdown.pref.value); |
71 | 86 |
72 // Updating the pref selects an item. | 87 // Updating the pref selects an item. |
73 dropdown.set('pref.value', 'b'); | 88 dropdown.set('pref.value', 'b'); |
74 assertEquals('b', selectable.selected); | 89 return waitUntilDropdownUpdated(); |
| 90 }).then(function() { |
| 91 assertEquals('b', selectElement.value); |
| 92 }); |
75 }); | 93 }); |
76 | 94 |
77 test('with custom value', function testCustomValue() { | 95 test('with custom value', function testCustomValue() { |
78 dropdown.pref = { | 96 dropdown.pref = { |
79 key: 'test.string', | 97 key: 'test.string', |
80 type: chrome.settingsPrivate.PrefType.STRING, | 98 type: chrome.settingsPrivate.PrefType.STRING, |
81 value: 'f', | 99 value: 'f', |
82 }; | 100 }; |
83 dropdown.menuOptions = | 101 dropdown.menuOptions = |
84 [{value: 'a', name: 'AAA'}, | 102 [{value: 'a', name: 'AAA'}, |
85 {value: 'b', name: 'BBB'}, | 103 {value: 'b', name: 'BBB'}, |
86 {value: 'c', name: 'CCC'}, | 104 {value: 'c', name: 'CCC'}, |
87 {value: 'd', name: 'DDD'}]; | 105 {value: 'd', name: 'DDD'}]; |
88 Polymer.dom.flush(); | |
89 | 106 |
90 // "Custom" initially selected. | 107 return waitUntilDropdownUpdated().then(function() { |
91 assertEquals(dropdown.notFoundValue_, selectable.selected); | 108 // "Custom" initially selected. |
92 // Pref should not have changed. | 109 assertEquals(dropdown.notFoundValue_, selectElement.value); |
93 assertEquals('f', dropdown.pref.value); | 110 // Pref should not have changed. |
| 111 assertEquals('f', dropdown.pref.value); |
| 112 }); |
94 }); | 113 }); |
95 | 114 |
96 test('delay setting options', function testDelayedOptions(done) { | 115 function waitForTimeout(timeMs) { |
| 116 return new Promise(function(resolve) { setTimeout(resolve, timeMs); }); |
| 117 } |
| 118 |
| 119 test('delay setting options', function testDelayedOptions() { |
97 dropdown.pref = { | 120 dropdown.pref = { |
98 key: 'test.number2', | 121 key: 'test.number2', |
99 type: chrome.settingsPrivate.PrefType.NUMBER, | 122 type: chrome.settingsPrivate.PrefType.NUMBER, |
100 value: 200, | 123 value: 200, |
101 }; | 124 }; |
102 | 125 |
103 setTimeout(function() { | 126 console.log('running test'); |
104 assertEquals( | 127 return waitForTimeout(100).then(function() { |
105 loadTimeData.getValue('loading'), dropdown.$.dropdownMenu.label); | 128 return waitUntilDropdownUpdated(); |
| 129 }).then(function() { |
106 assertTrue(dropdown.$.dropdownMenu.disabled); | 130 assertTrue(dropdown.$.dropdownMenu.disabled); |
107 assertEquals(undefined, selectable.selected); | 131 assertEquals('SETTINGS_DROPDOWN_NOT_FOUND_ITEM', selectElement.value); |
108 | 132 |
109 dropdown.menuOptions = [{value: 100, name: 'Option 100'}, | 133 dropdown.menuOptions = [{value: 100, name: 'Option 100'}, |
110 {value: 200, name: 'Option 200'}, | 134 {value: 200, name: 'Option 200'}, |
111 {value: 300, name: 'Option 300'}, | 135 {value: 300, name: 'Option 300'}, |
112 {value: 400, name: 'Option 400'}]; | 136 {value: 400, name: 'Option 400'}]; |
113 Polymer.dom.flush(); | 137 return waitUntilDropdownUpdated(); |
114 | 138 }).then(function() { |
115 // Dropdown menu enables itself and selects the new menu option | 139 // Dropdown menu enables itself and selects the new menu option |
116 // correpsonding to the pref value. | 140 // correpsonding to the pref value. |
117 assertFalse(dropdown.$.dropdownMenu.disabled); | 141 assertFalse(dropdown.$.dropdownMenu.disabled); |
118 assertEquals('200', selectable.selected); | 142 assertEquals('200', selectElement.value); |
119 done(); | 143 }); |
120 }, 100); | |
121 }); | 144 }); |
122 }); | 145 }); |
123 } | 146 } |
124 | 147 |
125 return { | 148 return { |
126 registerTests: registerTests, | 149 registerTests: registerTests, |
127 }; | 150 }; |
128 }); | 151 }); |
OLD | NEW |