Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: pkg/analysis_server/test/src/watch_manager_test.dart

Issue 1244613004: Implement support for watching directories containing implicitly analyzed files (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698