Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 library test.src.watch_manager_test; | |
| 6 | |
| 7 import 'package:analysis_server/src/watch_manager.dart'; | |
| 8 import 'package:analyzer/file_system/file_system.dart'; | |
| 9 import 'package:analyzer/file_system/memory_file_system.dart'; | |
| 10 import 'package:test_reflective_loader/test_reflective_loader.dart'; | |
| 11 import 'package:unittest/unittest.dart'; | |
| 12 import 'package:watcher/watcher.dart'; | |
| 13 import 'dart:async'; | |
| 14 | |
| 15 main() { | |
| 16 groupSep = ' | '; | |
| 17 defineReflectiveTests(WatchManagerTest); | |
| 18 defineReflectiveTests(WatchNodeTest); | |
| 19 } | |
| 20 | |
| 21 /** | |
| 22 * Tokens that can be used for testing purposes. | |
| 23 */ | |
| 24 class Token { | |
| 25 /** | |
| 26 * A name used for debugging. | |
| 27 */ | |
| 28 final String name; | |
| 29 | |
| 30 /** | |
| 31 * Initialize a newly created token to have the given name. | |
| 32 */ | |
| 33 Token(this.name); | |
| 34 | |
| 35 @override | |
| 36 String toString() => name; | |
| 37 } | |
| 38 | |
| 39 /** | |
| 40 * A listener that captures the state of watch events so that they can be | |
| 41 * tested. | |
| 42 */ | |
| 43 class WatchListener { | |
| 44 /** | |
| 45 * The event that was passed to the listener method. | |
| 46 */ | |
| 47 WatchEvent event; | |
| 48 | |
| 49 /** | |
| 50 * The tokens that were passed to the listener method. | |
| 51 */ | |
| 52 List<Token> tokens; | |
| 53 | |
| 54 /** | |
| 55 * The listener method. | |
| 56 */ | |
| 57 void handleWatchEvent(WatchEvent event, List<Token> tokens) { | |
| 58 this.event = event; | |
| 59 this.tokens = tokens; | |
| 60 } | |
| 61 } | |
| 62 | |
| 63 @reflectiveTest | |
| 64 class WatchManagerTest { | |
| 65 MemoryResourceProvider provider; | |
| 66 WatchListener listener; | |
| 67 WatchManager<Token> manager; | |
| 68 | |
| 69 void setUp() { | |
| 70 provider = new MemoryResourceProvider(); | |
| 71 listener = new WatchListener(); | |
| 72 manager = new WatchManager<Token>(provider, listener.handleWatchEvent); | |
| 73 } | |
| 74 | |
| 75 Future test_addFolder_folderAndSubfolder() async { | |
| 76 Folder topFolder = provider.getFolder('/a/b'); | |
| 77 Folder childFolder = provider.getFolder('/a/b/c/d'); | |
| 78 Token topToken = new Token('topToken'); | |
| 79 Token childToken = new Token('childToken'); | |
| 80 manager.addFolder(topFolder, topToken); | |
| 81 manager.addFolder(childFolder, childToken); | |
| 82 | |
| 83 File newFile1 = provider.newFile('/a/b/c/lib.dart', ''); | |
| 84 await _expectEvent(ChangeType.ADD, newFile1.path, [topToken]); | |
| 85 | |
| 86 File newFile2 = provider.newFile('/a/b/c/d/lib.dart', ''); | |
| 87 _expectEvent(ChangeType.ADD, newFile2.path, [topToken, childToken]); | |
| 88 } | |
| 89 | |
| 90 Future test_addFolder_singleFolder_singleToken() async { | |
| 91 Folder folder = provider.getFolder('/a/b'); | |
| 92 Token token = new Token('token'); | |
| 93 manager.addFolder(folder, token); | |
| 94 | |
| 95 Folder newFolder = provider.newFolder('/a/b/c'); | |
| 96 await _expectEvent(ChangeType.ADD, newFolder.path, [token]); | |
| 97 | |
| 98 File newFile = provider.newFile('/a/b/c/lib.dart', ''); | |
| 99 _expectEvent(ChangeType.ADD, newFile.path, [token]); | |
| 100 } | |
| 101 | |
| 102 Future test_addFolder_singleFolder_multipleTokens() { | |
| 103 Folder folder = provider.getFolder('/a/b'); | |
| 104 Token token1 = new Token('token1'); | |
| 105 Token token2 = new Token('token2'); | |
| 106 manager.addFolder(folder, token1); | |
| 107 manager.addFolder(folder, token2); | |
| 108 | |
| 109 File newFile = provider.newFile('/a/b/lib.dart', ''); | |
| 110 _expectEvent(ChangeType.ADD, newFile.path, [token1, token2]); | |
| 111 } | |
| 112 | |
| 113 Future test_addFolder_unrelatedFolders() async { | |
| 114 Folder folder1 = provider.getFolder('/a/b'); | |
| 115 Folder folder2 = provider.getFolder('/c/d'); | |
| 116 Token token1 = new Token('token1'); | |
| 117 Token token2 = new Token('token2'); | |
| 118 manager.addFolder(folder1, token1); | |
| 119 manager.addFolder(folder2, token2); | |
| 120 | |
| 121 File newFile1 = provider.newFile('/a/b/lib.dart', ''); | |
| 122 await _expectEvent(ChangeType.ADD, newFile1.path, [token1]); | |
| 123 | |
| 124 File newFile2 = provider.newFile('/c/d/lib.dart', ''); | |
| 125 _expectEvent(ChangeType.ADD, newFile2.path, [token2]); | |
| 126 } | |
| 127 | |
| 128 void test_creation() { | |
| 129 expect(manager, isNotNull); | |
| 130 } | |
| 131 | |
| 132 Future test_removeFolder_unadded() { | |
| 133 Folder folder = provider.getFolder('/a/b'); | |
| 134 Token token = new Token('token'); | |
| 135 manager.removeFolder(folder, token); | |
| 136 | |
| 137 provider.newFile('/a/b/lib.dart', ''); | |
| 138 _expectNoEvent(); | |
| 139 } | |
| 140 | |
| 141 Future test_removeFolder_withChildren() async { | |
| 142 Folder topFolder = provider.getFolder('/a/b'); | |
| 143 Folder childFolder = provider.getFolder('/a/b/c/d'); | |
| 144 Token topToken = new Token('topToken'); | |
| 145 Token childToken = new Token('childToken'); | |
| 146 manager.addFolder(topFolder, topToken); | |
| 147 manager.addFolder(childFolder, childToken); | |
| 148 manager.removeFolder(topFolder, topToken); | |
| 149 | |
| 150 File newFile = provider.newFile('/a/b/c/d/lib.dart', ''); | |
| 151 await _expectEvent(ChangeType.ADD, newFile.path, [childToken]); | |
| 152 | |
| 153 provider.newFile('/a/b/lib.dart', ''); | |
| 154 _expectNoEvent(); | |
| 155 } | |
| 156 | |
| 157 Future test_removeFolder_withNoChildren() { | |
| 158 Folder folder = provider.getFolder('/a/b'); | |
| 159 Token token = new Token('token'); | |
| 160 manager.addFolder(folder, token); | |
| 161 manager.removeFolder(folder, token); | |
| 162 | |
| 163 provider.newFile('/a/b/lib.dart', ''); | |
| 164 _expectNoEvent(); | |
| 165 } | |
| 166 | |
| 167 Future test_removeFolder_multipleTokens() { | |
| 168 Folder folder = provider.getFolder('/a/b'); | |
| 169 Token token1 = new Token('token1'); | |
| 170 Token token2 = new Token('token2'); | |
| 171 manager.addFolder(folder, token1); | |
| 172 manager.addFolder(folder, token2); | |
| 173 manager.removeFolder(folder, token2); | |
| 174 | |
| 175 File newFile = provider.newFile('/a/b/lib.dart', ''); | |
| 176 _expectEvent(ChangeType.ADD, newFile.path, [token1]); | |
| 177 } | |
| 178 | |
| 179 Future _expectEvent(ChangeType expectedType, String expectedPath, | |
| 180 List<Token> expectedTokens) async { | |
| 181 await new Future.delayed(Duration.ZERO); | |
| 182 WatchEvent event = listener.event; | |
| 183 expect(event, isNotNull); | |
| 184 expect(event.type, expectedType); | |
| 185 expect(event.path, expectedPath); | |
| 186 expect(listener.tokens, unorderedEquals(expectedTokens)); | |
| 187 } | |
| 188 | |
| 189 Future _expectNoEvent() async { | |
| 190 await new Future.delayed(Duration.ZERO); | |
|
Paul Berry
2015/07/19 18:38:34
Consider using pumpEventQueue(), which makes the t
Brian Wilkerson
2015/07/19 21:24:21
Done
| |
| 191 expect(listener.event, isNull); | |
| 192 expect(listener.tokens, isNull); | |
| 193 } | |
| 194 } | |
| 195 | |
| 196 @reflectiveTest | |
| 197 class WatchNodeTest { | |
| 198 MemoryResourceProvider provider = new MemoryResourceProvider(); | |
| 199 | |
| 200 void test_creation_folder() { | |
| 201 Folder folder = provider.getFolder('/a/b'); | |
| 202 WatchNode node = new WatchNode(folder); | |
| 203 expect(node, isNotNull); | |
| 204 expect(node.children, isEmpty); | |
| 205 expect(node.folder, folder); | |
| 206 expect(node.parent, isNull); | |
| 207 expect(node.subscription, isNull); | |
| 208 expect(node.tokens, isEmpty); | |
| 209 } | |
| 210 | |
| 211 void test_creation_noFolder() { | |
| 212 WatchNode node = new WatchNode(null); | |
| 213 expect(node, isNotNull); | |
| 214 expect(node.children, isEmpty); | |
| 215 expect(node.folder, isNull); | |
| 216 expect(node.parent, isNull); | |
| 217 expect(node.subscription, isNull); | |
| 218 expect(node.tokens, isEmpty); | |
| 219 } | |
| 220 | |
| 221 void test_delete_nested_child() { | |
| 222 WatchNode rootNode = new WatchNode(null); | |
| 223 WatchNode topNode = new WatchNode(provider.getFolder('/a/b')); | |
| 224 WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d')); | |
| 225 WatchNode grandchildNode = new WatchNode(provider.getFolder('/a/b/c/d/e')); | |
| 226 rootNode.insert(topNode); | |
| 227 rootNode.insert(childNode); | |
| 228 rootNode.insert(grandchildNode); | |
| 229 | |
| 230 childNode.delete(); | |
| 231 expect(rootNode.children, equals([topNode])); | |
| 232 expect(topNode.children, equals([grandchildNode])); | |
| 233 expect(topNode.parent, rootNode); | |
| 234 expect(grandchildNode.parent, topNode); | |
| 235 } | |
| 236 | |
| 237 void test_delete_nested_noChild() { | |
| 238 WatchNode rootNode = new WatchNode(null); | |
| 239 WatchNode topNode = new WatchNode(provider.getFolder('/a/b')); | |
| 240 WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d')); | |
| 241 rootNode.insert(topNode); | |
| 242 rootNode.insert(childNode); | |
| 243 | |
| 244 childNode.delete(); | |
| 245 expect(rootNode.children, equals([topNode])); | |
| 246 expect(topNode.children, isEmpty); | |
| 247 expect(topNode.parent, rootNode); | |
| 248 } | |
| 249 | |
| 250 void test_delete_top_child() { | |
| 251 WatchNode rootNode = new WatchNode(null); | |
| 252 WatchNode topNode = new WatchNode(provider.getFolder('/a/b')); | |
| 253 WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d')); | |
| 254 rootNode.insert(topNode); | |
| 255 rootNode.insert(childNode); | |
| 256 | |
| 257 topNode.delete(); | |
| 258 expect(rootNode.children, equals([childNode])); | |
| 259 expect(childNode.parent, rootNode); | |
| 260 } | |
| 261 | |
| 262 void test_delete_top_noChild() { | |
| 263 WatchNode rootNode = new WatchNode(null); | |
| 264 WatchNode topNode = new WatchNode(provider.getFolder('/a/b')); | |
| 265 rootNode.insert(topNode); | |
| 266 | |
| 267 topNode.delete(); | |
| 268 expect(rootNode.children, isEmpty); | |
| 269 } | |
| 270 | |
| 271 void test_findParent_childOfLeaf() { | |
| 272 WatchNode rootNode = new WatchNode(null); | |
| 273 WatchNode topNode = new WatchNode(provider.getFolder('/a/b')); | |
| 274 rootNode.insert(topNode); | |
| 275 | |
| 276 expect(rootNode.findParent('/a/b/c'), topNode); | |
| 277 } | |
| 278 | |
| 279 void test_findParent_childOfNonLeaf() { | |
| 280 WatchNode rootNode = new WatchNode(null); | |
| 281 WatchNode topNode = new WatchNode(provider.getFolder('/a/b')); | |
| 282 WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d')); | |
| 283 rootNode.insert(topNode); | |
| 284 rootNode.insert(childNode); | |
| 285 | |
| 286 expect(rootNode.findParent('/a/b/c'), topNode); | |
| 287 } | |
| 288 | |
| 289 void test_findParent_noMatch() { | |
| 290 WatchNode rootNode = new WatchNode(null); | |
| 291 WatchNode topNode = new WatchNode(provider.getFolder('/a/b')); | |
| 292 rootNode.insert(topNode); | |
| 293 | |
| 294 expect(rootNode.findParent('/c/d'), rootNode); | |
| 295 } | |
| 296 | |
| 297 void test_forEachChild_children() { | |
| 298 WatchNode rootNode = new WatchNode(null); | |
| 299 WatchNode child1 = new WatchNode(provider.getFolder('/a')); | |
| 300 WatchNode child2 = new WatchNode(provider.getFolder('/b')); | |
| 301 WatchNode child3 = new WatchNode(provider.getFolder('/c')); | |
| 302 rootNode.insert(child1); | |
| 303 rootNode.insert(child2); | |
| 304 rootNode.insert(child3); | |
| 305 | |
| 306 List<String> expectedPaths = <String>['/a', '/b', '/c']; | |
| 307 rootNode.forEachChild((WatchNode node) { | |
| 308 expect(expectedPaths.remove(node.folder.path), isTrue); | |
| 309 }); | |
| 310 expect(expectedPaths, isEmpty); | |
| 311 } | |
| 312 | |
| 313 void test_forEachChild_noChildren() { | |
| 314 WatchNode rootNode = new WatchNode(null); | |
| 315 | |
| 316 int count = 0; | |
| 317 rootNode.forEachChild((WatchNode node) { | |
| 318 count++; | |
| 319 }); | |
| 320 expect(count, 0); | |
| 321 } | |
| 322 | |
| 323 void test_insert_nested_afterParent() { | |
| 324 WatchNode rootNode = new WatchNode(null); | |
| 325 WatchNode topNode = new WatchNode(provider.getFolder('/a/b')); | |
| 326 WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d')); | |
| 327 | |
| 328 rootNode.insert(topNode); | |
| 329 rootNode.insert(childNode); | |
| 330 expect(childNode.parent, topNode); | |
| 331 expect(childNode.children, isEmpty); | |
| 332 expect(topNode.children, equals([childNode])); | |
| 333 } | |
| 334 | |
| 335 void test_insert_nested_beforeParent() { | |
| 336 WatchNode rootNode = new WatchNode(null); | |
| 337 WatchNode topNode = new WatchNode(provider.getFolder('/a/b')); | |
| 338 WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d')); | |
| 339 | |
| 340 rootNode.insert(childNode); | |
| 341 rootNode.insert(topNode); | |
| 342 expect(childNode.parent, topNode); | |
| 343 expect(childNode.children, isEmpty); | |
| 344 expect(topNode.children, equals([childNode])); | |
| 345 } | |
| 346 | |
| 347 void test_insert_intermediate_afterParentAndChild() { | |
| 348 WatchNode rootNode = new WatchNode(null); | |
| 349 WatchNode topNode = new WatchNode(provider.getFolder('/a/b')); | |
| 350 WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d')); | |
| 351 WatchNode intermediateNode = new WatchNode(provider.getFolder('/a/b/c')); | |
| 352 | |
| 353 rootNode.insert(topNode); | |
| 354 rootNode.insert(childNode); | |
| 355 rootNode.insert(intermediateNode); | |
| 356 expect(topNode.parent, rootNode); | |
| 357 expect(topNode.children, equals([intermediateNode])); | |
| 358 expect(intermediateNode.parent, topNode); | |
| 359 expect(intermediateNode.children, equals([childNode])); | |
| 360 expect(childNode.parent, intermediateNode); | |
| 361 expect(childNode.children, isEmpty); | |
| 362 } | |
| 363 | |
| 364 void test_insert_top() { | |
| 365 WatchNode rootNode = new WatchNode(null); | |
| 366 WatchNode topNode = new WatchNode(provider.getFolder('/a/b')); | |
| 367 | |
| 368 rootNode.insert(topNode); | |
| 369 expect(rootNode.children, equals([topNode])); | |
| 370 expect(topNode.parent, rootNode); | |
| 371 expect(topNode.children, isEmpty); | |
| 372 } | |
| 373 } | |
| OLD | NEW |