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

Side by Side Diff: pkg/analysis_server/test/context_manager_test.dart

Issue 1242023008: Server .packages support. (Closed) Base URL: git@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
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library test.context.directory.manager; 5 library test.context.directory.manager;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analysis_server/src/context_manager.dart'; 9 import 'package:analysis_server/src/context_manager.dart';
10 import 'package:analysis_server/src/source/optimizing_pub_package_map_provider.d art'; 10 import 'package:analysis_server/src/source/optimizing_pub_package_map_provider.d art';
11 import 'package:analysis_server/uri/resolver_provider.dart'; 11 import 'package:analysis_server/uri/resolver_provider.dart';
12 import 'package:analyzer/file_system/file_system.dart'; 12 import 'package:analyzer/file_system/file_system.dart';
13 import 'package:analyzer/file_system/memory_file_system.dart'; 13 import 'package:analyzer/file_system/memory_file_system.dart';
14 import 'package:analyzer/instrumentation/instrumentation.dart'; 14 import 'package:analyzer/instrumentation/instrumentation.dart';
15 import 'package:analyzer/source/package_map_resolver.dart'; 15 import 'package:analyzer/source/package_map_resolver.dart';
16 import 'package:analyzer/src/generated/engine.dart'; 16 import 'package:analyzer/src/generated/engine.dart';
17 import 'package:analyzer/src/generated/source.dart'; 17 import 'package:analyzer/src/generated/source.dart';
18 import 'package:analyzer/src/generated/source_io.dart'; 18 import 'package:analyzer/src/generated/source_io.dart';
19 import 'package:package_config/packages.dart';
19 import 'package:path/path.dart'; 20 import 'package:path/path.dart';
20 import 'package:test_reflective_loader/test_reflective_loader.dart'; 21 import 'package:test_reflective_loader/test_reflective_loader.dart';
21 import 'package:unittest/unittest.dart'; 22 import 'package:unittest/unittest.dart';
22 23
23 import 'mocks.dart'; 24 import 'mocks.dart';
24 25
25 main() { 26 main() {
26 groupSep = ' | '; 27 groupSep = ' | ';
27 defineReflectiveTests(AbstractContextManagerTest); 28 defineReflectiveTests(AbstractContextManagerTest);
28 } 29 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 void test_isInAnalysisRoot_inRoot() { 123 void test_isInAnalysisRoot_inRoot() {
123 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 124 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
124 expect(manager.isInAnalysisRoot('$projPath/test.dart'), isTrue); 125 expect(manager.isInAnalysisRoot('$projPath/test.dart'), isTrue);
125 } 126 }
126 127
127 void test_isInAnalysisRoot_notInRoot() { 128 void test_isInAnalysisRoot_notInRoot() {
128 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 129 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
129 expect(manager.isInAnalysisRoot('/test.dart'), isFalse); 130 expect(manager.isInAnalysisRoot('/test.dart'), isFalse);
130 } 131 }
131 132
133 test_refresh_folder_with_packagespec() {
134 // create a context with a .packages file
135 String packagespecFile = posix.join(projPath, '.packages');
136 resourceProvider.newFile(packagespecFile, '');
137 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
138 return pumpEventQueue().then((_) {
Brian Wilkerson 2015/07/17 18:02:58 You can also make this an async method and return
pquitslund 2015/07/17 19:30:02 Acknowledged.
139 expect(manager.currentContextPaths.toList(), [projPath]);
140 manager.now++;
141 manager.refresh(null);
142 return pumpEventQueue().then((_) {
143 expect(manager.currentContextPaths.toList(), [projPath]);
144 expect(manager.currentContextTimestamps[projPath], manager.now);
145 });
146 });
147 }
148
149 test_refresh_folder_with_packagespec_subfolders() {
150 // Create a folder with no .packages file, containing two subfolders with
151 // .packages files.
152 String subdir1Path = posix.join(projPath, 'subdir1');
153 String subdir2Path = posix.join(projPath, 'subdir2');
154 String packagespec1Path = posix.join(subdir1Path, '.packages');
155 String packagespec2Path = posix.join(subdir2Path, '.packages');
156 resourceProvider.newFile(packagespec1Path, '');
157 resourceProvider.newFile(packagespec2Path, '');
158 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
159 return pumpEventQueue().then((_) {
160 expect(manager.currentContextPaths.toSet(),
161 [subdir1Path, subdir2Path, projPath].toSet());
162 manager.now++;
163 manager.refresh(null);
164 return pumpEventQueue().then((_) {
165 expect(manager.currentContextPaths.toSet(),
166 [subdir1Path, subdir2Path, projPath].toSet());
167 expect(manager.currentContextTimestamps[projPath], manager.now);
168 expect(manager.currentContextTimestamps[subdir1Path], manager.now);
169 expect(manager.currentContextTimestamps[subdir2Path], manager.now);
170 });
171 });
172 }
173
132 test_refresh_folder_with_pubspec() { 174 test_refresh_folder_with_pubspec() {
133 // create a context with a pubspec.yaml file 175 // create a context with a pubspec.yaml file
134 String pubspecPath = posix.join(projPath, 'pubspec.yaml'); 176 String pubspecPath = posix.join(projPath, 'pubspec.yaml');
135 resourceProvider.newFile(pubspecPath, 'pubspec'); 177 resourceProvider.newFile(pubspecPath, 'pubspec');
136 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 178 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
137 return pumpEventQueue().then((_) { 179 return pumpEventQueue().then((_) {
138 expect(manager.currentContextPaths.toList(), [projPath]); 180 expect(manager.currentContextPaths.toList(), [projPath]);
139 manager.now++; 181 manager.now++;
140 manager.refresh(null); 182 manager.refresh(null);
141 return pumpEventQueue().then((_) { 183 return pumpEventQueue().then((_) {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 267
226 void test_setRoots_addFolderWithDummyLink() { 268 void test_setRoots_addFolderWithDummyLink() {
227 String filePath = posix.join(projPath, 'foo.dart'); 269 String filePath = posix.join(projPath, 'foo.dart');
228 resourceProvider.newDummyLink(filePath); 270 resourceProvider.newDummyLink(filePath);
229 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 271 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
230 // verify 272 // verify
231 var filePaths = manager.currentContextFilePaths[projPath]; 273 var filePaths = manager.currentContextFilePaths[projPath];
232 expect(filePaths, isEmpty); 274 expect(filePaths, isEmpty);
233 } 275 }
234 276
277 void test_setRoots_addFolderWithNestedPackageSpec() {
278 String examplePath = newFolder([projPath, EXAMPLE_NAME]);
279 String libPath = newFolder([projPath, LIB_NAME]);
280
281 newFile([projPath, AbstractContextManager.PACKAGE_SPEC_NAME]);
282 newFile([libPath, 'main.dart']);
283 newFile([examplePath, AbstractContextManager.PACKAGE_SPEC_NAME]);
284 newFile([examplePath, 'example.dart']);
285
286 packageMapProvider.packageMap['proj'] =
287 [resourceProvider.getResource(libPath)];
288
289 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
290
291 expect(manager.currentContextPaths, hasLength(2));
292
293 expect(manager.currentContextPaths, contains(projPath));
294 Set<Source> projSources = manager.currentContextSources[projPath];
295 expect(projSources, hasLength(1));
296 expect(projSources.first.uri.toString(), 'file:///my/proj/lib/main.dart');
297
298 expect(manager.currentContextPaths, contains(examplePath));
299 Set<Source> exampleSources = manager.currentContextSources[examplePath];
300 expect(exampleSources, hasLength(1));
301 expect(exampleSources.first.uri.toString(),
302 'file:///my/proj/example/example.dart');
303 }
304
235 void test_setRoots_addFolderWithNestedPubspec() { 305 void test_setRoots_addFolderWithNestedPubspec() {
236 String examplePath = newFolder([projPath, EXAMPLE_NAME]); 306 String examplePath = newFolder([projPath, EXAMPLE_NAME]);
237 String libPath = newFolder([projPath, LIB_NAME]); 307 String libPath = newFolder([projPath, LIB_NAME]);
238 308
239 newFile([projPath, AbstractContextManager.PUBSPEC_NAME]); 309 newFile([projPath, AbstractContextManager.PUBSPEC_NAME]);
240 newFile([libPath, 'main.dart']); 310 newFile([libPath, 'main.dart']);
241 newFile([examplePath, AbstractContextManager.PUBSPEC_NAME]); 311 newFile([examplePath, AbstractContextManager.PUBSPEC_NAME]);
242 newFile([examplePath, 'example.dart']); 312 newFile([examplePath, 'example.dart']);
243 313
244 packageMapProvider.packageMap['proj'] = 314 packageMapProvider.packageMap['proj'] =
(...skipping 17 matching lines...) Expand all
262 332
263 void test_setRoots_addFolderWithoutPubspec() { 333 void test_setRoots_addFolderWithoutPubspec() {
264 packageMapProvider.packageMap = null; 334 packageMapProvider.packageMap = null;
265 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 335 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
266 // verify 336 // verify
267 expect(manager.currentContextPaths, hasLength(1)); 337 expect(manager.currentContextPaths, hasLength(1));
268 expect(manager.currentContextPaths, contains(projPath)); 338 expect(manager.currentContextPaths, contains(projPath));
269 expect(manager.currentContextFilePaths[projPath], hasLength(0)); 339 expect(manager.currentContextFilePaths[projPath], hasLength(0));
270 } 340 }
271 341
342 void test_setRoots_addFolderWithPackagespec() {
343 String packagespecPath = posix.join(projPath, '.packages');
344 resourceProvider.newFile(packagespecPath,
345 'unittest:file:///home/somebody/.pub/cache/unittest-0.9.9/lib/');
346 String libPath = newFolder([projPath, LIB_NAME]);
347 File mainFile =
348 resourceProvider.newFile(posix.join(libPath, 'main.dart'), '');
349 Source source = mainFile.createSource();
350
351 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
352
353 // verify
354 expect(manager.currentContextPaths, hasLength(1));
355 expect(manager.currentContextPaths, contains(projPath));
356 expect(manager.currentContextFilePaths[projPath], hasLength(1));
357
358 // smoketest resolution
359 SourceFactory sourceFactory = manager.currentContext.sourceFactory;
360 Source resolvedSource =
361 sourceFactory.resolveUri(source, 'package:unittest/unittest.dart');
362 expect(resolvedSource, isNotNull);
363 expect(resolvedSource.fullName,
364 equals('/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart'));
365 }
366
272 void test_setRoots_addFolderWithPubspec() { 367 void test_setRoots_addFolderWithPubspec() {
273 String pubspecPath = posix.join(projPath, 'pubspec.yaml'); 368 String pubspecPath = posix.join(projPath, 'pubspec.yaml');
274 resourceProvider.newFile(pubspecPath, 'pubspec'); 369 resourceProvider.newFile(pubspecPath, 'pubspec');
275 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 370 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
276 // verify 371 // verify
277 expect(manager.currentContextPaths, hasLength(1)); 372 expect(manager.currentContextPaths, hasLength(1));
278 expect(manager.currentContextPaths, contains(projPath)); 373 expect(manager.currentContextPaths, contains(projPath));
279 expect(manager.currentContextFilePaths[projPath], hasLength(0)); 374 expect(manager.currentContextFilePaths[projPath], hasLength(0));
280 } 375 }
281 376
377 void test_setRoots_addFolderWithPubspec_andPackagespec() {
378 String pubspecPath = posix.join(projPath, 'pubspec.yaml');
379 String packagespecPath = posix.join(projPath, '.packages');
380 resourceProvider.newFile(pubspecPath, 'pubspec');
381 resourceProvider.newFile(packagespecPath, '');
382 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
383 // verify
384 manager.assertContextPaths([projPath]);
385 }
386
282 void test_setRoots_addFolderWithPubspecAndLib() { 387 void test_setRoots_addFolderWithPubspecAndLib() {
283 String binPath = newFolder([projPath, BIN_NAME]); 388 String binPath = newFolder([projPath, BIN_NAME]);
284 String libPath = newFolder([projPath, LIB_NAME]); 389 String libPath = newFolder([projPath, LIB_NAME]);
285 String srcPath = newFolder([libPath, SRC_NAME]); 390 String srcPath = newFolder([libPath, SRC_NAME]);
286 String testPath = newFolder([projPath, TEST_NAME]); 391 String testPath = newFolder([projPath, TEST_NAME]);
287 392
288 newFile([projPath, AbstractContextManager.PUBSPEC_NAME]); 393 newFile([projPath, AbstractContextManager.PUBSPEC_NAME]);
289 String appPath = newFile([binPath, 'app.dart']); 394 String appPath = newFile([binPath, 'app.dart']);
290 newFile([libPath, 'main.dart']); 395 newFile([libPath, 'main.dart']);
291 newFile([srcPath, 'internal.dart']); 396 newFile([srcPath, 'internal.dart']);
292 String testFilePath = newFile([testPath, 'main_test.dart']); 397 String testFilePath = newFile([testPath, 'main_test.dart']);
293 398
294 packageMapProvider.packageMap['proj'] = 399 packageMapProvider.packageMap['proj'] =
295 [resourceProvider.getResource(libPath)]; 400 [resourceProvider.getResource(libPath)];
296 401
297 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 402 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
298 Set<Source> sources = manager.currentContextSources[projPath]; 403 Set<Source> sources = manager.currentContextSources[projPath];
299 404
300 expect(manager.currentContextPaths, hasLength(1)); 405 expect(manager.currentContextPaths, hasLength(1));
301 expect(manager.currentContextPaths, contains(projPath)); 406 expect(manager.currentContextPaths, contains(projPath));
302 expect(sources, hasLength(4)); 407 expect(sources, hasLength(4));
303 List<String> uris = 408 List<String> uris =
304 sources.map((Source source) => source.uri.toString()).toList(); 409 sources.map((Source source) => source.uri.toString()).toList();
305 expect(uris, contains('file://$appPath')); 410 expect(uris, contains('file://$appPath'));
306 expect(uris, contains('package:proj/main.dart')); 411 expect(uris, contains('package:proj/main.dart'));
307 expect(uris, contains('package:proj/src/internal.dart')); 412 expect(uris, contains('package:proj/src/internal.dart'));
308 expect(uris, contains('file://$testFilePath')); 413 expect(uris, contains('file://$testFilePath'));
309 } 414 }
310 415
416 void test_setRoots_addFolderWithPubspecAndPackagespecFolders() {
417 // prepare paths
418 String root = '/root';
419 String rootFile = '$root/root.dart';
420 String subProjectA = '$root/sub/aaa';
421 String subProjectB = '$root/sub/sub2/bbb';
422 String subProjectA_file = '$subProjectA/bin/a.dart';
423 String subProjectB_file = '$subProjectB/bin/b.dart';
424 // create files
425 resourceProvider.newFile('$subProjectA/pubspec.yaml', 'pubspec');
426 resourceProvider.newFile('$subProjectB/pubspec.yaml', 'pubspec');
427 resourceProvider.newFile('$subProjectA/.packages', '');
428 resourceProvider.newFile('$subProjectB/.packages', '');
429
430 resourceProvider.newFile(rootFile, 'library root;');
431 resourceProvider.newFile(subProjectA_file, 'library a;');
432 resourceProvider.newFile(subProjectB_file, 'library b;');
433
434 // set roots
435 manager.setRoots(<String>[root], <String>[], <String, String>{});
436 manager.assertContextPaths([root, subProjectA, subProjectB]);
437 // verify files
438 manager.assertContextFiles(root, [rootFile]);
439 manager.assertContextFiles(subProjectA, [subProjectA_file]);
440 manager.assertContextFiles(subProjectB, [subProjectB_file]);
441 }
442
311 void test_setRoots_addFolderWithPubspecFolders() { 443 void test_setRoots_addFolderWithPubspecFolders() {
312 // prepare paths 444 // prepare paths
313 String root = '/root'; 445 String root = '/root';
314 String rootFile = '$root/root.dart'; 446 String rootFile = '$root/root.dart';
315 String subProjectA = '$root/sub/aaa'; 447 String subProjectA = '$root/sub/aaa';
316 String subProjectB = '$root/sub/sub2/bbb'; 448 String subProjectB = '$root/sub/sub2/bbb';
317 String subProjectA_file = '$subProjectA/bin/a.dart'; 449 String subProjectA_file = '$subProjectA/bin/a.dart';
318 String subProjectB_file = '$subProjectB/bin/b.dart'; 450 String subProjectB_file = '$subProjectB/bin/b.dart';
319 // create files 451 // create files
320 resourceProvider.newFile('$subProjectA/pubspec.yaml', 'pubspec'); 452 resourceProvider.newFile('$subProjectA/pubspec.yaml', 'pubspec');
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 packageMapProvider.packageMap = null; 665 packageMapProvider.packageMap = null;
534 // add one root - there is a context 666 // add one root - there is a context
535 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 667 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
536 expect(manager.currentContextPaths, hasLength(1)); 668 expect(manager.currentContextPaths, hasLength(1));
537 // set empty roots - no contexts 669 // set empty roots - no contexts
538 manager.setRoots(<String>[], <String>[], <String, String>{}); 670 manager.setRoots(<String>[], <String>[], <String, String>{});
539 expect(manager.currentContextPaths, hasLength(0)); 671 expect(manager.currentContextPaths, hasLength(0));
540 expect(manager.currentContextFilePaths, hasLength(0)); 672 expect(manager.currentContextFilePaths, hasLength(0));
541 } 673 }
542 674
675 void test_setRoots_removeFolderWithPackagespec() {
676 // create a pubspec
677 String pubspecPath = posix.join(projPath, '.packages');
678 resourceProvider.newFile(pubspecPath, '');
679 // add one root - there is a context
680 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
681 expect(manager.currentContextPaths, hasLength(1));
682 // set empty roots - no contexts
683 manager.setRoots(<String>[], <String>[], <String, String>{});
684 expect(manager.currentContextPaths, hasLength(0));
685 expect(manager.currentContextFilePaths, hasLength(0));
686 }
687
688 void test_setRoots_removeFolderWithPackagespecFolder() {
689 // prepare paths
690 String projectA = '/projectA';
691 String projectB = '/projectB';
692 String subProjectA = '$projectA/sub';
693 String subProjectB = '$projectB/sub';
694 String projectA_file = '$projectA/a.dart';
695 String projectB_file = '$projectB/a.dart';
696 String subProjectA_pubspec = '$subProjectA/.packages';
697 String subProjectB_pubspec = '$subProjectB/.packages';
698 String subProjectA_file = '$subProjectA/bin/sub_a.dart';
699 String subProjectB_file = '$subProjectB/bin/sub_b.dart';
700 // create files
701 resourceProvider.newFile(projectA_file, '// a');
702 resourceProvider.newFile(projectB_file, '// b');
703 resourceProvider.newFile(subProjectA_pubspec, '');
704 resourceProvider.newFile(subProjectB_pubspec, '');
705 resourceProvider.newFile(subProjectA_file, '// sub-a');
706 resourceProvider.newFile(subProjectB_file, '// sub-b');
707 // set roots
708 manager.setRoots(
709 <String>[projectA, projectB], <String>[], <String, String>{});
710 manager.assertContextPaths([projectA, subProjectA, projectB, subProjectB]);
711 manager.assertContextFiles(projectA, [projectA_file]);
712 manager.assertContextFiles(projectB, [projectB_file]);
713 manager.assertContextFiles(subProjectA, [subProjectA_file]);
714 manager.assertContextFiles(subProjectB, [subProjectB_file]);
715 // remove "projectB"
716 manager.setRoots(<String>[projectA], <String>[], <String, String>{});
717 manager.assertContextPaths([projectA, subProjectA]);
718 manager.assertContextFiles(projectA, [projectA_file]);
719 manager.assertContextFiles(subProjectA, [subProjectA_file]);
720 }
721
543 void test_setRoots_removeFolderWithPubspec() { 722 void test_setRoots_removeFolderWithPubspec() {
544 // create a pubspec 723 // create a pubspec
545 String pubspecPath = posix.join(projPath, 'pubspec.yaml'); 724 String pubspecPath = posix.join(projPath, 'pubspec.yaml');
546 resourceProvider.newFile(pubspecPath, 'pubspec'); 725 resourceProvider.newFile(pubspecPath, 'pubspec');
547 // add one root - there is a context 726 // add one root - there is a context
548 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 727 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
549 expect(manager.currentContextPaths, hasLength(1)); 728 expect(manager.currentContextPaths, hasLength(1));
550 // set empty roots - no contexts 729 // set empty roots - no contexts
551 manager.setRoots(<String>[], <String>[], <String, String>{}); 730 manager.setRoots(<String>[], <String>[], <String, String>{});
552 expect(manager.currentContextPaths, hasLength(0)); 731 expect(manager.currentContextPaths, hasLength(0));
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
660 // add file in subfolder 839 // add file in subfolder
661 String filePath = posix.join(projPath, 'foo', 'bar.dart'); 840 String filePath = posix.join(projPath, 'foo', 'bar.dart');
662 resourceProvider.newFile(filePath, 'contents'); 841 resourceProvider.newFile(filePath, 'contents');
663 // the file was added 842 // the file was added
664 return pumpEventQueue().then((_) { 843 return pumpEventQueue().then((_) {
665 expect(filePaths, hasLength(1)); 844 expect(filePaths, hasLength(1));
666 expect(filePaths, contains(filePath)); 845 expect(filePaths, contains(filePath));
667 }); 846 });
668 } 847 }
669 848
849 test_watch_addPackagespec_toRoot() {
850 // prepare paths
851 String root = '/root';
852 String rootFile = '$root/root.dart';
853 String rootPubspec = '$root/.packages';
Brian Wilkerson 2015/07/17 18:02:58 nit: rootPubspec --> rootPackagespec?
pquitslund 2015/07/17 19:30:02 Done.
854 // create files
855 resourceProvider.newFile(rootFile, 'library root;');
856 // set roots
857 manager.setRoots(<String>[root], <String>[], <String, String>{});
858 manager.assertContextPaths([root]);
859 // verify files
860 manager.assertContextFiles(root, [rootFile]);
861 // add packagespec - still just one root
862 resourceProvider.newFile(rootPubspec, '');
863 return pumpEventQueue().then((_) {
864 manager.assertContextPaths([root]);
865 manager.assertContextFiles(root, [rootFile]);
Brian Wilkerson 2015/07/17 18:02:58 This doesn't actually guarantee that the changes t
pquitslund 2015/07/17 19:30:02 Good call! This may be tricky to test since the s
866 });
867 }
868
869 test_watch_addPackagespec_toSubFolder() {
870 // prepare paths
871 String root = '/root';
872 String rootFile = '$root/root.dart';
873 String subProject = '$root/sub/aaa';
874 String subPubspec = '$subProject/.packages';
875 String subFile = '$subProject/bin/a.dart';
876 // create files
877 resourceProvider.newFile(rootFile, 'library root;');
878 resourceProvider.newFile(subFile, 'library a;');
879 // set roots
880 manager.setRoots(<String>[root], <String>[], <String, String>{});
881 manager.assertContextPaths([root]);
882 // verify files
883 manager.assertContextFiles(root, [rootFile, subFile]);
884 // add .packages
885 resourceProvider.newFile(subPubspec, '');
886 return pumpEventQueue().then((_) {
887 manager.assertContextPaths([root, subProject]);
888 manager.assertContextFiles(root, [rootFile]);
889 manager.assertContextFiles(subProject, [subFile]);
890 });
891 }
892
893 test_watch_addPackagespec_toSubFolder_ofSubFolder() {
894 // prepare paths
895 String root = '/root';
896 String rootFile = '$root/root.dart';
897 String subProject = '$root/sub';
898 String subPubspec = '$subProject/.packages';
899 String subFile = '$subProject/bin/sub.dart';
900 String subSubPubspec = '$subProject/subsub/.packages';
901 // create files
902 resourceProvider.newFile(rootFile, 'library root;');
903 resourceProvider.newFile(subPubspec, '');
904 resourceProvider.newFile(subFile, 'library sub;');
905 // set roots
906 manager.setRoots(<String>[root], <String>[], <String, String>{});
907 manager.assertContextPaths([root, subProject]);
908 manager.assertContextFiles(root, [rootFile]);
909 manager.assertContextFiles(subProject, [subFile]);
910 // add pubspec - ignore, because is already in a pubspec-based context
Brian Wilkerson 2015/07/17 18:02:58 Was "pubspec-based" suppose to be ".packages-based
pquitslund 2015/07/17 19:30:02 Yes!
911 resourceProvider.newFile(subSubPubspec, '');
912 return pumpEventQueue().then((_) {
913 manager.assertContextPaths([root, subProject]);
914 manager.assertContextFiles(root, [rootFile]);
915 manager.assertContextFiles(subProject, [subFile]);
916 });
917 }
918
919 test_watch_addPackagespec_toSubFolder_withPubspec() {
920 // prepare paths
921 String root = '/root';
922 String rootFile = '$root/root.dart';
923 String subProject = '$root/sub/aaa';
924 String subPackagespec = '$subProject/.packages';
925 String subPubspec = '$subProject/pubspec.yaml';
926 String subFile = '$subProject/bin/a.dart';
927 // create files
928 resourceProvider.newFile(subPubspec, 'pubspec');
929 resourceProvider.newFile(rootFile, 'library root;');
930 resourceProvider.newFile(subFile, 'library a;');
931 // set roots
932 manager.setRoots(<String>[root], <String>[], <String, String>{});
933 manager.assertContextPaths([root, subProject]);
934 // verify files
935 manager.assertContextFiles(root, [rootFile]);
936 manager.assertContextFiles(subProject, [subFile]);
937
938 // add .packages
939 resourceProvider.newFile(subPackagespec, '');
940 return pumpEventQueue().then((_) {
941 // Should NOT create another context.
942 manager.assertContextPaths([root, subProject]);
943 manager.assertContextFiles(root, [rootFile]);
944 manager.assertContextFiles(subProject, [subFile]);
945 });
946 }
947
670 test_watch_addPubspec_toRoot() { 948 test_watch_addPubspec_toRoot() {
671 // prepare paths 949 // prepare paths
672 String root = '/root'; 950 String root = '/root';
673 String rootFile = '$root/root.dart'; 951 String rootFile = '$root/root.dart';
674 String rootPubspec = '$root/pubspec.yaml'; 952 String rootPubspec = '$root/pubspec.yaml';
675 // create files 953 // create files
676 resourceProvider.newFile(rootFile, 'library root;'); 954 resourceProvider.newFile(rootFile, 'library root;');
677 // set roots 955 // set roots
678 manager.setRoots(<String>[root], <String>[], <String, String>{}); 956 manager.setRoots(<String>[root], <String>[], <String, String>{});
679 manager.assertContextPaths([root]); 957 manager.assertContextPaths([root]);
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 expect(projFolder.exists, isTrue); 1050 expect(projFolder.exists, isTrue);
773 // delete the folder 1051 // delete the folder
774 resourceProvider.deleteFolder(projPath); 1052 resourceProvider.deleteFolder(projPath);
775 return pumpEventQueue().then((_) { 1053 return pumpEventQueue().then((_) {
776 expect(file.exists, isFalse); 1054 expect(file.exists, isFalse);
777 expect(projFolder.exists, isFalse); 1055 expect(projFolder.exists, isFalse);
778 return expect(filePaths, hasLength(0)); 1056 return expect(filePaths, hasLength(0));
779 }); 1057 });
780 } 1058 }
781 1059
1060 test_watch_deletePackagespec_fromRoot() {
1061 // prepare paths
1062 String root = '/root';
1063 String rootPubspec = '$root/.packages';
1064 String rootFile = '$root/root.dart';
1065 // create files
1066 resourceProvider.newFile(rootPubspec, '');
1067 resourceProvider.newFile(rootFile, 'library root;');
1068 // set roots
1069 manager.setRoots(<String>[root], <String>[], <String, String>{});
1070 manager.assertContextPaths([root]);
1071 manager.assertContextFiles(root, [rootFile]);
1072 // delete the pubspec
1073 resourceProvider.deleteFile(rootPubspec);
1074 return pumpEventQueue().then((_) {
1075 manager.assertContextPaths([root]);
1076 manager.assertContextFiles(root, [rootFile]);
1077 });
1078 }
1079
1080 test_watch_deletePackagespec_fromSubFolder() {
1081 // prepare paths
1082 String root = '/root';
1083 String rootFile = '$root/root.dart';
1084 String subProject = '$root/sub/aaa';
1085 String subPubspec = '$subProject/.packages';
1086 String subFile = '$subProject/bin/a.dart';
1087 // create files
1088 resourceProvider.newFile(subPubspec, '');
1089 resourceProvider.newFile(rootFile, 'library root;');
1090 resourceProvider.newFile(subFile, 'library a;');
1091 // set roots
1092 manager.setRoots(<String>[root], <String>[], <String, String>{});
1093 manager.assertContextPaths([root, subProject]);
1094 // verify files
1095 manager.assertContextFiles(root, [rootFile]);
1096 manager.assertContextFiles(subProject, [subFile]);
1097 // delete the pubspec
1098 resourceProvider.deleteFile(subPubspec);
1099 return pumpEventQueue().then((_) {
1100 manager.assertContextPaths([root]);
1101 manager.assertContextFiles(root, [rootFile, subFile]);
1102 });
1103 }
1104
1105 test_watch_deletePackagespec_fromSubFolder_withPubspec() {
1106 // prepare paths
1107 String root = '/root';
1108 String rootFile = '$root/root.dart';
1109 String subProject = '$root/sub/aaa';
1110 String subPackagespec = '$subProject/.packages';
1111 String subPubspec = '$subProject/pubspec.yaml';
1112 String subFile = '$subProject/bin/a.dart';
1113 // create files
1114 resourceProvider.newFile(subPackagespec, '');
1115 resourceProvider.newFile(subPubspec, 'pubspec');
1116 resourceProvider.newFile(rootFile, 'library root;');
1117 resourceProvider.newFile(subFile, 'library a;');
1118 // set roots
1119 manager.setRoots(<String>[root], <String>[], <String, String>{});
1120 manager.assertContextPaths([root, subProject]);
1121 // verify files
1122 manager.assertContextFiles(root, [rootFile]);
1123 manager.assertContextFiles(subProject, [subFile]);
1124 // delete the packagespec
1125 resourceProvider.deleteFile(subPackagespec);
1126 return pumpEventQueue().then((_) {
1127 // Should NOT merge
1128 manager.assertContextPaths([root, subProject]);
1129 manager.assertContextFiles(subProject, [subFile]);
1130 });
1131 }
1132
782 test_watch_deletePubspec_fromRoot() { 1133 test_watch_deletePubspec_fromRoot() {
783 // prepare paths 1134 // prepare paths
784 String root = '/root'; 1135 String root = '/root';
785 String rootPubspec = '$root/pubspec.yaml'; 1136 String rootPubspec = '$root/pubspec.yaml';
786 String rootFile = '$root/root.dart'; 1137 String rootFile = '$root/root.dart';
787 // create files 1138 // create files
788 resourceProvider.newFile(rootPubspec, 'pubspec'); 1139 resourceProvider.newFile(rootPubspec, 'pubspec');
789 resourceProvider.newFile(rootFile, 'library root;'); 1140 resourceProvider.newFile(rootFile, 'library root;');
790 // set roots 1141 // set roots
791 manager.setRoots(<String>[root], <String>[], <String, String>{}); 1142 manager.setRoots(<String>[root], <String>[], <String, String>{});
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 expect(filePaths, contains(filePath)); 1186 expect(filePaths, contains(filePath));
836 expect(filePaths[filePath], equals(manager.now)); 1187 expect(filePaths[filePath], equals(manager.now));
837 // update the file 1188 // update the file
838 manager.now++; 1189 manager.now++;
839 resourceProvider.modifyFile(filePath, 'new contents'); 1190 resourceProvider.modifyFile(filePath, 'new contents');
840 return pumpEventQueue().then((_) { 1191 return pumpEventQueue().then((_) {
841 return expect(filePaths[filePath], equals(manager.now)); 1192 return expect(filePaths[filePath], equals(manager.now));
842 }); 1193 });
843 } 1194 }
844 1195
1196 test_watch_modifyPackagespec() {
1197 String packagesPath = '$projPath/.packages';
1198 String filePath = '$projPath/bin/main.dart';
1199
1200 resourceProvider.newFile(packagesPath, '');
1201 resourceProvider.newFile(filePath, 'library main;');
1202
1203 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
1204
1205 Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
1206 expect(filePaths, hasLength(1));
1207 expect(filePaths, contains(filePath));
1208 Packages packages =
1209 manager.currentContextPackagespecs[projPath];
1210 expect(packages.packages, isEmpty);
1211
1212 // update .packages
1213 manager.now++;
1214 resourceProvider.modifyFile(packagesPath, 'main:./lib/');
1215 return pumpEventQueue().then((_) {
1216 // verify new package info
1217 packages = manager.currentContextPackagespecs[projPath];
1218 expect(packages.packages, unorderedEquals(['main']));
1219 });
1220 }
1221
845 test_watch_modifyPackageMapDependency() { 1222 test_watch_modifyPackageMapDependency() {
846 // create a dependency file 1223 // create a dependency file
847 String dependencyPath = posix.join(projPath, 'dep'); 1224 String dependencyPath = posix.join(projPath, 'dep');
848 resourceProvider.newFile(dependencyPath, 'contents'); 1225 resourceProvider.newFile(dependencyPath, 'contents');
849 packageMapProvider.dependencies.add(dependencyPath); 1226 packageMapProvider.dependencies.add(dependencyPath);
850 // create a Dart file 1227 // create a Dart file
851 String dartFilePath = posix.join(projPath, 'main.dart'); 1228 String dartFilePath = posix.join(projPath, 'main.dart');
852 resourceProvider.newFile(dartFilePath, 'contents'); 1229 resourceProvider.newFile(dartFilePath, 'contents');
853 // the created context has the expected empty package map 1230 // the created context has the expected empty package map
854 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 1231 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1006 */ 1383 */
1007 final Map<String, Set<Source>> currentContextSources = <String, Set<Source>>{ 1384 final Map<String, Set<Source>> currentContextSources = <String, Set<Source>>{
1008 }; 1385 };
1009 1386
1010 /** 1387 /**
1011 * Map from context to package URI resolver. 1388 * Map from context to package URI resolver.
1012 */ 1389 */
1013 final Map<String, UriResolver> currentContextPackageUriResolvers = 1390 final Map<String, UriResolver> currentContextPackageUriResolvers =
1014 <String, UriResolver>{}; 1391 <String, UriResolver>{};
1015 1392
1393 /**
1394 * Map from context to packages object.
1395 */
1396 final Map<String, Packages> currentContextPackagespecs = <String, Packages>{};
1397
1016 TestContextManager(MemoryResourceProvider resourceProvider, 1398 TestContextManager(MemoryResourceProvider resourceProvider,
1017 ResolverProvider packageResolverProvider, 1399 ResolverProvider packageResolverProvider,
1018 OptimizingPubPackageMapProvider packageMapProvider) 1400 OptimizingPubPackageMapProvider packageMapProvider)
1019 : super(resourceProvider, packageResolverProvider, packageMapProvider, 1401 : super(resourceProvider, packageResolverProvider, packageMapProvider,
1020 InstrumentationService.NULL_SERVICE); 1402 InstrumentationService.NULL_SERVICE);
1021 1403
1022 /** 1404 /**
1023 * Iterable of the paths to contexts that currently exist. 1405 * Iterable of the paths to contexts that currently exist.
1024 */ 1406 */
1025 Iterable<String> get currentContextPaths => currentContextTimestamps.keys; 1407 Iterable<String> get currentContextPaths => currentContextTimestamps.keys;
1026 1408
1027 @override 1409 @override
1028 AnalysisContext addContext(Folder folder, UriResolver packageUriResolver) { 1410 AnalysisContext addContext(
1411 Folder folder, UriResolver packageUriResolver, Packages packages) {
1029 String path = folder.path; 1412 String path = folder.path;
1030 expect(currentContextPaths, isNot(contains(path))); 1413 expect(currentContextPaths, isNot(contains(path)));
1031 currentContextTimestamps[path] = now; 1414 currentContextTimestamps[path] = now;
1032 currentContextFilePaths[path] = <String, int>{}; 1415 currentContextFilePaths[path] = <String, int>{};
1033 currentContextSources[path] = new HashSet<Source>(); 1416 currentContextSources[path] = new HashSet<Source>();
1034 currentContextPackageUriResolvers[path] = packageUriResolver; 1417 currentContextPackageUriResolvers[path] = packageUriResolver;
1418 currentContextPackagespecs[path] = packages;
1035 currentContext = AnalysisEngine.instance.createAnalysisContext(); 1419 currentContext = AnalysisEngine.instance.createAnalysisContext();
1036 currentContext.sourceFactory = new SourceFactory( 1420 List<UriResolver> resolvers = [new FileUriResolver()];
1037 packageUriResolver == null ? [] : [packageUriResolver]); 1421 if (packageUriResolver != null) {
1422 resolvers.add(packageUriResolver);
1423 }
1424 currentContext.sourceFactory = new SourceFactory(resolvers, packages);
1038 return currentContext; 1425 return currentContext;
1039 } 1426 }
1040 1427
1041 @override 1428 @override
1042 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) { 1429 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) {
1043 Map<String, int> filePaths = currentContextFilePaths[contextFolder.path]; 1430 Map<String, int> filePaths = currentContextFilePaths[contextFolder.path];
1044 Set<Source> sources = currentContextSources[contextFolder.path]; 1431 Set<Source> sources = currentContextSources[contextFolder.path];
1045 1432
1046 for (Source source in changeSet.addedSources) { 1433 for (Source source in changeSet.addedSources) {
1047 expect(filePaths, isNot(contains(source.fullName))); 1434 expect(filePaths, isNot(contains(source.fullName)));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 // Emacs creates dummy links to track the fact that a file is open for 1476 // Emacs creates dummy links to track the fact that a file is open for
1090 // editing and has unsaved changes (e.g. having unsaved changes to 1477 // editing and has unsaved changes (e.g. having unsaved changes to
1091 // 'foo.dart' causes a link '.#foo.dart' to be created, which points to the 1478 // 'foo.dart' causes a link '.#foo.dart' to be created, which points to the
1092 // non-existent file 'username@hostname.pid'. To avoid these dummy links 1479 // non-existent file 'username@hostname.pid'. To avoid these dummy links
1093 // causing the analyzer to thrash, just ignore links to non-existent files. 1480 // causing the analyzer to thrash, just ignore links to non-existent files.
1094 return file.exists; 1481 return file.exists;
1095 } 1482 }
1096 1483
1097 @override 1484 @override
1098 void updateContextPackageUriResolver( 1485 void updateContextPackageUriResolver(
1099 Folder contextFolder, UriResolver packageUriResolver) { 1486 Folder contextFolder, UriResolver packageUriResolver, Packages packages) {
1100 currentContextPackageUriResolvers[contextFolder.path] = packageUriResolver; 1487 currentContextPackageUriResolvers[contextFolder.path] = packageUriResolver;
1488 currentContextPackagespecs[contextFolder.path] = packages;
1101 } 1489 }
1102 } 1490 }
1103 1491
1104 /** 1492 /**
1105 * A [Source] that knows it's [fullName]. 1493 * A [Source] that knows it's [fullName].
1106 */ 1494 */
1107 class TestSource implements Source { 1495 class TestSource implements Source {
1108 TestSource(); 1496 TestSource();
1109 1497
1110 @override 1498 @override
1111 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); 1499 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
1112 } 1500 }
1113 1501
1114 class TestUriResolver extends UriResolver { 1502 class TestUriResolver extends UriResolver {
1115 Map<Uri, Source> uriMap; 1503 Map<Uri, Source> uriMap;
1116 1504
1117 TestUriResolver(this.uriMap); 1505 TestUriResolver(this.uriMap);
1118 1506
1119 @override 1507 @override
1120 Source resolveAbsolute(Uri uri) { 1508 Source resolveAbsolute(Uri uri) {
1121 return uriMap[uri]; 1509 return uriMap[uri];
1122 } 1510 }
1123 } 1511 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698