OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 suite('<bookmarks-store>', function() { | 5 suite('<bookmarks-store>', function() { |
6 var store; | 6 var store; |
7 var TEST_TREE; | 7 var TEST_TREE; |
8 | 8 |
9 function replaceStore() { | 9 function replaceStore() { |
10 store = document.createElement('bookmarks-store'); | 10 store = document.createElement('bookmarks-store'); |
11 replaceBody(store); | 11 replaceBody(store); |
12 store.setupStore_(TEST_TREE); | 12 store.setupStore_(TEST_TREE); |
13 } | 13 } |
14 | 14 |
15 function navigateTo(route) { | 15 function navigateTo(route) { |
16 window.history.replaceState({}, '', route); | 16 window.history.replaceState({}, '', route); |
17 window.dispatchEvent(new CustomEvent('location-changed')); | 17 window.dispatchEvent(new CustomEvent('location-changed')); |
18 } | 18 } |
19 | 19 |
20 function removeChild(tree, index) { | |
tsergeant
2017/02/02 04:35:21
I think this should go in test_util.js with the re
jiaxi
2017/02/02 05:28:36
Done.
| |
21 tree.children.splice(index, 1); | |
22 for (var i = index; i < tree.children.length; i++) { | |
23 tree.children[i].index = i; | |
24 } | |
25 } | |
26 | |
20 /** | 27 /** |
21 * Overrides the chrome.bookmarks.search to pass results into the callback. | 28 * Overrides the chrome.bookmarks.search to pass results into the callback. |
22 * @param {Array} results | 29 * @param {Array} results |
23 */ | 30 */ |
24 function overrideBookmarksSearch(results) { | 31 function overrideBookmarksSearch(results) { |
25 chrome.bookmarks.search = function(searchTerm, callback) { | 32 chrome.bookmarks.search = function(searchTerm, callback) { |
26 callback(results); | 33 callback(results); |
27 }; | 34 }; |
28 } | 35 } |
29 | 36 |
37 /** | |
38 * Overrides the chrome.bookmarks.getSubTree to pass results into the | |
39 * callback. | |
40 * @param {Array} results | |
41 */ | |
42 function overrideBookmarksGetSubTree(results) { | |
43 chrome.bookmarks.getSubTree = function(parentId, callback) { | |
44 callback(results); | |
45 }; | |
46 } | |
47 | |
30 setup(function() { | 48 setup(function() { |
31 TEST_TREE = createFolder('0', [ | 49 TEST_TREE = createFolder('0', [ |
32 createFolder( | 50 createFolder( |
33 '1', | 51 '1', |
34 [ | 52 [ |
35 createItem('2', {url: 'link2'}), | 53 createItem('2', {url: 'link2'}), |
36 createFolder('3', []), | 54 createFolder('3', []), |
55 createItem('6', {url: 'link4'}), | |
56 createItem('7', {url: 'link5'}), | |
37 ]), | 57 ]), |
38 createItem('4', {url: 'link4'}), | 58 createItem('4', {url: 'link4'}), |
39 createItem('5', {url: 'link5'}), | 59 createItem('5', {url: 'link5'}), |
40 createFolder('6', []), | 60 createFolder('8', []), |
41 ]); | 61 ]); |
42 | 62 |
43 replaceStore(); | 63 replaceStore(); |
44 }); | 64 }); |
45 | 65 |
46 teardown(function() { | 66 teardown(function() { |
47 // Clean up anything left in URL. | 67 // Clean up anything left in URL. |
48 navigateTo('/'); | 68 navigateTo('/'); |
49 }); | 69 }); |
50 | 70 |
(...skipping 10 matching lines...) Expand all Loading... | |
61 }); | 81 }); |
62 | 82 |
63 test('correct paths generated for nodes', function() { | 83 test('correct paths generated for nodes', function() { |
64 var TEST_PATHS = { | 84 var TEST_PATHS = { |
65 '0': 'rootNode', | 85 '0': 'rootNode', |
66 '1': 'rootNode.children.#0', | 86 '1': 'rootNode.children.#0', |
67 '2': 'rootNode.children.#0.children.#0', | 87 '2': 'rootNode.children.#0.children.#0', |
68 '3': 'rootNode.children.#0.children.#1', | 88 '3': 'rootNode.children.#0.children.#1', |
69 '4': 'rootNode.children.#1', | 89 '4': 'rootNode.children.#1', |
70 '5': 'rootNode.children.#2', | 90 '5': 'rootNode.children.#2', |
71 '6': 'rootNode.children.#3', | 91 '6': 'rootNode.children.#0.children.#2', |
92 '7': 'rootNode.children.#0.children.#3', | |
93 '8': 'rootNode.children.#3', | |
72 }; | 94 }; |
73 | 95 |
74 for (var id in store.idToNodeMap_) | 96 for (var id in store.idToNodeMap_) |
75 assertEquals(TEST_PATHS[id], store.idToNodeMap_[id].path); | 97 assertEquals(TEST_PATHS[id], store.idToNodeMap_[id].path); |
76 }); | 98 }); |
77 | 99 |
78 ////////////////////////////////////////////////////////////////////////////// | 100 ////////////////////////////////////////////////////////////////////////////// |
79 // editing bookmarks tree tests: | 101 // editing bookmarks tree tests: |
80 | 102 |
81 test('changing selectedId changes the displayedList', function() { | 103 test('changing selectedId changes the displayedList', function() { |
82 store.selectedId = '0'; | 104 store.selectedId = '0'; |
83 assertEquals(TEST_TREE.children, store.displayedList); | 105 assertEquals(TEST_TREE.children, store.displayedList); |
84 store.selectedId = '1'; | 106 store.selectedId = '1'; |
85 assertEquals(TEST_TREE.children[0].children, store.displayedList); | 107 assertEquals(TEST_TREE.children[0].children, store.displayedList); |
86 store.selectedId = '3'; | 108 store.selectedId = '3'; |
87 assertEquals( | 109 assertEquals( |
88 TEST_TREE.children[0].children[1].children, store.displayedList); | 110 TEST_TREE.children[0].children[1].children, store.displayedList); |
89 | 111 |
90 // Selecting an item selects the default folder. | 112 // Selecting an item selects the default folder. |
91 store.selectedId = '5'; | 113 store.selectedId = '5'; |
92 assertEquals(TEST_TREE.children[0].children, store.displayedList); | 114 assertEquals(TEST_TREE.children[0].children, store.displayedList); |
93 }); | 115 }); |
94 | 116 |
95 test('store updates on selected event', function() { | 117 test('store updates on selected event', function() { |
96 // First child of root is selected by default. | 118 // First child of root is selected by default. |
97 assertEquals('1', store.selectedId); | 119 assertEquals('1', store.selectedId); |
98 assertTrue(store.idToNodeMap_['1'].isSelected); | 120 assertTrue(store.idToNodeMap_['1'].isSelectedFolder); |
99 | 121 |
100 // Selecting a selected folder doesn't deselect it. | 122 // Selecting a selected folder doesn't deselect it. |
101 store.fire('selected-folder-changed', '1'); | 123 store.fire('selected-folder-changed', '1'); |
102 assertEquals('1', store.selectedId); | 124 assertEquals('1', store.selectedId); |
103 assertTrue(store.idToNodeMap_['1'].isSelected); | 125 assertTrue(store.idToNodeMap_['1'].isSelectedFolder); |
104 | 126 |
105 // Select a deeply nested descendant. | 127 // Select a deeply nested descendant. |
106 store.fire('selected-folder-changed', '3'); | 128 store.fire('selected-folder-changed', '3'); |
107 assertEquals('3', store.selectedId); | 129 assertEquals('3', store.selectedId); |
108 assertTrue(store.idToNodeMap_['3'].isSelected); | 130 assertTrue(store.idToNodeMap_['3'].isSelectedFolder); |
109 assertFalse(store.idToNodeMap_['1'].isSelected); | 131 assertFalse(store.idToNodeMap_['1'].isSelectedFolder); |
110 | 132 |
111 // Select a folder in separate subtree. | 133 // Select a folder in separate subtree. |
112 store.fire('selected-folder-changed', '6'); | 134 store.fire('selected-folder-changed', '8'); |
113 assertEquals('6', store.selectedId); | 135 assertEquals('8', store.selectedId); |
114 assertTrue(store.idToNodeMap_['6'].isSelected); | 136 assertTrue(store.idToNodeMap_['8'].isSelectedFolder); |
115 assertFalse(store.idToNodeMap_['3'].isSelected); | 137 assertFalse(store.idToNodeMap_['3'].isSelectedFolder); |
116 }); | 138 }); |
117 | 139 |
118 test('store updates on open and close', function() { | 140 test('store updates on open and close', function() { |
119 // All folders are open by default. | 141 // All folders are open by default. |
120 for (var id in store.idToNodeMap_) { | 142 for (var id in store.idToNodeMap_) { |
121 if (store.idToNodeMap_[id].url) | 143 if (store.idToNodeMap_[id].url) |
122 continue; | 144 continue; |
123 | 145 |
124 assertTrue(store.idToNodeMap_[id].isOpen); | 146 assertTrue(store.idToNodeMap_[id].isOpen); |
125 } | 147 } |
126 | 148 |
127 // Closing a folder doesn't close any descendants. | 149 // Closing a folder doesn't close any descendants. |
128 store.fire('folder-open-changed', {id: '1', open: false}); | 150 store.fire('folder-open-changed', {id: '1', open: false}); |
129 assertFalse(store.idToNodeMap_['1'].isOpen); | 151 assertFalse(store.idToNodeMap_['1'].isOpen); |
130 assertTrue(store.idToNodeMap_['3'].isOpen); | 152 assertTrue(store.idToNodeMap_['3'].isOpen); |
131 store.fire('folder-open-changed', {id: '1', open: true}); | 153 store.fire('folder-open-changed', {id: '1', open: true}); |
132 | 154 |
133 // Closing an ancestor folder of a selected folder selects the ancestor. | 155 // Closing an ancestor folder of a selected folder selects the ancestor. |
134 store.fire('selected-folder-changed', '3'); | 156 store.fire('selected-folder-changed', '3'); |
135 store.fire('folder-open-changed', {id: '1', open: false}); | 157 store.fire('folder-open-changed', {id: '1', open: false}); |
136 assertFalse(store.idToNodeMap_['1'].isOpen); | 158 assertFalse(store.idToNodeMap_['1'].isOpen); |
137 assertEquals('1', store.selectedId); | 159 assertEquals('1', store.selectedId); |
138 assertTrue(store.idToNodeMap_['1'].isSelected); | 160 assertTrue(store.idToNodeMap_['1'].isSelectedFolder); |
139 assertFalse(store.idToNodeMap_['3'].isSelected); | 161 assertFalse(store.idToNodeMap_['3'].isSelectedFolder); |
140 }); | 162 }); |
141 | 163 |
142 test('deleting a node updates the tree', function() { | 164 test('deleting a node updates the tree', function() { |
165 removeChild(TEST_TREE, 1); | |
166 overrideBookmarksGetSubTree([TEST_TREE]); | |
143 // Remove an empty folder/bookmark. | 167 // Remove an empty folder/bookmark. |
144 store.onBookmarkRemoved_('4', {parentId: '0', index: '1'}); | 168 store.onBookmarkRemoved_('4', {parentId: '0', index: 1}); |
145 | 169 |
146 // Check the tree is correct. | 170 // Check the tree is correct. |
147 assertEquals('5', store.rootNode.children[1].id); | 171 assertEquals('5', store.rootNode.children[1].id); |
148 | 172 |
149 // idToNodeMap_ has been updated. | 173 // idToNodeMap_ has been updated. |
150 assertEquals(undefined, store.idToNodeMap_['4']); | 174 assertEquals(undefined, store.idToNodeMap_['4']); |
151 assertEquals(store.rootNode.children[1], store.idToNodeMap_['5']); | 175 assertEquals(store.rootNode.children[1], store.idToNodeMap_['5']); |
152 | 176 |
153 // Paths have been updated. | 177 // Paths have been updated. |
154 var TEST_PATHS = { | 178 var TEST_PATHS = { |
155 '0': 'rootNode', | 179 '0': 'rootNode', |
156 '1': 'rootNode.children.#0', | 180 '1': 'rootNode.children.#0', |
157 '2': 'rootNode.children.#0.children.#0', | 181 '2': 'rootNode.children.#0.children.#0', |
158 '3': 'rootNode.children.#0.children.#1', | 182 '3': 'rootNode.children.#0.children.#1', |
159 '5': 'rootNode.children.#1', | 183 '5': 'rootNode.children.#1', |
160 '6': 'rootNode.children.#2', | 184 '6': 'rootNode.children.#0.children.#2', |
185 '7': 'rootNode.children.#0.children.#3', | |
186 '8': 'rootNode.children.#2', | |
161 }; | 187 }; |
162 | 188 |
163 for (var id in store.idToNodeMap_) | 189 for (var id in store.idToNodeMap_) |
164 assertEquals(TEST_PATHS[id], store.idToNodeMap_[id].path); | 190 assertEquals(TEST_PATHS[id], store.idToNodeMap_[id].path); |
165 | 191 |
166 // Remove a folder with children. | 192 // Remove a folder with children. |
193 removeChild(TEST_TREE, 0); | |
194 overrideBookmarksGetSubTree([TEST_TREE]); | |
195 | |
167 store.onBookmarkRemoved_('1', {parentId: '0', index: '0'}); | 196 store.onBookmarkRemoved_('1', {parentId: '0', index: '0'}); |
168 | 197 |
169 // Check the tree is correct. | 198 // Check the tree is correct. |
170 assertEquals('5', store.rootNode.children[0].id); | 199 assertEquals('5', store.rootNode.children[0].id); |
171 assertEquals('6', store.rootNode.children[1].id); | 200 assertEquals('8', store.rootNode.children[1].id); |
172 | 201 |
173 // idToNodeMap_ has been updated. | 202 // idToNodeMap_ has been updated. |
174 assertEquals(undefined, store.idToNodeMap_['1']); | 203 assertEquals(undefined, store.idToNodeMap_['1']); |
175 assertEquals(undefined, store.idToNodeMap_['2']); | 204 assertEquals(undefined, store.idToNodeMap_['2']); |
176 assertEquals(undefined, store.idToNodeMap_['3']); | 205 assertEquals(undefined, store.idToNodeMap_['3']); |
177 assertEquals(undefined, store.idToNodeMap_['4']); | 206 assertEquals(undefined, store.idToNodeMap_['4']); |
178 assertEquals(store.rootNode.children[0], store.idToNodeMap_['5']); | 207 assertEquals(store.rootNode.children[0], store.idToNodeMap_['5']); |
179 assertEquals(store.rootNode.children[1], store.idToNodeMap_['6']); | 208 assertEquals(store.rootNode.children[1], store.idToNodeMap_['8']); |
180 | 209 |
181 // Paths have been updated. | 210 // Paths have been updated. |
182 TEST_PATHS = { | 211 TEST_PATHS = { |
183 '0': 'rootNode', | 212 '0': 'rootNode', |
184 '5': 'rootNode.children.#0', | 213 '5': 'rootNode.children.#0', |
185 '6': 'rootNode.children.#1' | 214 '8': 'rootNode.children.#1' |
186 }; | 215 }; |
187 | 216 |
188 for (var id in store.idToNodeMap_) | 217 for (var id in store.idToNodeMap_) |
189 assertEquals(TEST_PATHS[id], store.idToNodeMap_[id].path); | 218 assertEquals(TEST_PATHS[id], store.idToNodeMap_[id].path); |
190 }); | 219 }); |
191 | 220 |
192 test('selectedId updates after removing a selected folder', function() { | 221 test('selectedId updates after removing a selected folder', function() { |
193 // Selected folder gets removed. | 222 // Selected folder gets removed. |
194 store.selectedId = '2'; | 223 store.selectedId = '8'; |
195 store.onBookmarkRemoved_('2', {parentId: '1', index: '0'}); | 224 removeChild(TEST_TREE, 3); |
196 assertTrue(store.idToNodeMap_['1'].isSelected); | 225 overrideBookmarksGetSubTree([TEST_TREE]); |
197 assertEquals('1', store.selectedId); | 226 |
227 store.onBookmarkRemoved_('8', {parentId:'0', index:'3'}); | |
228 assertTrue(store.idToNodeMap_['0'].isSelectedFolder); | |
229 assertEquals('0', store.selectedId); | |
198 | 230 |
199 // A folder with selected folder in it gets removed. | 231 // A folder with selected folder in it gets removed. |
232 removeChild(TEST_TREE, 0); | |
233 overrideBookmarksGetSubTree([TEST_TREE]); | |
234 | |
200 store.selectedId = '3'; | 235 store.selectedId = '3'; |
201 store.onBookmarkRemoved_('1', {parentId: '0', index: '0'}); | 236 store.onBookmarkRemoved_('1', {parentId:'0', index:'0'}); |
202 assertTrue(store.idToNodeMap_['0'].isSelected); | 237 assertTrue(store.idToNodeMap_['0'].isSelectedFolder); |
203 assertEquals('0', store.selectedId); | 238 assertEquals('0', store.selectedId); |
204 }); | 239 }); |
205 | 240 |
206 test('bookmark gets updated after editing', function() { | 241 test('bookmark gets updated after editing', function() { |
207 // Edit title updates idToNodeMap_ properly. | 242 // Edit title updates idToNodeMap_ properly. |
208 store.onBookmarkChanged_('4', {'title': 'test'}); | 243 store.onBookmarkChanged_('4', {'title': 'test'}); |
209 assertEquals('test', store.idToNodeMap_['4'].title); | 244 assertEquals('test', store.idToNodeMap_['4'].title); |
210 assertEquals('link4', store.idToNodeMap_['4'].url); | 245 assertEquals('link4', store.idToNodeMap_['4'].url); |
211 | 246 |
212 // Edit url updates idToNodeMap_ properly. | 247 // Edit url updates idToNodeMap_ properly. |
213 store.onBookmarkChanged_('5', {'url': 'http://www.google.com'}); | 248 store.onBookmarkChanged_('5', {'url': 'http://www.google.com'}); |
214 assertEquals('', store.idToNodeMap_['5'].title); | 249 assertEquals('', store.idToNodeMap_['5'].title); |
215 assertEquals('http://www.google.com', store.idToNodeMap_['5'].url); | 250 assertEquals('http://www.google.com', store.idToNodeMap_['5'].url); |
216 | 251 |
217 // Edit url and title updates idToNodeMap_ properly. | 252 // Edit url and title updates idToNodeMap_ properly. |
218 store.onBookmarkChanged_('2', { | 253 store.onBookmarkChanged_('2', { |
219 'title': 'test', | 254 'title': 'test', |
220 'url': 'http://www.google.com', | 255 'url': 'http://www.google.com', |
221 }); | 256 }); |
222 assertEquals('test', store.idToNodeMap_['2'].title); | 257 assertEquals('test', store.idToNodeMap_['2'].title); |
223 assertEquals('http://www.google.com', store.idToNodeMap_['2'].url); | 258 assertEquals('http://www.google.com', store.idToNodeMap_['2'].url); |
224 }); | 259 }); |
225 | 260 |
226 ////////////////////////////////////////////////////////////////////////////// | 261 ////////////////////////////////////////////////////////////////////////////// |
227 // search tests: | 262 // search tests: |
228 | 263 |
229 test('displayedList updates after searchTerm changes', function() { | 264 test('displayedList updates after searchTerm changes', function() { |
230 var SEARCH_RESULTS = [ | 265 var SEARCH_RESULTS = [ |
231 'cat', | 266 createItem('1', {title: 'cat'}), |
232 'apple', | 267 createItem('2', {title: 'apple'}), |
233 'Paris', | 268 createItem('3', {title: 'paris'}), |
234 ]; | 269 ]; |
235 overrideBookmarksSearch(SEARCH_RESULTS); | 270 overrideBookmarksSearch(SEARCH_RESULTS); |
236 | 271 |
237 // Search for a non-empty string. | 272 // Search for a non-empty string. |
238 store.searchTerm = 'a'; | 273 store.searchTerm = 'a'; |
239 assertFalse(store.rootNode.children[0].isSelected); | 274 assertFalse(store.rootNode.children[0].isSelectedFolder); |
240 assertEquals(null, store.selectedId); | 275 assertEquals(null, store.selectedId); |
241 assertEquals(SEARCH_RESULTS, store.displayedList); | 276 assertEquals(SEARCH_RESULTS, store.displayedList); |
242 | 277 |
243 // Clear the searchTerm. | 278 // Clear the searchTerm. |
244 store.searchTerm = ''; | 279 store.searchTerm = ''; |
245 var defaultFolder = store.rootNode.children[0]; | 280 var defaultFolder = store.rootNode.children[0]; |
246 assertTrue(defaultFolder.isSelected); | 281 assertTrue(defaultFolder.isSelectedFolder); |
247 assertEquals(defaultFolder.id, store.selectedId); | 282 assertEquals(defaultFolder.id, store.selectedId); |
248 assertEquals(defaultFolder.children, store.displayedList); | 283 assertEquals(defaultFolder.children, store.displayedList); |
249 | 284 |
250 // Search with no bookmarks returned. | 285 // Search with no bookmarks returned. |
251 var EMPTY_RESULT = []; | 286 overrideBookmarksSearch([]); |
252 overrideBookmarksSearch(EMPTY_RESULT); | |
253 store.searchTerm = 'asdf'; | 287 store.searchTerm = 'asdf'; |
254 assertEquals(EMPTY_RESULT, store.displayedList); | 288 assertEquals(0, store.displayedList.length); |
255 }); | 289 }); |
256 | 290 |
257 ////////////////////////////////////////////////////////////////////////////// | 291 ////////////////////////////////////////////////////////////////////////////// |
258 // router tests: | 292 // router tests: |
259 | 293 |
260 test('search updates from route', function() { | 294 test('search updates from route', function() { |
261 overrideBookmarksSearch([]); | 295 overrideBookmarksSearch([]); |
262 searchTerm = 'Pond'; | 296 searchTerm = 'Pond'; |
263 navigateTo('/?q=' + searchTerm); | 297 navigateTo('/?q=' + searchTerm); |
264 assertEquals(searchTerm, store.searchTerm); | 298 assertEquals(searchTerm, store.searchTerm); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
301 navigateTo('/?id=' + selectedId); | 335 navigateTo('/?id=' + selectedId); |
302 replaceStore(); | 336 replaceStore(); |
303 assertEquals(selectedId, store.selectedId); | 337 assertEquals(selectedId, store.selectedId); |
304 }); | 338 }); |
305 | 339 |
306 test('route updates from selectedId', function() { | 340 test('route updates from selectedId', function() { |
307 var selectedId = '2'; | 341 var selectedId = '2'; |
308 store.selectedId = selectedId; | 342 store.selectedId = selectedId; |
309 assertEquals('chrome://bookmarks/?id=' + selectedId, window.location.href); | 343 assertEquals('chrome://bookmarks/?id=' + selectedId, window.location.href); |
310 }); | 344 }); |
345 | |
346 ////////////////////////////////////////////////////////////////////////////// | |
347 // selection tests: | |
348 | |
349 test('single select selects the correct bookmark', function() { | |
350 for (var id in store.idToNodeMap_) | |
351 assertFalse(store.idToNodeMap_[id].isSelectedItem); | |
352 | |
353 store.fire('select-item', {item: store.idToNodeMap_['2']}); | |
354 assertDeepEquals( | |
355 [true, false, false, false], | |
356 store.displayedList.map(i => i.isSelectedItem)); | |
357 assertEquals(0, store.anchorIndex_); | |
358 | |
359 // Select other item will remove the previous selection. | |
360 store.fire('select-item', {item: store.idToNodeMap_['3']}); | |
361 assertDeepEquals( | |
362 [false, true, false, false], | |
363 store.displayedList.map(i => i.isSelectedItem)); | |
364 assertEquals(1, store.anchorIndex_); | |
365 | |
366 // Delete the selected item will unselect everything. | |
367 store.selectedId = '1'; | |
368 store.fire('select-item', {item: store.idToNodeMap_['2']}); | |
369 removeChild(TEST_TREE.children[0], 0); | |
370 overrideBookmarksGetSubTree([TEST_TREE.children[0]]); | |
371 store.onBookmarkRemoved_('2', {parentId: '1', index: 0}); | |
372 assertDeepEquals( | |
373 [false, false, false], | |
374 store.displayedList.map(i => i.isSelectedItem)); | |
375 assertEquals(null, store.anchorIndex_); | |
376 | |
377 // Changing the selected folder will remove the select status of the | |
378 // bookmark. | |
379 store.selectedId = '3'; | |
380 assertDeepEquals( | |
381 [false, false, false], | |
382 store.idToNodeMap_['1'].children.map(i => i.isSelectedItem)); | |
383 assertEquals(null, store.anchorIndex_); | |
384 }); | |
385 | |
386 test('shift select selects the correct bookmarks', function() { | |
387 // When nothing has been selected, it selects a single item. | |
388 assertEquals(null, store.anchorIndex_); | |
389 store.fire('select-item', {item: store.idToNodeMap_['6'], range: true}); | |
390 assertDeepEquals( | |
391 [false, false, true, false], | |
392 store.displayedList.map(i => i.isSelectedItem)); | |
393 assertEquals(2, store.anchorIndex_); | |
394 | |
395 // Select an item below the previous selected item. | |
396 store.fire('select-item', {item: store.idToNodeMap_['7'], range: true}); | |
397 assertEquals(2, store.anchorIndex_); | |
398 assertDeepEquals( | |
399 [false, false, true, true], | |
400 store.displayedList.map(i => i.isSelectedItem)); | |
401 | |
402 // Select an item above the previous selected item. | |
403 store.fire('select-item', {item: store.idToNodeMap_['2'], range: true}); | |
404 assertEquals(2, store.anchorIndex_); | |
405 assertDeepEquals( | |
406 [true, true, true, false], | |
407 store.displayedList.map(i => i.isSelectedItem)); | |
408 }); | |
409 | |
410 test('ctrl select selects the correct bookmarks', function() { | |
411 // When nothing has been selected, it selects a single item. | |
412 assertEquals(null, store.anchorIndex_); | |
413 store.fire('select-item', {item: store.idToNodeMap_['6'], add: true}); | |
414 assertDeepEquals( | |
415 [false, false, true, false], | |
416 store.displayedList.map(i => i.isSelectedItem)); | |
417 assertEquals(2, store.anchorIndex_); | |
418 | |
419 // Select a new item will not deselect the previous item, but will update | |
420 // anchorIndex_. | |
421 store.fire('select-item', {item: store.idToNodeMap_['2'], add: true}); | |
422 assertDeepEquals( | |
423 [true, false, true, false], | |
424 store.displayedList.map(i => i.isSelectedItem)); | |
425 assertEquals(0, store.anchorIndex_); | |
426 }); | |
427 | |
428 | |
tsergeant
2017/02/02 04:35:21
Nit: Extra line here
jiaxi
2017/02/02 05:28:36
Done.
| |
429 test('shift + ctrl select selects the correct bookmarks', function() { | |
430 store.fire('select-item', {item: store.displayedList[0]}); | |
431 store.fire( | |
432 'select-item', {item: store.displayedList[2], add: true, range: false}); | |
433 store.fire( | |
434 'select-item', {item: store.displayedList[3], add: true, range: true}); | |
435 assertDeepEquals( | |
436 [true, false, true, true], | |
437 store.displayedList.map(i => i.isSelectedItem)); | |
438 assertEquals(2, store.anchorIndex_); | |
439 }); | |
440 | |
441 test('selection in search mode', function() { | |
442 // Item gets unselected in search. | |
443 overrideBookmarksSearch([ | |
444 createItem('4', {url: 'link4'}), | |
445 createItem('2', {url: 'link2'}), | |
446 createItem('5', {url: 'link5'}), | |
447 ]); | |
448 | |
449 store.selectedId = '1'; | |
450 store.fire('select-item', {item: store.idToNodeMap_['3']}); | |
451 store.searchTerm = 'a'; | |
452 assertFalse(store.idToNodeMap_['3'].isSelectedItem); | |
453 assertEquals(null, store.anchorIndex_); | |
454 | |
455 // anchorIndex_ gets updated properly in single select. | |
456 store.fire('select-item', {item: store.displayedList[1]}); | |
457 assertDeepEquals( | |
458 [false, true, false], | |
459 store.displayedList.map(i => i.isSelectedItem)); | |
460 assertEquals(1, store.anchorIndex_); | |
461 | |
462 // anchorIndex_ gets updated properly in ctrl select. | |
463 store.fire('select-item', {item: store.displayedList[0], add: true}); | |
464 assertDeepEquals( | |
465 [true, true, false], | |
466 store.displayedList.map(i => i.isSelectedItem)); | |
467 assertEquals(0, store.anchorIndex_); | |
468 | |
469 // Delete the selected item will unselect everything. | |
470 store.fire('select-item', {item: store.displayedList[1]}); | |
471 overrideBookmarksSearch([ | |
472 createItem('4', {url: 'link4'}), | |
473 createItem('5', {url: 'link5'}), | |
474 ]); | |
475 removeChild(TEST_TREE.children[0], 0); | |
476 overrideBookmarksGetSubTree([TEST_TREE.children[0]]); | |
477 | |
478 store.onBookmarkRemoved_('2', {parentId: '1', index: 0}); | |
479 assertDeepEquals( | |
480 [false, false], | |
481 store.displayedList.map(i => i.isSelectedItem)); | |
482 assertEquals(null, store.anchorIndex_); | |
483 | |
484 // Shift+Ctrl select selects the right item. | |
485 overrideBookmarksSearch([ | |
486 createItem('4', {url: 'link4'}), | |
487 createFolder('3', []), | |
488 createItem('5', {url: 'link5'}), | |
489 createItem('6', {url: 'link4'}), | |
490 createItem('7', {url: 'link5'}), | |
491 ]); | |
492 store.searchTerm = 'b'; | |
493 store.fire('select-item', {item: store.displayedList[0]}); | |
494 store.fire( | |
495 'select-item', {item: store.displayedList[2], add: true, range: false}); | |
496 store.fire( | |
497 'select-item', {item: store.displayedList[4], add: true, range: true}); | |
498 assertDeepEquals( | |
499 [true, false, true, true, true], | |
500 store.displayedList.map(i => i.isSelectedItem)); | |
501 assertEquals(2, store.anchorIndex_); | |
502 }); | |
311 }); | 503 }); |
OLD | NEW |