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 |