Chromium Code Reviews| Index: pkg/analysis_server/test/context_manager_test.dart |
| diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart |
| index 9f00603059afb09677b19d2e16d82423014378de..db85fcd6c5fe7cbaa2e8879a55f3c264f8bd96ed 100644 |
| --- a/pkg/analysis_server/test/context_manager_test.dart |
| +++ b/pkg/analysis_server/test/context_manager_test.dart |
| @@ -35,353 +35,166 @@ import 'utils.dart'; |
| main() { |
| initializeTestEnvironment(); |
| defineReflectiveTests(AbstractContextManagerTest); |
|
Brian Wilkerson
2016/05/12 18:47:48
Sorry about the mess here. What I did was split Ab
|
| + defineReflectiveTests(ContextManagerWithNewOptionsTest); |
| + defineReflectiveTests(ContextManagerWithOldOptionsTest); |
| } |
| @reflectiveTest |
| -class AbstractContextManagerTest { |
| - /** |
| - * The name of the 'bin' directory. |
| - */ |
| - static const String BIN_NAME = 'bin'; |
| - |
| - /** |
| - * The name of the 'example' directory. |
| - */ |
| - static const String EXAMPLE_NAME = 'example'; |
| - |
| - /** |
| - * The name of the 'lib' directory. |
| - */ |
| - static const String LIB_NAME = 'lib'; |
| - |
| - /** |
| - * The name of the 'src' directory. |
| - */ |
| - static const String SRC_NAME = 'src'; |
| - |
| - /** |
| - * The name of the 'test' directory. |
| - */ |
| - static const String TEST_NAME = 'test'; |
| - |
| - ContextManagerImpl manager; |
| - |
| - TestContextManagerCallbacks callbacks; |
| - |
| - MemoryResourceProvider resourceProvider; |
| - |
| - MockPackageMapProvider packageMapProvider; |
| - |
| - UriResolver packageResolver = null; |
| - |
| - UriResolver embeddedUriResolver = null; |
| - |
| - String projPath = '/my/proj'; |
| - |
| - AnalysisError missing_required_param = new AnalysisError( |
| - new TestSource(), 0, 1, HintCode.MISSING_REQUIRED_PARAM, [ |
| - ['x'] |
| - ]); |
| - |
| - AnalysisError missing_return = |
| - new AnalysisError(new TestSource(), 0, 1, HintCode.MISSING_RETURN, [ |
| - ['x'] |
| - ]); |
| - |
| - AnalysisError invalid_assignment_error = |
| - new AnalysisError(new TestSource(), 0, 1, HintCode.INVALID_ASSIGNMENT, [ |
| - ['x'], |
| - ['y'] |
| - ]); |
| - |
| - AnalysisError unused_local_variable = new AnalysisError( |
| - new TestSource(), 0, 1, HintCode.UNUSED_LOCAL_VARIABLE, [ |
| - ['x'] |
| - ]); |
| - |
| - List<Glob> get analysisFilesGlobs { |
| - List<String> patterns = <String>[ |
| - '**/*.${AnalysisEngine.SUFFIX_DART}', |
| - '**/*.${AnalysisEngine.SUFFIX_HTML}', |
| - '**/*.${AnalysisEngine.SUFFIX_HTM}', |
| - '**/${AnalysisEngine.ANALYSIS_OPTIONS_FILE}' |
| - ]; |
| - return patterns |
| - .map((pattern) => new Glob(JavaFile.pathContext.separator, pattern)) |
| - .toList(); |
| - } |
| - |
| - List<ErrorProcessor> get errorProcessors => callbacks.currentContext |
| - .getConfigurationData(CONFIGURED_ERROR_PROCESSORS); |
| - |
| - List<Linter> get lints => getLints(callbacks.currentContext); |
| - |
| - AnalysisOptions get options => callbacks.currentContext.analysisOptions; |
| - |
| - Map<String, List<Folder>> get _currentPackageMap => _packageMap(projPath); |
| - |
| - void deleteFile(List<String> pathComponents) { |
| - String filePath = posix.joinAll(pathComponents); |
| - resourceProvider.deleteFile(filePath); |
| - } |
| - |
| - ErrorProcessor getProcessor(AnalysisError error) => |
| - ErrorProcessor.getProcessor(callbacks.currentContext, error); |
| - |
| - String newFile(List<String> pathComponents, [String content = '']) { |
| - String filePath = posix.joinAll(pathComponents); |
| - resourceProvider.newFile(filePath, content); |
| - return filePath; |
| - } |
| - |
| - String newFolder(List<String> pathComponents) { |
| - String folderPath = posix.joinAll(pathComponents); |
| - resourceProvider.newFolder(folderPath); |
| - return folderPath; |
| - } |
| - |
| - void processRequiredPlugins() { |
| - List<Plugin> plugins = <Plugin>[]; |
| - plugins.addAll(AnalysisEngine.instance.requiredPlugins); |
| - plugins.add(AnalysisEngine.instance.commandLinePlugin); |
| - plugins.add(AnalysisEngine.instance.optionsPlugin); |
| - plugins.add(linterPlugin); |
| - ExtensionManager manager = new ExtensionManager(); |
| - manager.processPlugins(plugins); |
| +class AbstractContextManagerTest extends ContextManagerTest { |
| + void test_contextsInAnalysisRoot_nestedContext() { |
| + String subProjPath = posix.join(projPath, 'subproj'); |
| + Folder subProjFolder = resourceProvider.newFolder(subProjPath); |
| + resourceProvider.newFile( |
| + posix.join(subProjPath, 'pubspec.yaml'), 'contents'); |
| + String subProjFilePath = posix.join(subProjPath, 'file.dart'); |
| + resourceProvider.newFile(subProjFilePath, 'contents'); |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + // Make sure that there really are contexts for both the main project and |
| + // the subproject. |
| + Folder projFolder = resourceProvider.getFolder(projPath); |
| + ContextInfo projContextInfo = manager.getContextInfoFor(projFolder); |
| + expect(projContextInfo, isNotNull); |
| + expect(projContextInfo.folder, projFolder); |
| + ContextInfo subProjContextInfo = manager.getContextInfoFor(subProjFolder); |
| + expect(subProjContextInfo, isNotNull); |
| + expect(subProjContextInfo.folder, subProjFolder); |
| + expect(projContextInfo.context != subProjContextInfo.context, isTrue); |
| + // Check that contextsInAnalysisRoot() works. |
| + List<AnalysisContext> contexts = manager.contextsInAnalysisRoot(projFolder); |
| + expect(contexts, hasLength(2)); |
| + expect(contexts, contains(projContextInfo.context)); |
| + expect(contexts, contains(subProjContextInfo.context)); |
| } |
| - EmbedderUriResolver provideEmbeddedUriResolver(Folder folder) => |
| - embeddedUriResolver; |
| - |
| - UriResolver providePackageResolver(Folder folder) => packageResolver; |
| - |
| - void setUp() { |
| - processRequiredPlugins(); |
| - resourceProvider = new MemoryResourceProvider(); |
| - packageMapProvider = new MockPackageMapProvider(); |
| - DartSdkManager sdkManager = new DartSdkManager((_) { |
| - return new MockSdk(); |
| - }); |
| - manager = new ContextManagerImpl( |
| - resourceProvider, |
| - sdkManager, |
| - providePackageResolver, |
| - provideEmbeddedUriResolver, |
| - packageMapProvider, |
| - analysisFilesGlobs, |
| - InstrumentationService.NULL_SERVICE, |
| - new AnalysisOptionsImpl()); |
| - callbacks = new TestContextManagerCallbacks(resourceProvider); |
| - manager.callbacks = callbacks; |
| - resourceProvider.newFolder(projPath); |
| - } |
| + test_embedder_added() async { |
| + // Create files. |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + newFile([libPath, 'main.dart']); |
| + newFile([libPath, 'nope.dart']); |
| + String embedderPath = newFolder([projPath, 'embedder']); |
| + newFile([embedderPath, 'entry.dart']); |
| + String embedderSrcPath = newFolder([projPath, 'embedder', 'src']); |
| + newFile([embedderSrcPath, 'part.dart']); |
| - test_analysis_options_file_delete() async { |
| - // Setup .analysis_options |
| + // Setup _embedder.yaml. |
| newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| + [libPath, '_embedder.yaml'], |
| r''' |
| embedded_libs: |
| - "dart:foobar": "../sdk_ext/entry.dart" |
| -analyzer: |
| - language: |
| - enableGenericMethods: true |
| - errors: |
| - unused_local_variable: false |
| -linter: |
| - rules: |
| - - camel_case_types |
| -'''); |
| + "dart:foobar": "../embedder/entry.dart" |
| + "dart:typed_data": "../embedder/src/part" |
| + '''); |
| - // Setup context. |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - await pumpEventQueue(); |
| + Folder projectFolder = resourceProvider.newFolder(projPath); |
| - // Verify options were set. |
| - expect(errorProcessors, hasLength(1)); |
| - expect(lints, hasLength(1)); |
| - expect(options.enableGenericMethods, isTrue); |
| + // NOTE that this is Not in our package path yet. |
| - // Remove options. |
| - deleteFile([projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE]); |
| + // Setup context. |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| await pumpEventQueue(); |
| + // Confirm that one context was created. |
| + List<AnalysisContext> contexts = |
| + manager.contextsInAnalysisRoot(projectFolder); |
| + expect(contexts, isNotNull); |
| + expect(contexts, hasLength(1)); |
| - // Verify defaults restored. |
| - expect(errorProcessors, isEmpty); |
| - expect(lints, isEmpty); |
| - expect(options.enableGenericMethods, isFalse); |
| - } |
| - |
| - test_analysis_options_file_delete_with_embedder() async { |
| - // Setup _embedder.yaml. |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - newFile( |
| - [libPath, '_embedder.yaml'], |
| - r''' |
| -analyzer: |
| - strong-mode: true |
| - errors: |
| - missing_return: false |
| -linter: |
| - rules: |
| - - avoid_as |
| -'''); |
| + // No embedded libs yet. |
| + expect(contexts.first.sourceFactory.forUri('dart:typed_data'), isNull); |
| - // Setup .packages file |
| + // Add .packages file that introduces a dependency with embedded libs. |
| newFile( |
| [projPath, '.packages'], |
| r''' |
| test_pack:lib/'''); |
| - // Setup .analysis_options |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - language: |
| - enableGenericMethods: true |
| - errors: |
| - unused_local_variable: false |
| -linter: |
| - rules: |
| - - camel_case_types |
| -'''); |
| - |
| - // Setup context. |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| await pumpEventQueue(); |
| - // Verify options were set. |
| - expect(options.enableGenericMethods, isTrue); |
| - expect(options.strongMode, isTrue); |
| - expect(errorProcessors, hasLength(2)); |
| - expect(lints, hasLength(2)); |
| + contexts = manager.contextsInAnalysisRoot(projectFolder); |
| - // Remove options. |
| - deleteFile([projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE]); |
| - await pumpEventQueue(); |
| + // Confirm that we still have just one context. |
| + expect(contexts, isNotNull); |
| + expect(contexts, hasLength(1)); |
| - // Verify defaults restored. |
| - expect(options.enableGenericMethods, isFalse); |
| - expect(lints, hasLength(1)); |
| - expect(lints.first, new isInstanceOf<AvoidAs>()); |
| - expect(errorProcessors, hasLength(1)); |
| - expect(getProcessor(missing_return).severity, isNull); |
| + // Embedded lib should be defined now. |
| + expect(contexts.first.sourceFactory.forUri('dart:typed_data'), isNotNull); |
| } |
| - test_analysis_options_parse_failure() async { |
| + test_embedder_packagespec() async { |
| // Create files. |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| newFile([libPath, 'main.dart']); |
| + newFile([libPath, 'nope.dart']); |
| String sdkExtPath = newFolder([projPath, 'sdk_ext']); |
| newFile([sdkExtPath, 'entry.dart']); |
| String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']); |
| newFile([sdkExtSrcPath, 'part.dart']); |
| - // Setup analysis options file with ignore list. |
| - newFile( |
| - [projPath, '.analysis_options'], |
| - r''' |
| -; |
| -'''); |
| - // Setup context. |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - |
| - // No error means success. |
| - } |
| - |
| - test_configed_options() async { |
| - // Create files. |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - newFile([projPath, 'test', 'test.dart']); |
| + // Setup _embedder.yaml. |
| newFile( |
| - [projPath, 'pubspec.yaml'], |
| + [libPath, '_embedder.yaml'], |
| r''' |
| -dependencies: |
| - test_pack: any |
| -analyzer: |
| - configuration: test_pack/config |
| -'''); |
| - |
| +embedded_libs: |
| + "dart:foobar": "../sdk_ext/entry.dart" |
| + "dart:typed_data": "../sdk_ext/src/part" |
| + '''); |
| // Setup .packages file |
| newFile( |
| [projPath, '.packages'], |
| r''' |
| test_pack:lib/'''); |
| - |
| - // Setup config.yaml. |
| - newFile( |
| - [libPath, 'config', 'config.yaml'], |
| - r''' |
| -analyzer: |
| - strong-mode: true |
| - language: |
| - enableSuperMixins: true |
| - errors: |
| - missing_return: false |
| -linter: |
| - rules: |
| - - avoid_as |
| -'''); |
| - |
| - // Setup .analysis_options |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - exclude: |
| - - 'test/**' |
| - language: |
| - enableGenericMethods: true |
| - enableAsync: false |
| - errors: |
| - unused_local_variable: false |
| -linter: |
| - rules: |
| - - camel_case_types |
| -'''); |
| - |
| // Setup context. |
| + |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| await pumpEventQueue(); |
| - |
| // Confirm that one context was created. |
| var contexts = |
| manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| expect(contexts, isNotNull); |
| - expect(contexts, hasLength(1)); |
| - |
| - var context = contexts.first; |
| - |
| - // Verify options. |
| - // * from `config.yaml`: |
| - expect(context.analysisOptions.strongMode, isTrue); |
| - expect(context.analysisOptions.enableSuperMixins, isTrue); |
| - expect(context.analysisOptions.enableAsync, isFalse); |
| - // * from `.analysis_options`: |
| - expect(context.analysisOptions.enableGenericMethods, isTrue); |
| - |
| - // * verify tests are excluded |
| - expect(callbacks.currentContextFilePaths[projPath].keys, |
| - unorderedEquals(['/my/proj/.analysis_options'])); |
| - |
| - // Verify filter setup. |
| - expect(errorProcessors, hasLength(2)); |
| - |
| - // * (config.) |
| - expect(getProcessor(missing_return).severity, isNull); |
| + expect(contexts.length, equals(1)); |
| + var context = contexts[0]; |
| + var source = context.sourceFactory.forUri('dart:foobar'); |
| + expect(source, isNotNull); |
| + expect(source.fullName, |
| + '/my/proj/sdk_ext/entry.dart'.replaceAll('/', JavaFile.separator)); |
| + // We can't find dart:core because we didn't list it in our |
| + // embedded_libs map. |
| + expect(context.sourceFactory.forUri('dart:core'), isNull); |
| + // We can find dart:typed_data because we listed it in our |
| + // embedded_libs map. |
| + expect(context.sourceFactory.forUri('dart:typed_data'), isNotNull); |
| + } |
| - // * (options.) |
| - expect(getProcessor(unused_local_variable).severity, isNull); |
| + test_ignoreFilesInPackagesFolder() { |
| + // create a context with a pubspec.yaml file |
| + String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
| + resourceProvider.newFile(pubspecPath, 'pubspec'); |
| + // create a file in the "packages" folder |
| + String filePath1 = posix.join(projPath, 'packages', 'file1.dart'); |
| + resourceProvider.newFile(filePath1, 'contents'); |
| + // "packages" files are ignored initially |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + expect(callbacks.currentContextFilePaths[projPath], isEmpty); |
| + // "packages" files are ignored during watch |
| + String filePath2 = posix.join(projPath, 'packages', 'file2.dart'); |
| + resourceProvider.newFile(filePath2, 'contents'); |
| + return pumpEventQueue().then((_) { |
| + expect(callbacks.currentContextFilePaths[projPath], isEmpty); |
| + }); |
| + } |
| - // Verify lints. |
| - var lintNames = lints.map((lint) => lint.name); |
| - expect( |
| - lintNames, |
| - unorderedEquals( |
| - ['avoid_as' /* config */, 'camel_case_types' /* options */])); |
| + void test_isInAnalysisRoot_excluded() { |
| + // prepare paths |
| + String project = '/project'; |
| + String excludedFolder = '$project/excluded'; |
| + // set roots |
| + resourceProvider.newFolder(project); |
| + resourceProvider.newFolder(excludedFolder); |
| + manager.setRoots( |
| + <String>[project], <String>[excludedFolder], <String, String>{}); |
| + // verify |
| + expect(manager.isInAnalysisRoot('$excludedFolder/test.dart'), isFalse); |
| } |
| - void test_contextsInAnalysisRoot_nestedContext() { |
| + void test_isInAnalysisRoot_inNestedContext() { |
| String subProjPath = posix.join(projPath, 'subproj'); |
| Folder subProjFolder = resourceProvider.newFolder(subProjPath); |
| resourceProvider.newFile( |
| @@ -389,875 +202,734 @@ linter: |
| String subProjFilePath = posix.join(subProjPath, 'file.dart'); |
| resourceProvider.newFile(subProjFilePath, 'contents'); |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // Make sure that there really are contexts for both the main project and |
| - // the subproject. |
| - Folder projFolder = resourceProvider.getFolder(projPath); |
| - ContextInfo projContextInfo = manager.getContextInfoFor(projFolder); |
| - expect(projContextInfo, isNotNull); |
| - expect(projContextInfo.folder, projFolder); |
| + // Make sure that there really is a context for the subproject. |
| ContextInfo subProjContextInfo = manager.getContextInfoFor(subProjFolder); |
| expect(subProjContextInfo, isNotNull); |
| expect(subProjContextInfo.folder, subProjFolder); |
| - expect(projContextInfo.context != subProjContextInfo.context, isTrue); |
| - // Check that contextsInAnalysisRoot() works. |
| - List<AnalysisContext> contexts = manager.contextsInAnalysisRoot(projFolder); |
| - expect(contexts, hasLength(2)); |
| - expect(contexts, contains(projContextInfo.context)); |
| - expect(contexts, contains(subProjContextInfo.context)); |
| + // Check that isInAnalysisRoot() works. |
| + expect(manager.isInAnalysisRoot(subProjFilePath), isTrue); |
| } |
| - test_embedder_added() async { |
| - // Create files. |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - newFile([libPath, 'main.dart']); |
| - newFile([libPath, 'nope.dart']); |
| - String embedderPath = newFolder([projPath, 'embedder']); |
| - newFile([embedderPath, 'entry.dart']); |
| - String embedderSrcPath = newFolder([projPath, 'embedder', 'src']); |
| - newFile([embedderSrcPath, 'part.dart']); |
| - |
| - // Setup _embedder.yaml. |
| - newFile( |
| - [libPath, '_embedder.yaml'], |
| - r''' |
| -embedded_libs: |
| - "dart:foobar": "../embedder/entry.dart" |
| - "dart:typed_data": "../embedder/src/part" |
| - '''); |
| - |
| - Folder projectFolder = resourceProvider.newFolder(projPath); |
| - |
| - // NOTE that this is Not in our package path yet. |
| - |
| - // Setup context. |
| + void test_isInAnalysisRoot_inRoot() { |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - await pumpEventQueue(); |
| - // Confirm that one context was created. |
| - List<AnalysisContext> contexts = |
| - manager.contextsInAnalysisRoot(projectFolder); |
| - expect(contexts, isNotNull); |
| - expect(contexts, hasLength(1)); |
| - |
| - // No embedded libs yet. |
| - expect(contexts.first.sourceFactory.forUri('dart:typed_data'), isNull); |
| - |
| - // Add .packages file that introduces a dependency with embedded libs. |
| - newFile( |
| - [projPath, '.packages'], |
| - r''' |
| -test_pack:lib/'''); |
| - |
| - await pumpEventQueue(); |
| - |
| - contexts = manager.contextsInAnalysisRoot(projectFolder); |
| - |
| - // Confirm that we still have just one context. |
| - expect(contexts, isNotNull); |
| - expect(contexts, hasLength(1)); |
| + expect(manager.isInAnalysisRoot('$projPath/test.dart'), isTrue); |
| + } |
| - // Embedded lib should be defined now. |
| - expect(contexts.first.sourceFactory.forUri('dart:typed_data'), isNotNull); |
| + void test_isInAnalysisRoot_notInRoot() { |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + expect(manager.isInAnalysisRoot('/test.dart'), isFalse); |
| } |
| - test_embedder_and_configed_options() async { |
| - // Create files. |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| + test_path_filter() async { |
| + // Setup context. |
| + Folder root = resourceProvider.newFolder(projPath); |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + expect(callbacks.currentContextFilePaths[projPath], isEmpty); |
| + // Set ignore patterns for context. |
| + ContextInfo rootInfo = manager.getContextInfoFor(root); |
| + manager.setIgnorePatternsForContext( |
| + rootInfo, ['sdk_ext/**', 'lib/ignoreme.dart']); |
| + // Start creating files. |
| + newFile([projPath, ContextManagerImpl.PUBSPEC_NAME]); |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + newFile([libPath, 'main.dart']); |
| + newFile([libPath, 'ignoreme.dart']); |
| String sdkExtPath = newFolder([projPath, 'sdk_ext']); |
| - newFile([projPath, 'test', 'test.dart']); |
| newFile([sdkExtPath, 'entry.dart']); |
| + String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']); |
| + newFile([sdkExtSrcPath, 'part.dart']); |
| + // Pump event loop so new files are discovered and added to context. |
| + await pumpEventQueue(); |
| + // Verify that ignored files were ignored. |
| + Map<String, int> fileTimestamps = |
| + callbacks.currentContextFilePaths[projPath]; |
| + expect(fileTimestamps, isNotEmpty); |
| + List<String> files = fileTimestamps.keys.toList(); |
| + expect(files.length, equals(1)); |
| + expect(files[0], equals('/my/proj/lib/main.dart')); |
| + } |
| - // Setup pubspec with configuration. |
| - newFile( |
| - [projPath, 'pubspec.yaml'], |
| - r''' |
| -dependencies: |
| - test_pack: any |
| -analyzer: |
| - configuration: test_pack/config |
| -'''); |
| + test_refresh_folder_with_packagespec() { |
| + // create a context with a .packages file |
| + String packagespecFile = posix.join(projPath, '.packages'); |
| + resourceProvider.newFile(packagespecFile, ''); |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + return pumpEventQueue().then((_) { |
| + expect(callbacks.currentContextPaths.toList(), [projPath]); |
| + callbacks.now++; |
| + manager.refresh(null); |
| + return pumpEventQueue().then((_) { |
| + expect(callbacks.currentContextPaths.toList(), [projPath]); |
| + expect(callbacks.currentContextTimestamps[projPath], callbacks.now); |
| + }); |
| + }); |
| + } |
| - // Setup _embedder.yaml. |
| - newFile( |
| - [libPath, '_embedder.yaml'], |
| - r''' |
| -embedded_libs: |
| - "dart:foobar": "../sdk_ext/entry.dart" |
| -analyzer: |
| - strong-mode: true |
| - language: |
| - enableSuperMixins: true |
| - errors: |
| - missing_return: false |
| -linter: |
| - rules: |
| - - avoid_as |
| -'''); |
| - |
| - // Setup .packages file |
| - newFile( |
| - [projPath, '.packages'], |
| - r''' |
| -test_pack:lib/'''); |
| - |
| - // Setup .analysis_options |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - exclude: |
| - - 'test/**' |
| - language: |
| - enableGenericMethods: true |
| - enableAsync: false |
| - errors: |
| - unused_local_variable: false |
| -linter: |
| - rules: |
| - - camel_case_types |
| -'''); |
| - |
| - // Setup config.yaml. |
| - newFile( |
| - [libPath, 'config', 'config.yaml'], |
| - r''' |
| -analyzer: |
| - errors: |
| - missing_required_param: error |
| -linter: |
| - rules: |
| - - always_specify_types |
| -'''); |
| - |
| - // Setup context. |
| + // TODO(paulberry): This test only tests PackagesFileDisposition. |
| + // Once http://dartbug.com/23909 is fixed, add a test for sdk extensions |
| + // and PackageMapDisposition. |
| + test_refresh_folder_with_packagespec_subfolders() { |
| + // Create a folder with no .packages file, containing two subfolders with |
| + // .packages files. |
| + String subdir1Path = posix.join(projPath, 'subdir1'); |
| + String subdir2Path = posix.join(projPath, 'subdir2'); |
| + String packagespec1Path = posix.join(subdir1Path, '.packages'); |
| + String packagespec2Path = posix.join(subdir2Path, '.packages'); |
| + resourceProvider.newFile(packagespec1Path, ''); |
| + resourceProvider.newFile(packagespec2Path, ''); |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - await pumpEventQueue(); |
| - |
| - // Confirm that one context was created. |
| - var contexts = |
| - manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| - expect(contexts, isNotNull); |
| - expect(contexts, hasLength(1)); |
| - var context = contexts[0]; |
| - |
| - // Verify options. |
| - // * from `_embedder.yaml`: |
| - expect(context.analysisOptions.strongMode, isTrue); |
| - expect(context.analysisOptions.enableSuperMixins, isTrue); |
| - expect(context.analysisOptions.enableAsync, isFalse); |
| - // * from `.analysis_options`: |
| - expect(context.analysisOptions.enableGenericMethods, isTrue); |
| - |
| - // * verify tests are excluded |
| - expect( |
| - callbacks.currentContextFilePaths[projPath].keys, |
| - unorderedEquals( |
| - ['/my/proj/sdk_ext/entry.dart', '/my/proj/.analysis_options'])); |
| - |
| - // Verify filter setup. |
| - expect(errorProcessors, hasLength(3)); |
| - |
| - // * (embedder.) |
| - expect(getProcessor(missing_return).severity, isNull); |
| + return pumpEventQueue().then((_) { |
| + expect(callbacks.currentContextPaths.toSet(), |
| + [subdir1Path, subdir2Path, projPath].toSet()); |
| + callbacks.now++; |
| + manager.refresh(null); |
| + return pumpEventQueue().then((_) { |
| + expect(callbacks.currentContextPaths.toSet(), |
| + [subdir1Path, subdir2Path, projPath].toSet()); |
| + expect(callbacks.currentContextTimestamps[projPath], callbacks.now); |
| + expect(callbacks.currentContextTimestamps[subdir1Path], callbacks.now); |
| + expect(callbacks.currentContextTimestamps[subdir2Path], callbacks.now); |
| + }); |
| + }); |
| + } |
| - // * (config.) |
| - expect(getProcessor(missing_required_param).severity, ErrorSeverity.ERROR); |
| + test_refresh_folder_with_pubspec() { |
| + // create a context with a pubspec.yaml file |
| + String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
| + resourceProvider.newFile(pubspecPath, 'pubspec'); |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + return pumpEventQueue().then((_) { |
| + expect(callbacks.currentContextPaths.toList(), [projPath]); |
| + callbacks.now++; |
| + manager.refresh(null); |
| + return pumpEventQueue().then((_) { |
| + expect(callbacks.currentContextPaths.toList(), [projPath]); |
| + expect(callbacks.currentContextTimestamps[projPath], callbacks.now); |
| + }); |
| + }); |
| + } |
| - // * (options.) |
| - expect(getProcessor(unused_local_variable).severity, isNull); |
| + test_refresh_folder_with_pubspec_subfolders() { |
| + // Create a folder with no pubspec.yaml, containing two subfolders with |
| + // pubspec.yaml files. |
| + String subdir1Path = posix.join(projPath, 'subdir1'); |
| + String subdir2Path = posix.join(projPath, 'subdir2'); |
| + String pubspec1Path = posix.join(subdir1Path, 'pubspec.yaml'); |
| + String pubspec2Path = posix.join(subdir2Path, 'pubspec.yaml'); |
| + resourceProvider.newFile(pubspec1Path, 'pubspec'); |
| + resourceProvider.newFile(pubspec2Path, 'pubspec'); |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + return pumpEventQueue().then((_) { |
| + expect(callbacks.currentContextPaths.toSet(), |
| + [subdir1Path, subdir2Path, projPath].toSet()); |
| + callbacks.now++; |
| + manager.refresh(null); |
| + return pumpEventQueue().then((_) { |
| + expect(callbacks.currentContextPaths.toSet(), |
| + [subdir1Path, subdir2Path, projPath].toSet()); |
| + expect(callbacks.currentContextTimestamps[projPath], callbacks.now); |
| + expect(callbacks.currentContextTimestamps[subdir1Path], callbacks.now); |
| + expect(callbacks.currentContextTimestamps[subdir2Path], callbacks.now); |
| + }); |
| + }); |
| + } |
| - // Verify lints. |
| - var lintNames = lints.map((lint) => lint.name); |
| + test_refresh_oneContext() { |
| + // create two contexts with pubspec.yaml files |
| + String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
| + resourceProvider.newFile(pubspecPath, 'pubspec1'); |
| - expect( |
| - lintNames, |
| - unorderedEquals([ |
| - 'avoid_as' /* embedder */, |
| - 'always_specify_types' /* config*/, |
| - 'camel_case_types' /* options */ |
| - ])); |
| + String proj2Path = '/my/proj2'; |
| + resourceProvider.newFolder(proj2Path); |
| + String pubspec2Path = posix.join(proj2Path, 'pubspec.yaml'); |
| + resourceProvider.newFile(pubspec2Path, 'pubspec2'); |
| - // Sanity check embedder libs. |
| - var source = context.sourceFactory.forUri('dart:foobar'); |
| - expect(source, isNotNull); |
| - expect(source.fullName, |
| - '/my/proj/sdk_ext/entry.dart'.replaceAll('/', JavaFile.separator)); |
| + List<String> roots = <String>[projPath, proj2Path]; |
| + manager.setRoots(roots, <String>[], <String, String>{}); |
| + return pumpEventQueue().then((_) { |
| + expect(callbacks.currentContextPaths.toList(), unorderedEquals(roots)); |
| + int then = callbacks.now; |
| + callbacks.now++; |
| + manager.refresh([resourceProvider.getResource(proj2Path)]); |
| + return pumpEventQueue().then((_) { |
| + expect(callbacks.currentContextPaths.toList(), unorderedEquals(roots)); |
| + expect(callbacks.currentContextTimestamps[projPath], then); |
| + expect(callbacks.currentContextTimestamps[proj2Path], callbacks.now); |
| + }); |
| + }); |
| } |
| - test_embedder_options() async { |
| + test_sdk_ext_packagespec() async { |
| // Create files. |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + newFile([libPath, 'main.dart']); |
| + newFile([libPath, 'nope.dart']); |
| String sdkExtPath = newFolder([projPath, 'sdk_ext']); |
| - newFile([projPath, 'test', 'test.dart']); |
| newFile([sdkExtPath, 'entry.dart']); |
| - // Setup _embedder.yaml. |
| + String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']); |
| + newFile([sdkExtSrcPath, 'part.dart']); |
| + // Setup sdk extension mapping. |
| newFile( |
| - [libPath, '_embedder.yaml'], |
| + [libPath, '_sdkext'], |
| r''' |
| -embedded_libs: |
| +{ |
| "dart:foobar": "../sdk_ext/entry.dart" |
| -analyzer: |
| - strong-mode: true |
| - language: |
| - enableSuperMixins: true |
| - errors: |
| - missing_return: false |
| -linter: |
| - rules: |
| - - avoid_as |
| +} |
| '''); |
| // Setup .packages file |
| newFile( |
| [projPath, '.packages'], |
| r''' |
| test_pack:lib/'''); |
| - |
| - // Setup .analysis_options |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - exclude: |
| - - 'test/**' |
| - language: |
| - enableGenericMethods: true |
| - enableAsync: false |
| - errors: |
| - unused_local_variable: false |
| -linter: |
| - rules: |
| - - camel_case_types |
| -'''); |
| - |
| // Setup context. |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - await pumpEventQueue(); |
| - |
| // Confirm that one context was created. |
| var contexts = |
| manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| expect(contexts, isNotNull); |
| - expect(contexts, hasLength(1)); |
| + expect(contexts.length, equals(1)); |
| var context = contexts[0]; |
| - |
| - // Verify options. |
| - // * from `_embedder.yaml`: |
| - expect(context.analysisOptions.strongMode, isTrue); |
| - expect(context.analysisOptions.enableSuperMixins, isTrue); |
| - expect(context.analysisOptions.enableAsync, isFalse); |
| - // * from `.analysis_options`: |
| - expect(context.analysisOptions.enableGenericMethods, isTrue); |
| - |
| - // * verify tests are excluded |
| - expect( |
| - callbacks.currentContextFilePaths[projPath].keys, |
| - unorderedEquals( |
| - ['/my/proj/sdk_ext/entry.dart', '/my/proj/.analysis_options'])); |
| - |
| - // Verify filter setup. |
| - expect(errorProcessors, hasLength(2)); |
| - |
| - // * (embedder.) |
| - expect(getProcessor(missing_return).severity, isNull); |
| - |
| - // * (options.) |
| - expect(getProcessor(unused_local_variable).severity, isNull); |
| - |
| - // Verify lints. |
| - var lintNames = lints.map((lint) => lint.name); |
| - |
| - expect( |
| - lintNames, |
| - unorderedEquals( |
| - ['avoid_as' /* embedder */, 'camel_case_types' /* options */])); |
| - |
| - // Sanity check embedder libs. |
| var source = context.sourceFactory.forUri('dart:foobar'); |
| - expect(source, isNotNull); |
| - expect(source.fullName, |
| - '/my/proj/sdk_ext/entry.dart'.replaceAll('/', JavaFile.separator)); |
| + expect(source.fullName, equals('/my/proj/sdk_ext/entry.dart')); |
| } |
| - test_embedder_packagespec() async { |
| - // Create files. |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - newFile([libPath, 'main.dart']); |
| - newFile([libPath, 'nope.dart']); |
| - String sdkExtPath = newFolder([projPath, 'sdk_ext']); |
| - newFile([sdkExtPath, 'entry.dart']); |
| - String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']); |
| - newFile([sdkExtSrcPath, 'part.dart']); |
| - // Setup _embedder.yaml. |
| - newFile( |
| - [libPath, '_embedder.yaml'], |
| - r''' |
| -embedded_libs: |
| - "dart:foobar": "../sdk_ext/entry.dart" |
| - "dart:typed_data": "../sdk_ext/src/part" |
| - '''); |
| - // Setup .packages file |
| - newFile( |
| - [projPath, '.packages'], |
| - r''' |
| -test_pack:lib/'''); |
| - // Setup context. |
| - |
| + void test_setRoots_addFolderWithDartFile() { |
| + String filePath = posix.join(projPath, 'foo.dart'); |
| + resourceProvider.newFile(filePath, 'contents'); |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - await pumpEventQueue(); |
| - // Confirm that one context was created. |
| - var contexts = |
| + // verify |
| + var filePaths = callbacks.currentContextFilePaths[projPath]; |
| + expect(filePaths, hasLength(1)); |
| + expect(filePaths, contains(filePath)); |
| + List<AnalysisContext> contextsInAnalysisRoot = |
| manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| - expect(contexts, isNotNull); |
| - expect(contexts.length, equals(1)); |
| - var context = contexts[0]; |
| - var source = context.sourceFactory.forUri('dart:foobar'); |
| - expect(source, isNotNull); |
| - expect(source.fullName, |
| - '/my/proj/sdk_ext/entry.dart'.replaceAll('/', JavaFile.separator)); |
| - // We can't find dart:core because we didn't list it in our |
| - // embedded_libs map. |
| - expect(context.sourceFactory.forUri('dart:core'), isNull); |
| - // We can find dart:typed_data because we listed it in our |
| - // embedded_libs map. |
| - expect(context.sourceFactory.forUri('dart:typed_data'), isNotNull); |
| + expect(contextsInAnalysisRoot, hasLength(1)); |
| + AnalysisContext context = contextsInAnalysisRoot[0]; |
| + expect(context, isNotNull); |
| + Source result = context.sourceFactory.forUri('package:foo/foo.dart'); |
| + expect(result, isNotNull); |
| + expect(result.exists(), isFalse); |
| } |
| - test_error_filter_analysis_option() async { |
| - // Create files. |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - errors: |
| - unused_local_variable: ignore |
| -'''); |
| - // Setup context. |
| + void test_setRoots_addFolderWithDartFileInSubfolder() { |
| + String filePath = posix.join(projPath, 'foo', 'bar.dart'); |
| + resourceProvider.newFile(filePath, 'contents'); |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - |
| - // Verify filter setup. |
| - expect(errorProcessors, hasLength(1)); |
| - expect(getProcessor(unused_local_variable).severity, isNull); |
| + // verify |
| + var filePaths = callbacks.currentContextFilePaths[projPath]; |
| + expect(filePaths, hasLength(1)); |
| + expect(filePaths, contains(filePath)); |
| } |
| - test_error_filter_analysis_option_multiple_filters() async { |
| - // Create files. |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - errors: |
| - invalid_assignment: ignore |
| - unused_local_variable: error |
| -'''); |
| - // Setup context. |
| + void test_setRoots_addFolderWithDummyLink() { |
| + String filePath = posix.join(projPath, 'foo.dart'); |
| + resourceProvider.newDummyLink(filePath); |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + // verify |
| + var filePaths = callbacks.currentContextFilePaths[projPath]; |
| + expect(filePaths, isEmpty); |
| + } |
| - // Verify filter setup. |
| - expect(errorProcessors, hasLength(2)); |
| + void test_setRoots_addFolderWithNestedPackageSpec() { |
| + String examplePath = newFolder([projPath, ContextManagerTest.EXAMPLE_NAME]); |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| - expect(getProcessor(invalid_assignment_error).severity, isNull); |
| - expect(getProcessor(unused_local_variable).severity, ErrorSeverity.ERROR); |
| - } |
| + newFile([projPath, ContextManagerImpl.PACKAGE_SPEC_NAME]); |
| + newFile([libPath, 'main.dart']); |
| + newFile([examplePath, ContextManagerImpl.PACKAGE_SPEC_NAME]); |
| + newFile([examplePath, 'example.dart']); |
| + |
| + packageMapProvider.packageMap['proj'] = [ |
| + resourceProvider.getResource(libPath) |
| + ]; |
| - test_error_filter_analysis_option_synonyms() async { |
| - // Create files. |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - errors: |
| - unused_local_variable: ignore |
| - ambiguous_import: false |
| -'''); |
| - // Setup context. |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // Verify filter setup. |
| - expect(errorProcessors, isNotNull); |
| - expect(errorProcessors, hasLength(2)); |
| + expect(callbacks.currentContextPaths, hasLength(2)); |
| + |
| + expect(callbacks.currentContextPaths, contains(projPath)); |
| + Set<Source> projSources = callbacks.currentContextSources[projPath]; |
| + expect(projSources, hasLength(1)); |
| + expect(projSources.first.uri.toString(), 'file:///my/proj/lib/main.dart'); |
| + |
| + expect(callbacks.currentContextPaths, contains(examplePath)); |
| + Set<Source> exampleSources = callbacks.currentContextSources[examplePath]; |
| + expect(exampleSources, hasLength(1)); |
| + expect(exampleSources.first.uri.toString(), |
| + 'file:///my/proj/example/example.dart'); |
| } |
| - test_error_filter_analysis_option_unpsecified() async { |
| - // Create files. |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| -# errors: |
| -# unused_local_variable: ignore |
| -'''); |
| - // Setup context. |
| + void test_setRoots_addFolderWithNestedPubspec() { |
| + String examplePath = newFolder([projPath, ContextManagerTest.EXAMPLE_NAME]); |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + |
| + newFile([projPath, ContextManagerImpl.PUBSPEC_NAME]); |
| + newFile([libPath, 'main.dart']); |
| + newFile([examplePath, ContextManagerImpl.PUBSPEC_NAME]); |
| + newFile([examplePath, 'example.dart']); |
| + |
| + packageMapProvider.packageMap['proj'] = [ |
| + resourceProvider.getResource(libPath) |
| + ]; |
| + |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // Verify filter setup. |
| - expect(errorProcessors, isEmpty); |
| + expect(callbacks.currentContextPaths, hasLength(2)); |
| + |
| + expect(callbacks.currentContextPaths, contains(projPath)); |
| + Set<Source> projSources = callbacks.currentContextSources[projPath]; |
| + expect(projSources, hasLength(1)); |
| + expect(projSources.first.uri.toString(), 'package:proj/main.dart'); |
| + |
| + expect(callbacks.currentContextPaths, contains(examplePath)); |
| + Set<Source> exampleSources = callbacks.currentContextSources[examplePath]; |
| + expect(exampleSources, hasLength(1)); |
| + expect(exampleSources.first.uri.toString(), |
| + 'file:///my/proj/example/example.dart'); |
| } |
| - test_ignoreFilesInPackagesFolder() { |
| - // create a context with a pubspec.yaml file |
| - String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
| - resourceProvider.newFile(pubspecPath, 'pubspec'); |
| - // create a file in the "packages" folder |
| - String filePath1 = posix.join(projPath, 'packages', 'file1.dart'); |
| - resourceProvider.newFile(filePath1, 'contents'); |
| - // "packages" files are ignored initially |
| + void test_setRoots_addFolderWithoutPubspec() { |
| + packageMapProvider.packageMap = null; |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - expect(callbacks.currentContextFilePaths[projPath], isEmpty); |
| - // "packages" files are ignored during watch |
| - String filePath2 = posix.join(projPath, 'packages', 'file2.dart'); |
| - resourceProvider.newFile(filePath2, 'contents'); |
| - return pumpEventQueue().then((_) { |
| - expect(callbacks.currentContextFilePaths[projPath], isEmpty); |
| - }); |
| + // verify |
| + expect(callbacks.currentContextPaths, hasLength(1)); |
| + expect(callbacks.currentContextPaths, contains(projPath)); |
| + expect(callbacks.currentContextFilePaths[projPath], hasLength(0)); |
| } |
| - void test_isInAnalysisRoot_excluded() { |
| - // prepare paths |
| - String project = '/project'; |
| - String excludedFolder = '$project/excluded'; |
| - // set roots |
| - resourceProvider.newFolder(project); |
| - resourceProvider.newFolder(excludedFolder); |
| - manager.setRoots( |
| - <String>[project], <String>[excludedFolder], <String, String>{}); |
| + void test_setRoots_addFolderWithPackagespec() { |
| + String packagespecPath = posix.join(projPath, '.packages'); |
| + resourceProvider.newFile(packagespecPath, |
| + 'unittest:file:///home/somebody/.pub/cache/unittest-0.9.9/lib/'); |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + File mainFile = |
| + resourceProvider.newFile(posix.join(libPath, 'main.dart'), ''); |
| + Source source = mainFile.createSource(); |
| + |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + |
| // verify |
| - expect(manager.isInAnalysisRoot('$excludedFolder/test.dart'), isFalse); |
| + expect(callbacks.currentContextPaths, hasLength(1)); |
| + expect(callbacks.currentContextPaths, contains(projPath)); |
| + expect(callbacks.currentContextFilePaths[projPath], hasLength(1)); |
| + |
| + // smoketest resolution |
| + SourceFactory sourceFactory = callbacks.currentContext.sourceFactory; |
| + Source resolvedSource = |
| + sourceFactory.resolveUri(source, 'package:unittest/unittest.dart'); |
| + expect(resolvedSource, isNotNull); |
| + expect(resolvedSource.fullName, |
| + equals('/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart')); |
| } |
| - void test_isInAnalysisRoot_inNestedContext() { |
| - String subProjPath = posix.join(projPath, 'subproj'); |
| - Folder subProjFolder = resourceProvider.newFolder(subProjPath); |
| - resourceProvider.newFile( |
| - posix.join(subProjPath, 'pubspec.yaml'), 'contents'); |
| - String subProjFilePath = posix.join(subProjPath, 'file.dart'); |
| - resourceProvider.newFile(subProjFilePath, 'contents'); |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // Make sure that there really is a context for the subproject. |
| - ContextInfo subProjContextInfo = manager.getContextInfoFor(subProjFolder); |
| - expect(subProjContextInfo, isNotNull); |
| - expect(subProjContextInfo.folder, subProjFolder); |
| - // Check that isInAnalysisRoot() works. |
| - expect(manager.isInAnalysisRoot(subProjFilePath), isTrue); |
| + void test_setRoots_addFolderWithPackagespecAndPackageRoot() { |
| + // The package root should take priority. |
| + String packagespecPath = posix.join(projPath, '.packages'); |
| + resourceProvider.newFile(packagespecPath, |
| + 'unittest:file:///home/somebody/.pub/cache/unittest-0.9.9/lib/'); |
| + String packageRootPath = '/package/root/'; |
| + manager.setRoots(<String>[projPath], <String>[], |
| + <String, String>{projPath: packageRootPath}); |
| + expect(callbacks.currentContextPaths, hasLength(1)); |
| + expect(callbacks.currentContextPaths, contains(projPath)); |
| + _checkPackageRoot(projPath, packageRootPath); |
| } |
| - void test_isInAnalysisRoot_inRoot() { |
| + void test_setRoots_addFolderWithPubspec() { |
| + String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
| + resourceProvider.newFile(pubspecPath, 'pubspec'); |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - expect(manager.isInAnalysisRoot('$projPath/test.dart'), isTrue); |
| + // verify |
| + expect(callbacks.currentContextPaths, hasLength(1)); |
| + expect(callbacks.currentContextPaths, contains(projPath)); |
| + expect(callbacks.currentContextFilePaths[projPath], hasLength(0)); |
| } |
| - void test_isInAnalysisRoot_notInRoot() { |
| + void test_setRoots_addFolderWithPubspec_andPackagespec() { |
| + String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
| + String packagespecPath = posix.join(projPath, '.packages'); |
| + resourceProvider.newFile(pubspecPath, 'pubspec'); |
| + resourceProvider.newFile(packagespecPath, ''); |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - expect(manager.isInAnalysisRoot('/test.dart'), isFalse); |
| + // verify |
| + callbacks.assertContextPaths([projPath]); |
| } |
| - test_path_filter() async { |
| - // Setup context. |
| - Folder root = resourceProvider.newFolder(projPath); |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - expect(callbacks.currentContextFilePaths[projPath], isEmpty); |
| - // Set ignore patterns for context. |
| - ContextInfo rootInfo = manager.getContextInfoFor(root); |
| - manager.setIgnorePatternsForContext( |
| - rootInfo, ['sdk_ext/**', 'lib/ignoreme.dart']); |
| - // Start creating files. |
| + void test_setRoots_addFolderWithPubspecAndLib() { |
| + String binPath = newFolder([projPath, ContextManagerTest.BIN_NAME]); |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + String srcPath = newFolder([libPath, ContextManagerTest.SRC_NAME]); |
| + String testPath = newFolder([projPath, ContextManagerTest.TEST_NAME]); |
| + |
| newFile([projPath, ContextManagerImpl.PUBSPEC_NAME]); |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| + String appPath = newFile([binPath, 'app.dart']); |
| newFile([libPath, 'main.dart']); |
| - newFile([libPath, 'ignoreme.dart']); |
| - String sdkExtPath = newFolder([projPath, 'sdk_ext']); |
| - newFile([sdkExtPath, 'entry.dart']); |
| - String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']); |
| - newFile([sdkExtSrcPath, 'part.dart']); |
| - // Pump event loop so new files are discovered and added to context. |
| - await pumpEventQueue(); |
| - // Verify that ignored files were ignored. |
| - Map<String, int> fileTimestamps = |
| - callbacks.currentContextFilePaths[projPath]; |
| - expect(fileTimestamps, isNotEmpty); |
| - List<String> files = fileTimestamps.keys.toList(); |
| - expect(files.length, equals(1)); |
| - expect(files[0], equals('/my/proj/lib/main.dart')); |
| - } |
| + newFile([srcPath, 'internal.dart']); |
| + String testFilePath = newFile([testPath, 'main_test.dart']); |
| - test_path_filter_analysis_option() async { |
| - // Create files. |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - newFile([libPath, 'main.dart']); |
| - newFile([libPath, 'nope.dart']); |
| - String sdkExtPath = newFolder([projPath, 'sdk_ext']); |
| - newFile([sdkExtPath, 'entry.dart']); |
| - String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']); |
| - newFile([sdkExtSrcPath, 'part.dart']); |
| - // Setup analysis options file with ignore list. |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - exclude: |
| - - lib/nope.dart |
| - - 'sdk_ext/**' |
| -'''); |
| - // Setup context. |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // Verify that analysis options was parsed and the ignore patterns applied. |
| - Map<String, int> fileTimestamps = |
| - callbacks.currentContextFilePaths[projPath]; |
| - expect(fileTimestamps, isNotEmpty); |
| - List<String> files = fileTimestamps.keys.toList(); |
| - expect( |
| - files, |
| - unorderedEquals( |
| - ['/my/proj/lib/main.dart', '/my/proj/.analysis_options'])); |
| - } |
| + packageMapProvider.packageMap['proj'] = [ |
| + resourceProvider.getResource(libPath) |
| + ]; |
| - test_path_filter_child_contexts_option() async { |
| - // Create files. |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - newFile([libPath, 'main.dart']); |
| - newFile( |
| - [libPath, 'pubspec.yaml'], |
| - r''' |
| -name: foobar |
| -'''); |
| - String otherLibPath = newFolder([projPath, 'other_lib']); |
| - newFile([otherLibPath, 'entry.dart']); |
| - newFile( |
| - [otherLibPath, 'pubspec.yaml'], |
| - r''' |
| -name: other_lib |
| -'''); |
| - // Setup analysis options file with ignore list that ignores the 'other_lib' |
| - // directory by name. |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - exclude: |
| - - 'other_lib' |
| -'''); |
| - // Setup context. |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // Verify that the context in other_lib wasn't created and that the |
| - // context in lib was created. |
| - var contexts = |
| - manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| - expect(contexts.length, 2); |
| - expect(contexts[0].name, equals('/my/proj')); |
| - expect(contexts[1].name, equals('/my/proj/lib')); |
| + Set<Source> sources = callbacks.currentContextSources[projPath]; |
| + |
| + expect(callbacks.currentContextPaths, hasLength(1)); |
| + expect(callbacks.currentContextPaths, contains(projPath)); |
| + expect(sources, hasLength(4)); |
| + List<String> uris = |
| + sources.map((Source source) => source.uri.toString()).toList(); |
| + expect(uris, contains('file://$appPath')); |
| + expect(uris, contains('package:proj/main.dart')); |
| + expect(uris, contains('package:proj/src/internal.dart')); |
| + expect(uris, contains('file://$testFilePath')); |
| } |
| - test_path_filter_recursive_wildcard_child_contexts_option() async { |
| - // Create files. |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - newFile([libPath, 'main.dart']); |
| - newFile( |
| - [libPath, 'pubspec.yaml'], |
| - r''' |
| - name: foobar |
| - '''); |
| - String otherLibPath = newFolder([projPath, 'other_lib']); |
| - newFile([otherLibPath, 'entry.dart']); |
| - newFile( |
| - [otherLibPath, 'pubspec.yaml'], |
| - r''' |
| - name: other_lib |
| - '''); |
| - // Setup analysis options file with ignore list that ignores 'other_lib' |
| - // and all descendants. |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - exclude: |
| - - 'other_lib/**' |
| - '''); |
| - // Setup context. |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // Verify that the context in other_lib wasn't created and that the |
| - // context in lib was created. |
| - var contexts = |
| - manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| - expect(contexts.length, 2); |
| - expect(contexts[0].name, equals('/my/proj')); |
| - expect(contexts[1].name, equals('/my/proj/lib')); |
| + void test_setRoots_addFolderWithPubspecAndPackagespecFolders() { |
| + // prepare paths |
| + String root = '/root'; |
| + String rootFile = '$root/root.dart'; |
| + String subProjectA = '$root/sub/aaa'; |
| + String subProjectB = '$root/sub/sub2/bbb'; |
| + String subProjectA_file = '$subProjectA/bin/a.dart'; |
| + String subProjectB_file = '$subProjectB/bin/b.dart'; |
| + // create files |
| + resourceProvider.newFile('$subProjectA/pubspec.yaml', 'pubspec'); |
| + resourceProvider.newFile('$subProjectB/pubspec.yaml', 'pubspec'); |
| + resourceProvider.newFile('$subProjectA/.packages', ''); |
| + resourceProvider.newFile('$subProjectB/.packages', ''); |
| + |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + resourceProvider.newFile(subProjectA_file, 'library a;'); |
| + resourceProvider.newFile(subProjectB_file, 'library b;'); |
| + |
| + // set roots |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root, subProjectA, subProjectB]); |
| + // verify files |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProjectA, [subProjectA_file]); |
| + callbacks.assertContextFiles(subProjectB, [subProjectB_file]); |
| } |
| - test_path_filter_wildcard_child_contexts_option() async { |
| - // Create files. |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - newFile([libPath, 'main.dart']); |
| - newFile( |
| - [libPath, 'pubspec.yaml'], |
| - r''' |
| -name: foobar |
| -'''); |
| - String otherLibPath = newFolder([projPath, 'other_lib']); |
| - newFile([otherLibPath, 'entry.dart']); |
| - newFile( |
| - [otherLibPath, 'pubspec.yaml'], |
| - r''' |
| -name: other_lib |
| -'''); |
| - // Setup analysis options file with ignore list that ignores 'other_lib' |
| - // and all immediate children. |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - exclude: |
| - - 'other_lib/*' |
| -'''); |
| - // Setup context. |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // Verify that the context in other_lib wasn't created and that the |
| - // context in lib was created. |
| - var contexts = |
| - manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| - expect(contexts.length, 2); |
| - expect(contexts[0].name, equals('/my/proj')); |
| - expect(contexts[1].name, equals('/my/proj/lib')); |
| + void test_setRoots_addFolderWithPubspecFolders() { |
| + // prepare paths |
| + String root = '/root'; |
| + String rootFile = '$root/root.dart'; |
| + String subProjectA = '$root/sub/aaa'; |
| + String subProjectB = '$root/sub/sub2/bbb'; |
| + String subProjectA_file = '$subProjectA/bin/a.dart'; |
| + String subProjectB_file = '$subProjectB/bin/b.dart'; |
| + // create files |
| + resourceProvider.newFile('$subProjectA/pubspec.yaml', 'pubspec'); |
| + resourceProvider.newFile('$subProjectB/pubspec.yaml', 'pubspec'); |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + resourceProvider.newFile(subProjectA_file, 'library a;'); |
| + resourceProvider.newFile(subProjectB_file, 'library b;'); |
| + // configure package maps |
| + packageMapProvider.packageMaps = { |
| + subProjectA: { |
| + 'foo': [resourceProvider.newFolder('/package/foo')] |
| + }, |
| + subProjectB: { |
| + 'bar': [resourceProvider.newFolder('/package/bar')] |
| + }, |
| + }; |
| + // set roots |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root, subProjectA, subProjectB]); |
| + // verify files |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProjectA, [subProjectA_file]); |
| + callbacks.assertContextFiles(subProjectB, [subProjectB_file]); |
| + // verify package maps |
| + expect(_packageMap(root), isNull); |
| + expect(_packageMap(subProjectA), |
| + equals(packageMapProvider.packageMaps[subProjectA])); |
| + expect(_packageMap(subProjectB), |
| + equals(packageMapProvider.packageMaps[subProjectB])); |
| } |
| - test_refresh_folder_with_packagespec() { |
| - // create a context with a .packages file |
| - String packagespecFile = posix.join(projPath, '.packages'); |
| - resourceProvider.newFile(packagespecFile, ''); |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - return pumpEventQueue().then((_) { |
| - expect(callbacks.currentContextPaths.toList(), [projPath]); |
| - callbacks.now++; |
| - manager.refresh(null); |
| - return pumpEventQueue().then((_) { |
| - expect(callbacks.currentContextPaths.toList(), [projPath]); |
| - expect(callbacks.currentContextTimestamps[projPath], callbacks.now); |
| - }); |
| - }); |
| + void test_setRoots_addPackageRoot() { |
| + String packagePathFoo = '/package1/foo'; |
| + String packageRootPath = '/package2/foo'; |
| + Folder packageFolder = resourceProvider.newFolder(packagePathFoo); |
| + packageMapProvider.packageMap = { |
| + 'foo': [packageFolder] |
| + }; |
| + List<String> includedPaths = <String>[projPath]; |
| + List<String> excludedPaths = <String>[]; |
| + manager.setRoots(includedPaths, excludedPaths, <String, String>{}); |
| + expect(_currentPackageMap, equals(packageMapProvider.packageMap)); |
| + manager.setRoots(includedPaths, excludedPaths, |
| + <String, String>{projPath: packageRootPath}); |
| + _checkPackageRoot(projPath, equals(packageRootPath)); |
| } |
| - // TODO(paulberry): This test only tests PackagesFileDisposition. |
| - // Once http://dartbug.com/23909 is fixed, add a test for sdk extensions |
| - // and PackageMapDisposition. |
| - test_refresh_folder_with_packagespec_subfolders() { |
| - // Create a folder with no .packages file, containing two subfolders with |
| - // .packages files. |
| - String subdir1Path = posix.join(projPath, 'subdir1'); |
| - String subdir2Path = posix.join(projPath, 'subdir2'); |
| - String packagespec1Path = posix.join(subdir1Path, '.packages'); |
| - String packagespec2Path = posix.join(subdir2Path, '.packages'); |
| - resourceProvider.newFile(packagespec1Path, ''); |
| - resourceProvider.newFile(packagespec2Path, ''); |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - return pumpEventQueue().then((_) { |
| - expect(callbacks.currentContextPaths.toSet(), |
| - [subdir1Path, subdir2Path, projPath].toSet()); |
| - callbacks.now++; |
| - manager.refresh(null); |
| - return pumpEventQueue().then((_) { |
| - expect(callbacks.currentContextPaths.toSet(), |
| - [subdir1Path, subdir2Path, projPath].toSet()); |
| - expect(callbacks.currentContextTimestamps[projPath], callbacks.now); |
| - expect(callbacks.currentContextTimestamps[subdir1Path], callbacks.now); |
| - expect(callbacks.currentContextTimestamps[subdir2Path], callbacks.now); |
| - }); |
| - }); |
| - } |
| - |
| - test_refresh_folder_with_pubspec() { |
| - // create a context with a pubspec.yaml file |
| - String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
| - resourceProvider.newFile(pubspecPath, 'pubspec'); |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - return pumpEventQueue().then((_) { |
| - expect(callbacks.currentContextPaths.toList(), [projPath]); |
| - callbacks.now++; |
| - manager.refresh(null); |
| - return pumpEventQueue().then((_) { |
| - expect(callbacks.currentContextPaths.toList(), [projPath]); |
| - expect(callbacks.currentContextTimestamps[projPath], callbacks.now); |
| - }); |
| - }); |
| + void test_setRoots_changePackageRoot() { |
| + String packageRootPath1 = '/package1'; |
| + String packageRootPath2 = '/package2'; |
| + List<String> includedPaths = <String>[projPath]; |
| + List<String> excludedPaths = <String>[]; |
| + manager.setRoots(includedPaths, excludedPaths, |
| + <String, String>{projPath: packageRootPath1}); |
| + _checkPackageRoot(projPath, equals(packageRootPath1)); |
| + manager.setRoots(includedPaths, excludedPaths, |
| + <String, String>{projPath: packageRootPath2}); |
| + _checkPackageRoot(projPath, equals(packageRootPath2)); |
| } |
| - test_refresh_folder_with_pubspec_subfolders() { |
| - // Create a folder with no pubspec.yaml, containing two subfolders with |
| - // pubspec.yaml files. |
| - String subdir1Path = posix.join(projPath, 'subdir1'); |
| - String subdir2Path = posix.join(projPath, 'subdir2'); |
| - String pubspec1Path = posix.join(subdir1Path, 'pubspec.yaml'); |
| - String pubspec2Path = posix.join(subdir2Path, 'pubspec.yaml'); |
| - resourceProvider.newFile(pubspec1Path, 'pubspec'); |
| - resourceProvider.newFile(pubspec2Path, 'pubspec'); |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - return pumpEventQueue().then((_) { |
| - expect(callbacks.currentContextPaths.toSet(), |
| - [subdir1Path, subdir2Path, projPath].toSet()); |
| - callbacks.now++; |
| - manager.refresh(null); |
| - return pumpEventQueue().then((_) { |
| - expect(callbacks.currentContextPaths.toSet(), |
| - [subdir1Path, subdir2Path, projPath].toSet()); |
| - expect(callbacks.currentContextTimestamps[projPath], callbacks.now); |
| - expect(callbacks.currentContextTimestamps[subdir1Path], callbacks.now); |
| - expect(callbacks.currentContextTimestamps[subdir2Path], callbacks.now); |
| - }); |
| - }); |
| + void test_setRoots_exclude_newRoot_withExcludedFile() { |
| + // prepare paths |
| + String project = '/project'; |
| + String file1 = '$project/file1.dart'; |
| + String file2 = '$project/file2.dart'; |
| + // create files |
| + resourceProvider.newFile(file1, '// 1'); |
| + resourceProvider.newFile(file2, '// 2'); |
| + // set roots |
| + manager.setRoots(<String>[project], <String>[file1], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [file2]); |
| } |
| - test_refresh_oneContext() { |
| - // create two contexts with pubspec.yaml files |
| - String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
| - resourceProvider.newFile(pubspecPath, 'pubspec1'); |
| - |
| - String proj2Path = '/my/proj2'; |
| - resourceProvider.newFolder(proj2Path); |
| - String pubspec2Path = posix.join(proj2Path, 'pubspec.yaml'); |
| - resourceProvider.newFile(pubspec2Path, 'pubspec2'); |
| - |
| - List<String> roots = <String>[projPath, proj2Path]; |
| - manager.setRoots(roots, <String>[], <String, String>{}); |
| - return pumpEventQueue().then((_) { |
| - expect(callbacks.currentContextPaths.toList(), unorderedEquals(roots)); |
| - int then = callbacks.now; |
| - callbacks.now++; |
| - manager.refresh([resourceProvider.getResource(proj2Path)]); |
| - return pumpEventQueue().then((_) { |
| - expect(callbacks.currentContextPaths.toList(), unorderedEquals(roots)); |
| - expect(callbacks.currentContextTimestamps[projPath], then); |
| - expect(callbacks.currentContextTimestamps[proj2Path], callbacks.now); |
| - }); |
| - }); |
| + void test_setRoots_exclude_newRoot_withExcludedFolder() { |
| + // prepare paths |
| + String project = '/project'; |
| + String folderA = '$project/aaa'; |
| + String folderB = '$project/bbb'; |
| + String fileA = '$folderA/a.dart'; |
| + String fileB = '$folderB/b.dart'; |
| + // create files |
| + resourceProvider.newFile(fileA, 'library a;'); |
| + resourceProvider.newFile(fileB, 'library b;'); |
| + // set roots |
| + manager.setRoots(<String>[project], <String>[folderB], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [fileA]); |
| } |
| - test_sdk_ext_packagespec() async { |
| - // Create files. |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - newFile([libPath, 'main.dart']); |
| - newFile([libPath, 'nope.dart']); |
| - String sdkExtPath = newFolder([projPath, 'sdk_ext']); |
| - newFile([sdkExtPath, 'entry.dart']); |
| - String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']); |
| - newFile([sdkExtSrcPath, 'part.dart']); |
| - // Setup sdk extension mapping. |
| - newFile( |
| - [libPath, '_sdkext'], |
| - r''' |
| -{ |
| - "dart:foobar": "../sdk_ext/entry.dart" |
| -} |
| -'''); |
| - // Setup .packages file |
| - newFile( |
| - [projPath, '.packages'], |
| - r''' |
| -test_pack:lib/'''); |
| - // Setup context. |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // Confirm that one context was created. |
| - var contexts = |
| - manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| - expect(contexts, isNotNull); |
| - expect(contexts.length, equals(1)); |
| - var context = contexts[0]; |
| - var source = context.sourceFactory.forUri('dart:foobar'); |
| - expect(source.fullName, equals('/my/proj/sdk_ext/entry.dart')); |
| + void test_setRoots_exclude_sameRoot_addExcludedFile() { |
| + // prepare paths |
| + String project = '/project'; |
| + String file1 = '$project/file1.dart'; |
| + String file2 = '$project/file2.dart'; |
| + // create files |
| + resourceProvider.newFile(file1, '// 1'); |
| + resourceProvider.newFile(file2, '// 2'); |
| + // set roots |
| + manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [file1, file2]); |
| + // exclude "2" |
| + manager.setRoots(<String>[project], <String>[file2], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [file1]); |
| } |
| - void test_setRoots_addFolderWithDartFile() { |
| - String filePath = posix.join(projPath, 'foo.dart'); |
| - resourceProvider.newFile(filePath, 'contents'); |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // verify |
| - var filePaths = callbacks.currentContextFilePaths[projPath]; |
| - expect(filePaths, hasLength(1)); |
| - expect(filePaths, contains(filePath)); |
| - List<AnalysisContext> contextsInAnalysisRoot = |
| - manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| - expect(contextsInAnalysisRoot, hasLength(1)); |
| - AnalysisContext context = contextsInAnalysisRoot[0]; |
| - expect(context, isNotNull); |
| - Source result = context.sourceFactory.forUri('package:foo/foo.dart'); |
| - expect(result, isNotNull); |
| - expect(result.exists(), isFalse); |
| + void test_setRoots_exclude_sameRoot_addExcludedFolder() { |
| + // prepare paths |
| + String project = '/project'; |
| + String folderA = '$project/aaa'; |
| + String folderB = '$project/bbb'; |
| + String fileA = '$folderA/a.dart'; |
| + String fileB = '$folderB/b.dart'; |
| + // create files |
| + resourceProvider.newFile(fileA, 'library a;'); |
| + resourceProvider.newFile(fileB, 'library b;'); |
| + // initially both "aaa/a" and "bbb/b" are included |
| + manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [fileA, fileB]); |
| + // exclude "bbb/" |
| + manager.setRoots(<String>[project], <String>[folderB], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [fileA]); |
| } |
| - void test_setRoots_addFolderWithDartFileInSubfolder() { |
| - String filePath = posix.join(projPath, 'foo', 'bar.dart'); |
| - resourceProvider.newFile(filePath, 'contents'); |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // verify |
| - var filePaths = callbacks.currentContextFilePaths[projPath]; |
| - expect(filePaths, hasLength(1)); |
| - expect(filePaths, contains(filePath)); |
| + void test_setRoots_exclude_sameRoot_removeExcludedFile() { |
| + // prepare paths |
| + String project = '/project'; |
| + String file1 = '$project/file1.dart'; |
| + String file2 = '$project/file2.dart'; |
| + // create files |
| + resourceProvider.newFile(file1, '// 1'); |
| + resourceProvider.newFile(file2, '// 2'); |
| + // set roots |
| + manager.setRoots(<String>[project], <String>[file2], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [file1]); |
| + // stop excluding "2" |
| + manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [file1, file2]); |
| } |
| - void test_setRoots_addFolderWithDummyLink() { |
| - String filePath = posix.join(projPath, 'foo.dart'); |
| - resourceProvider.newDummyLink(filePath); |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // verify |
| - var filePaths = callbacks.currentContextFilePaths[projPath]; |
| - expect(filePaths, isEmpty); |
| + void test_setRoots_exclude_sameRoot_removeExcludedFile_inFolder() { |
| + // prepare paths |
| + String project = '/project'; |
| + String file1 = '$project/bin/file1.dart'; |
| + String file2 = '$project/bin/file2.dart'; |
| + // create files |
| + resourceProvider.newFile(file1, '// 1'); |
| + resourceProvider.newFile(file2, '// 2'); |
| + // set roots |
| + manager.setRoots(<String>[project], <String>[file2], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [file1]); |
| + // stop excluding "2" |
| + manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [file1, file2]); |
| } |
| - void test_setRoots_addFolderWithNestedPackageSpec() { |
| - String examplePath = newFolder([projPath, EXAMPLE_NAME]); |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - |
| - newFile([projPath, ContextManagerImpl.PACKAGE_SPEC_NAME]); |
| - newFile([libPath, 'main.dart']); |
| - newFile([examplePath, ContextManagerImpl.PACKAGE_SPEC_NAME]); |
| - newFile([examplePath, 'example.dart']); |
| - |
| - packageMapProvider.packageMap['proj'] = [ |
| - resourceProvider.getResource(libPath) |
| - ]; |
| + void test_setRoots_exclude_sameRoot_removeExcludedFolder() { |
| + // prepare paths |
| + String project = '/project'; |
| + String folderA = '$project/aaa'; |
| + String folderB = '$project/bbb'; |
| + String fileA = '$folderA/a.dart'; |
| + String fileB = '$folderB/b.dart'; |
| + // create files |
| + resourceProvider.newFile(fileA, 'library a;'); |
| + resourceProvider.newFile(fileB, 'library b;'); |
| + // exclude "bbb/" |
| + manager.setRoots(<String>[project], <String>[folderB], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [fileA]); |
| + // stop excluding "bbb/" |
| + manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [fileA, fileB]); |
| + } |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + void test_setRoots_ignoreDocFolder() { |
| + String project = '/project'; |
| + String fileA = '$project/foo.dart'; |
| + String fileB = '$project/lib/doc/bar.dart'; |
| + String fileC = '$project/doc/bar.dart'; |
| + resourceProvider.newFile(fileA, ''); |
| + resourceProvider.newFile(fileB, ''); |
| + resourceProvider.newFile(fileC, ''); |
| + manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [fileA, fileB]); |
| + } |
| + void test_setRoots_nested_includedByOuter_innerFirst() { |
| + String project = '/project'; |
| + String projectPubspec = '$project/pubspec.yaml'; |
| + String example = '$project/example'; |
| + String examplePubspec = '$example/pubspec.yaml'; |
| + // create files |
| + resourceProvider.newFile(projectPubspec, 'name: project'); |
| + resourceProvider.newFile(examplePubspec, 'name: example'); |
| + manager |
| + .setRoots(<String>[example, project], <String>[], <String, String>{}); |
| + // verify |
| + { |
| + ContextInfo rootInfo = manager.rootInfo; |
| + expect(rootInfo.children, hasLength(1)); |
| + { |
| + ContextInfo projectInfo = rootInfo.children[0]; |
| + expect(projectInfo.folder.path, project); |
| + expect(projectInfo.children, hasLength(1)); |
| + { |
| + ContextInfo exampleInfo = projectInfo.children[0]; |
| + expect(exampleInfo.folder.path, example); |
| + expect(exampleInfo.children, isEmpty); |
| + } |
| + } |
| + } |
| expect(callbacks.currentContextPaths, hasLength(2)); |
| - |
| - expect(callbacks.currentContextPaths, contains(projPath)); |
| - Set<Source> projSources = callbacks.currentContextSources[projPath]; |
| - expect(projSources, hasLength(1)); |
| - expect(projSources.first.uri.toString(), 'file:///my/proj/lib/main.dart'); |
| - |
| - expect(callbacks.currentContextPaths, contains(examplePath)); |
| - Set<Source> exampleSources = callbacks.currentContextSources[examplePath]; |
| - expect(exampleSources, hasLength(1)); |
| - expect(exampleSources.first.uri.toString(), |
| - 'file:///my/proj/example/example.dart'); |
| + expect(callbacks.currentContextPaths, unorderedEquals([project, example])); |
| } |
| - void test_setRoots_addFolderWithNestedPubspec() { |
| - String examplePath = newFolder([projPath, EXAMPLE_NAME]); |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| + void test_setRoots_nested_includedByOuter_outerPubspec() { |
| + String project = '/project'; |
| + String projectPubspec = '$project/pubspec.yaml'; |
| + String example = '$project/example'; |
| + // create files |
| + resourceProvider.newFile(projectPubspec, 'name: project'); |
| + resourceProvider.newFolder(example); |
| + manager |
| + .setRoots(<String>[project, example], <String>[], <String, String>{}); |
| + // verify |
| + { |
| + ContextInfo rootInfo = manager.rootInfo; |
| + expect(rootInfo.children, hasLength(1)); |
| + { |
| + ContextInfo projectInfo = rootInfo.children[0]; |
| + expect(projectInfo.folder.path, project); |
| + expect(projectInfo.children, isEmpty); |
| + } |
| + } |
| + expect(callbacks.currentContextPaths, hasLength(1)); |
| + expect(callbacks.currentContextPaths, unorderedEquals([project])); |
| + } |
| - newFile([projPath, ContextManagerImpl.PUBSPEC_NAME]); |
| - newFile([libPath, 'main.dart']); |
| - newFile([examplePath, ContextManagerImpl.PUBSPEC_NAME]); |
| - newFile([examplePath, 'example.dart']); |
| + void test_setRoots_nested_includedByOuter_twoPubspecs() { |
| + String project = '/project'; |
| + String projectPubspec = '$project/pubspec.yaml'; |
| + String example = '$project/example'; |
| + String examplePubspec = '$example/pubspec.yaml'; |
| + // create files |
| + resourceProvider.newFile(projectPubspec, 'name: project'); |
| + resourceProvider.newFile(examplePubspec, 'name: example'); |
| + manager |
| + .setRoots(<String>[project, example], <String>[], <String, String>{}); |
| + // verify |
| + { |
| + ContextInfo rootInfo = manager.rootInfo; |
| + expect(rootInfo.children, hasLength(1)); |
| + { |
| + ContextInfo projectInfo = rootInfo.children[0]; |
| + expect(projectInfo.folder.path, project); |
| + expect(projectInfo.children, hasLength(1)); |
| + { |
| + ContextInfo exampleInfo = projectInfo.children[0]; |
| + expect(exampleInfo.folder.path, example); |
| + expect(exampleInfo.children, isEmpty); |
| + } |
| + } |
| + } |
| + expect(callbacks.currentContextPaths, hasLength(2)); |
| + expect(callbacks.currentContextPaths, unorderedEquals([project, example])); |
| + } |
| - packageMapProvider.packageMap['proj'] = [ |
| - resourceProvider.getResource(libPath) |
| - ]; |
| + void test_setRoots_newFolderWithPackageRoot() { |
| + String packageRootPath = '/package'; |
| + manager.setRoots(<String>[projPath], <String>[], |
| + <String, String>{projPath: packageRootPath}); |
| + _checkPackageRoot(projPath, equals(packageRootPath)); |
| + } |
| + void test_setRoots_newlyAddedFoldersGetProperPackageMap() { |
| + String packagePath = '/package/foo'; |
| + Folder packageFolder = resourceProvider.newFolder(packagePath); |
| + packageMapProvider.packageMap = { |
| + 'foo': [packageFolder] |
| + }; |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + expect(_currentPackageMap, equals(packageMapProvider.packageMap)); |
| + } |
| - expect(callbacks.currentContextPaths, hasLength(2)); |
| - |
| - expect(callbacks.currentContextPaths, contains(projPath)); |
| - Set<Source> projSources = callbacks.currentContextSources[projPath]; |
| - expect(projSources, hasLength(1)); |
| - expect(projSources.first.uri.toString(), 'package:proj/main.dart'); |
| - |
| - expect(callbacks.currentContextPaths, contains(examplePath)); |
| - Set<Source> exampleSources = callbacks.currentContextSources[examplePath]; |
| - expect(exampleSources, hasLength(1)); |
| - expect(exampleSources.first.uri.toString(), |
| - 'file:///my/proj/example/example.dart'); |
| + void test_setRoots_noContext_excludedFolder() { |
| + // prepare paths |
| + String project = '/project'; |
| + String excludedFolder = '$project/excluded'; |
| + String excludedPubspec = '$excludedFolder/pubspec.yaml'; |
| + // create files |
| + resourceProvider.newFile(excludedPubspec, 'name: ignore-me'); |
| + // set "/project", and exclude "/project/excluded" |
| + manager.setRoots( |
| + <String>[project], <String>[excludedFolder], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| } |
| - void test_setRoots_addFolderWithoutPubspec() { |
| - packageMapProvider.packageMap = null; |
| + void test_setRoots_noContext_inDotFolder() { |
| + String pubspecPath = posix.join(projPath, '.pub', 'pubspec.yaml'); |
| + resourceProvider.newFile(pubspecPath, 'name: test'); |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| // verify |
| expect(callbacks.currentContextPaths, hasLength(1)); |
| @@ -1265,160 +937,156 @@ test_pack:lib/'''); |
| expect(callbacks.currentContextFilePaths[projPath], hasLength(0)); |
| } |
| - void test_setRoots_addFolderWithPackagespec() { |
| - String packagespecPath = posix.join(projPath, '.packages'); |
| - resourceProvider.newFile(packagespecPath, |
| - 'unittest:file:///home/somebody/.pub/cache/unittest-0.9.9/lib/'); |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - File mainFile = |
| - resourceProvider.newFile(posix.join(libPath, 'main.dart'), ''); |
| - Source source = mainFile.createSource(); |
| - |
| + void test_setRoots_noContext_inPackagesFolder() { |
| + String pubspecPath = posix.join(projPath, 'packages', 'pubspec.yaml'); |
| + resourceProvider.newFile(pubspecPath, 'name: test'); |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - |
| // verify |
| expect(callbacks.currentContextPaths, hasLength(1)); |
| expect(callbacks.currentContextPaths, contains(projPath)); |
| - expect(callbacks.currentContextFilePaths[projPath], hasLength(1)); |
| + expect(callbacks.currentContextFilePaths[projPath], hasLength(0)); |
| + } |
| - // smoketest resolution |
| - SourceFactory sourceFactory = callbacks.currentContext.sourceFactory; |
| - Source resolvedSource = |
| - sourceFactory.resolveUri(source, 'package:unittest/unittest.dart'); |
| - expect(resolvedSource, isNotNull); |
| - expect(resolvedSource.fullName, |
| - equals('/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart')); |
| + void test_setRoots_packageResolver() { |
| + Uri uri = Uri.parse('package:foo/foo.dart'); |
| + Source source = new TestSource(); |
| + packageResolver = new TestUriResolver({uri: source}); |
| + String filePath = posix.join(projPath, 'foo.dart'); |
| + resourceProvider.newFile(filePath, 'contents'); |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + |
| + List<AnalysisContext> contextsInAnalysisRoot = |
| + manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| + expect(contextsInAnalysisRoot, hasLength(1)); |
| + AnalysisContext context = contextsInAnalysisRoot[0]; |
| + expect(context, isNotNull); |
| + Source result = context.sourceFactory.forUri2(uri); |
| + expect(result, same(source)); |
| } |
| - void test_setRoots_addFolderWithPackagespecAndPackageRoot() { |
| - // The package root should take priority. |
| - String packagespecPath = posix.join(projPath, '.packages'); |
| - resourceProvider.newFile(packagespecPath, |
| - 'unittest:file:///home/somebody/.pub/cache/unittest-0.9.9/lib/'); |
| - String packageRootPath = '/package/root/'; |
| - manager.setRoots(<String>[projPath], <String>[], |
| - <String, String>{projPath: packageRootPath}); |
| - expect(callbacks.currentContextPaths, hasLength(1)); |
| - expect(callbacks.currentContextPaths, contains(projPath)); |
| - _checkPackageRoot(projPath, packageRootPath); |
| + void test_setRoots_pathContainsDotFile() { |
| + // If the path to a file (relative to the context root) contains a folder |
| + // whose name begins with '.', then the file is ignored. |
| + String project = '/project'; |
| + String fileA = '$project/foo.dart'; |
| + String fileB = '$project/.pub/bar.dart'; |
| + resourceProvider.newFile(fileA, ''); |
| + resourceProvider.newFile(fileB, ''); |
| + manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [fileA]); |
| } |
| - void test_setRoots_addFolderWithPubspec() { |
| - String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
| - resourceProvider.newFile(pubspecPath, 'pubspec'); |
| + void test_setRoots_removeFolderWithoutPubspec() { |
| + packageMapProvider.packageMap = null; |
| + // add one root - there is a context |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // verify |
| expect(callbacks.currentContextPaths, hasLength(1)); |
| - expect(callbacks.currentContextPaths, contains(projPath)); |
| - expect(callbacks.currentContextFilePaths[projPath], hasLength(0)); |
| + // set empty roots - no contexts |
| + manager.setRoots(<String>[], <String>[], <String, String>{}); |
| + expect(callbacks.currentContextPaths, hasLength(0)); |
| + expect(callbacks.currentContextFilePaths, hasLength(0)); |
| } |
| - void test_setRoots_addFolderWithPubspec_andPackagespec() { |
| - String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
| - String packagespecPath = posix.join(projPath, '.packages'); |
| - resourceProvider.newFile(pubspecPath, 'pubspec'); |
| - resourceProvider.newFile(packagespecPath, ''); |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // verify |
| - callbacks.assertContextPaths([projPath]); |
| - } |
| - |
| - void test_setRoots_addFolderWithPubspecAndLib() { |
| - String binPath = newFolder([projPath, BIN_NAME]); |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - String srcPath = newFolder([libPath, SRC_NAME]); |
| - String testPath = newFolder([projPath, TEST_NAME]); |
| - |
| - newFile([projPath, ContextManagerImpl.PUBSPEC_NAME]); |
| - String appPath = newFile([binPath, 'app.dart']); |
| - newFile([libPath, 'main.dart']); |
| - newFile([srcPath, 'internal.dart']); |
| - String testFilePath = newFile([testPath, 'main_test.dart']); |
| - |
| - packageMapProvider.packageMap['proj'] = [ |
| - resourceProvider.getResource(libPath) |
| - ]; |
| - |
| + void test_setRoots_removeFolderWithPackagespec() { |
| + // create a pubspec |
| + String pubspecPath = posix.join(projPath, '.packages'); |
| + resourceProvider.newFile(pubspecPath, ''); |
| + // add one root - there is a context |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - Set<Source> sources = callbacks.currentContextSources[projPath]; |
| - |
| + expect(manager.changeSubscriptions, hasLength(1)); |
| expect(callbacks.currentContextPaths, hasLength(1)); |
| - expect(callbacks.currentContextPaths, contains(projPath)); |
| - expect(sources, hasLength(4)); |
| - List<String> uris = |
| - sources.map((Source source) => source.uri.toString()).toList(); |
| - expect(uris, contains('file://$appPath')); |
| - expect(uris, contains('package:proj/main.dart')); |
| - expect(uris, contains('package:proj/src/internal.dart')); |
| - expect(uris, contains('file://$testFilePath')); |
| + // set empty roots - no contexts |
| + manager.setRoots(<String>[], <String>[], <String, String>{}); |
| + expect(manager.changeSubscriptions, hasLength(0)); |
| + expect(callbacks.currentContextPaths, hasLength(0)); |
| + expect(callbacks.currentContextFilePaths, hasLength(0)); |
| } |
| - void test_setRoots_addFolderWithPubspecAndPackagespecFolders() { |
| + void test_setRoots_removeFolderWithPackagespecFolder() { |
| // prepare paths |
| - String root = '/root'; |
| - String rootFile = '$root/root.dart'; |
| - String subProjectA = '$root/sub/aaa'; |
| - String subProjectB = '$root/sub/sub2/bbb'; |
| - String subProjectA_file = '$subProjectA/bin/a.dart'; |
| - String subProjectB_file = '$subProjectB/bin/b.dart'; |
| + String projectA = '/projectA'; |
| + String projectB = '/projectB'; |
| + String subProjectA = '$projectA/sub'; |
| + String subProjectB = '$projectB/sub'; |
| + String projectA_file = '$projectA/a.dart'; |
| + String projectB_file = '$projectB/a.dart'; |
| + String subProjectA_pubspec = '$subProjectA/.packages'; |
| + String subProjectB_pubspec = '$subProjectB/.packages'; |
| + String subProjectA_file = '$subProjectA/bin/sub_a.dart'; |
| + String subProjectB_file = '$subProjectB/bin/sub_b.dart'; |
| // create files |
| - resourceProvider.newFile('$subProjectA/pubspec.yaml', 'pubspec'); |
| - resourceProvider.newFile('$subProjectB/pubspec.yaml', 'pubspec'); |
| - resourceProvider.newFile('$subProjectA/.packages', ''); |
| - resourceProvider.newFile('$subProjectB/.packages', ''); |
| - |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - resourceProvider.newFile(subProjectA_file, 'library a;'); |
| - resourceProvider.newFile(subProjectB_file, 'library b;'); |
| - |
| + resourceProvider.newFile(projectA_file, '// a'); |
| + resourceProvider.newFile(projectB_file, '// b'); |
| + resourceProvider.newFile(subProjectA_pubspec, ''); |
| + resourceProvider.newFile(subProjectB_pubspec, ''); |
| + resourceProvider.newFile(subProjectA_file, '// sub-a'); |
| + resourceProvider.newFile(subProjectB_file, '// sub-b'); |
| // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root, subProjectA, subProjectB]); |
| - // verify files |
| - callbacks.assertContextFiles(root, [rootFile]); |
| + manager |
| + .setRoots(<String>[projectA, projectB], <String>[], <String, String>{}); |
| + callbacks |
| + .assertContextPaths([projectA, subProjectA, projectB, subProjectB]); |
| + callbacks.assertContextFiles(projectA, [projectA_file]); |
| + callbacks.assertContextFiles(projectB, [projectB_file]); |
| callbacks.assertContextFiles(subProjectA, [subProjectA_file]); |
| callbacks.assertContextFiles(subProjectB, [subProjectB_file]); |
| + // remove "projectB" |
| + manager.setRoots(<String>[projectA], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([projectA, subProjectA]); |
| + callbacks.assertContextFiles(projectA, [projectA_file]); |
| + callbacks.assertContextFiles(subProjectA, [subProjectA_file]); |
| } |
| - void test_setRoots_addFolderWithPubspecFolders() { |
| + void test_setRoots_removeFolderWithPubspec() { |
| + // create a pubspec |
| + String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
| + resourceProvider.newFile(pubspecPath, 'pubspec'); |
| + // add one root - there is a context |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + expect(callbacks.currentContextPaths, hasLength(1)); |
| + // set empty roots - no contexts |
| + manager.setRoots(<String>[], <String>[], <String, String>{}); |
| + expect(callbacks.currentContextPaths, hasLength(0)); |
| + expect(callbacks.currentContextFilePaths, hasLength(0)); |
| + } |
| + |
| + void test_setRoots_removeFolderWithPubspecFolder() { |
| // prepare paths |
| - String root = '/root'; |
| - String rootFile = '$root/root.dart'; |
| - String subProjectA = '$root/sub/aaa'; |
| - String subProjectB = '$root/sub/sub2/bbb'; |
| - String subProjectA_file = '$subProjectA/bin/a.dart'; |
| - String subProjectB_file = '$subProjectB/bin/b.dart'; |
| + String projectA = '/projectA'; |
| + String projectB = '/projectB'; |
| + String subProjectA = '$projectA/sub'; |
| + String subProjectB = '$projectB/sub'; |
| + String projectA_file = '$projectA/a.dart'; |
| + String projectB_file = '$projectB/a.dart'; |
| + String subProjectA_pubspec = '$subProjectA/pubspec.yaml'; |
| + String subProjectB_pubspec = '$subProjectB/pubspec.yaml'; |
| + String subProjectA_file = '$subProjectA/bin/sub_a.dart'; |
| + String subProjectB_file = '$subProjectB/bin/sub_b.dart'; |
| // create files |
| - resourceProvider.newFile('$subProjectA/pubspec.yaml', 'pubspec'); |
| - resourceProvider.newFile('$subProjectB/pubspec.yaml', 'pubspec'); |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - resourceProvider.newFile(subProjectA_file, 'library a;'); |
| - resourceProvider.newFile(subProjectB_file, 'library b;'); |
| - // configure package maps |
| - packageMapProvider.packageMaps = { |
| - subProjectA: { |
| - 'foo': [resourceProvider.newFolder('/package/foo')] |
| - }, |
| - subProjectB: { |
| - 'bar': [resourceProvider.newFolder('/package/bar')] |
| - }, |
| - }; |
| + resourceProvider.newFile(projectA_file, '// a'); |
| + resourceProvider.newFile(projectB_file, '// b'); |
| + resourceProvider.newFile(subProjectA_pubspec, 'pubspec'); |
| + resourceProvider.newFile(subProjectB_pubspec, 'pubspec'); |
| + resourceProvider.newFile(subProjectA_file, '// sub-a'); |
| + resourceProvider.newFile(subProjectB_file, '// sub-b'); |
| // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root, subProjectA, subProjectB]); |
| - // verify files |
| - callbacks.assertContextFiles(root, [rootFile]); |
| + manager |
| + .setRoots(<String>[projectA, projectB], <String>[], <String, String>{}); |
| + callbacks |
| + .assertContextPaths([projectA, subProjectA, projectB, subProjectB]); |
| + callbacks.assertContextFiles(projectA, [projectA_file]); |
| + callbacks.assertContextFiles(projectB, [projectB_file]); |
| callbacks.assertContextFiles(subProjectA, [subProjectA_file]); |
| callbacks.assertContextFiles(subProjectB, [subProjectB_file]); |
| - // verify package maps |
| - expect(_packageMap(root), isNull); |
| - expect(_packageMap(subProjectA), |
| - equals(packageMapProvider.packageMaps[subProjectA])); |
| - expect(_packageMap(subProjectB), |
| - equals(packageMapProvider.packageMaps[subProjectB])); |
| + // remove "projectB" |
| + manager.setRoots(<String>[projectA], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([projectA, subProjectA]); |
| + callbacks.assertContextFiles(projectA, [projectA_file]); |
| + callbacks.assertContextFiles(subProjectA, [subProjectA_file]); |
| } |
| - void test_setRoots_addPackageRoot() { |
| + void test_setRoots_removePackageRoot() { |
| String packagePathFoo = '/package1/foo'; |
| String packageRootPath = '/package2/foo'; |
| Folder packageFolder = resourceProvider.newFolder(packagePathFoo); |
| @@ -1427,41 +1095,55 @@ test_pack:lib/'''); |
| }; |
| List<String> includedPaths = <String>[projPath]; |
| List<String> excludedPaths = <String>[]; |
| - manager.setRoots(includedPaths, excludedPaths, <String, String>{}); |
| - expect(_currentPackageMap, equals(packageMapProvider.packageMap)); |
| manager.setRoots(includedPaths, excludedPaths, |
| <String, String>{projPath: packageRootPath}); |
| _checkPackageRoot(projPath, equals(packageRootPath)); |
| + manager.setRoots(includedPaths, excludedPaths, <String, String>{}); |
| + expect(_currentPackageMap, equals(packageMapProvider.packageMap)); |
| } |
| - void test_setRoots_changePackageRoot() { |
| - String packageRootPath1 = '/package1'; |
| - String packageRootPath2 = '/package2'; |
| - List<String> includedPaths = <String>[projPath]; |
| - List<String> excludedPaths = <String>[]; |
| - manager.setRoots(includedPaths, excludedPaths, |
| - <String, String>{projPath: packageRootPath1}); |
| - _checkPackageRoot(projPath, equals(packageRootPath1)); |
| - manager.setRoots(includedPaths, excludedPaths, |
| - <String, String>{projPath: packageRootPath2}); |
| - _checkPackageRoot(projPath, equals(packageRootPath2)); |
| + void test_setRoots_rootPathContainsDotFile() { |
| + // If the path to the context root itself contains a folder whose name |
| + // begins with '.', then that is not sufficient to cause any files in the |
| + // context to be ignored. |
| + String project = '/.pub/project'; |
| + String fileA = '$project/foo.dart'; |
| + resourceProvider.newFile(fileA, ''); |
| + manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [fileA]); |
| } |
| - void test_setRoots_exclude_newRoot_withExcludedFile() { |
| - // prepare paths |
| - String project = '/project'; |
| - String file1 = '$project/file1.dart'; |
| - String file2 = '$project/file2.dart'; |
| - // create files |
| - resourceProvider.newFile(file1, '// 1'); |
| - resourceProvider.newFile(file2, '// 2'); |
| - // set roots |
| - manager.setRoots(<String>[project], <String>[file1], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [file2]); |
| + test_watch_addDummyLink() { |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + // empty folder initially |
| + Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| + expect(filePaths, isEmpty); |
| + // add link |
| + String filePath = posix.join(projPath, 'foo.dart'); |
| + resourceProvider.newDummyLink(filePath); |
| + // the link was ignored |
| + return pumpEventQueue().then((_) { |
| + expect(filePaths, isEmpty); |
| + }); |
| } |
| - void test_setRoots_exclude_newRoot_withExcludedFolder() { |
| + test_watch_addFile() { |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + // empty folder initially |
| + Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| + expect(filePaths, hasLength(0)); |
| + // add file |
| + String filePath = posix.join(projPath, 'foo.dart'); |
| + resourceProvider.newFile(filePath, 'contents'); |
| + // the file was added |
| + return pumpEventQueue().then((_) { |
| + expect(filePaths, hasLength(1)); |
| + expect(filePaths, contains(filePath)); |
| + }); |
| + } |
| + |
| + test_watch_addFile_excluded() { |
| // prepare paths |
| String project = '/project'; |
| String folderA = '$project/aaa'; |
| @@ -1470,1093 +1152,1449 @@ test_pack:lib/'''); |
| String fileB = '$folderB/b.dart'; |
| // create files |
| resourceProvider.newFile(fileA, 'library a;'); |
| - resourceProvider.newFile(fileB, 'library b;'); |
| // set roots |
| manager.setRoots(<String>[project], <String>[folderB], <String, String>{}); |
| callbacks.assertContextPaths([project]); |
| callbacks.assertContextFiles(project, [fileA]); |
| + // add a file, ignored as excluded |
| + resourceProvider.newFile(fileB, 'library b;'); |
| + return pumpEventQueue().then((_) { |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [fileA]); |
| + }); |
| } |
| - void test_setRoots_exclude_sameRoot_addExcludedFile() { |
| + test_watch_addFile_inDocFolder_inner() { |
| // prepare paths |
| String project = '/project'; |
| - String file1 = '$project/file1.dart'; |
| - String file2 = '$project/file2.dart'; |
| + String fileA = '$project/a.dart'; |
| + String fileB = '$project/lib/doc/b.dart'; |
| // create files |
| - resourceProvider.newFile(file1, '// 1'); |
| - resourceProvider.newFile(file2, '// 2'); |
| + resourceProvider.newFile(fileA, ''); |
| // set roots |
| manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [file1, file2]); |
| - // exclude "2" |
| - manager.setRoots(<String>[project], <String>[file2], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [file1]); |
| + callbacks.assertContextFiles(project, [fileA]); |
| + // add a "lib/doc" file, it is not ignored |
| + resourceProvider.newFile(fileB, ''); |
| + return pumpEventQueue().then((_) { |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [fileA, fileB]); |
| + }); |
| } |
| - void test_setRoots_exclude_sameRoot_addExcludedFolder() { |
| + test_watch_addFile_inDocFolder_topLevel() { |
| // prepare paths |
| String project = '/project'; |
| - String folderA = '$project/aaa'; |
| - String folderB = '$project/bbb'; |
| - String fileA = '$folderA/a.dart'; |
| - String fileB = '$folderB/b.dart'; |
| - // create files |
| - resourceProvider.newFile(fileA, 'library a;'); |
| - resourceProvider.newFile(fileB, 'library b;'); |
| - // initially both "aaa/a" and "bbb/b" are included |
| - manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA, fileB]); |
| - // exclude "bbb/" |
| - manager.setRoots(<String>[project], <String>[folderB], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA]); |
| - } |
| - |
| - void test_setRoots_exclude_sameRoot_removeExcludedFile() { |
| - // prepare paths |
| - String project = '/project'; |
| - String file1 = '$project/file1.dart'; |
| - String file2 = '$project/file2.dart'; |
| + String fileA = '$project/a.dart'; |
| + String fileB = '$project/doc/b.dart'; |
| // create files |
| - resourceProvider.newFile(file1, '// 1'); |
| - resourceProvider.newFile(file2, '// 2'); |
| + resourceProvider.newFile(fileA, ''); |
| // set roots |
| - manager.setRoots(<String>[project], <String>[file2], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [file1]); |
| - // stop excluding "2" |
| manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [file1, file2]); |
| + callbacks.assertContextFiles(project, [fileA]); |
| + // add a "doc" file, it is ignored |
| + resourceProvider.newFile(fileB, ''); |
| + return pumpEventQueue().then((_) { |
| + callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [fileA]); |
| + }); |
| } |
| - void test_setRoots_exclude_sameRoot_removeExcludedFile_inFolder() { |
| - // prepare paths |
| + test_watch_addFile_pathContainsDotFile() async { |
| + // If a file is added and the path to it (relative to the context root) |
| + // contains a folder whose name begins with '.', then the file is ignored. |
| String project = '/project'; |
| - String file1 = '$project/bin/file1.dart'; |
| - String file2 = '$project/bin/file2.dart'; |
| - // create files |
| - resourceProvider.newFile(file1, '// 1'); |
| - resourceProvider.newFile(file2, '// 2'); |
| - // set roots |
| - manager.setRoots(<String>[project], <String>[file2], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [file1]); |
| - // stop excluding "2" |
| + String fileA = '$project/foo.dart'; |
| + String fileB = '$project/.pub/bar.dart'; |
| + resourceProvider.newFile(fileA, ''); |
| manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [file1, file2]); |
| - } |
| - |
| - void test_setRoots_exclude_sameRoot_removeExcludedFolder() { |
| - // prepare paths |
| - String project = '/project'; |
| - String folderA = '$project/aaa'; |
| - String folderB = '$project/bbb'; |
| - String fileA = '$folderA/a.dart'; |
| - String fileB = '$folderB/b.dart'; |
| - // create files |
| - resourceProvider.newFile(fileA, 'library a;'); |
| - resourceProvider.newFile(fileB, 'library b;'); |
| - // exclude "bbb/" |
| - manager.setRoots(<String>[project], <String>[folderB], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| callbacks.assertContextFiles(project, [fileA]); |
| - // stop excluding "bbb/" |
| - manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| + resourceProvider.newFile(fileB, ''); |
| + await pumpEventQueue(); |
| callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA, fileB]); |
| + callbacks.assertContextFiles(project, [fileA]); |
| } |
| - void test_setRoots_ignoreDocFolder() { |
| - String project = '/project'; |
| + test_watch_addFile_rootPathContainsDotFile() async { |
| + // If a file is added and the path to the context contains a folder whose |
| + // name begins with '.', then the file is not ignored. |
| + String project = '/.pub/project'; |
| String fileA = '$project/foo.dart'; |
| - String fileB = '$project/lib/doc/bar.dart'; |
| - String fileC = '$project/doc/bar.dart'; |
| + String fileB = '$project/bar/baz.dart'; |
| resourceProvider.newFile(fileA, ''); |
| - resourceProvider.newFile(fileB, ''); |
| - resourceProvider.newFile(fileC, ''); |
| manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| callbacks.assertContextPaths([project]); |
| + callbacks.assertContextFiles(project, [fileA]); |
| + resourceProvider.newFile(fileB, ''); |
| + await pumpEventQueue(); |
| + callbacks.assertContextPaths([project]); |
| callbacks.assertContextFiles(project, [fileA, fileB]); |
| } |
| - void test_setRoots_nested_excludedByOuter() { |
| - String project = '/project'; |
| - String projectPubspec = '$project/pubspec.yaml'; |
| - String example = '$project/example'; |
| - String examplePubspec = '$example/pubspec.yaml'; |
| - // create files |
| - resourceProvider.newFile(projectPubspec, 'name: project'); |
| - resourceProvider.newFile(examplePubspec, 'name: example'); |
| - newFile( |
| - [project, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - exclude: |
| - - 'example' |
| -'''); |
| - manager |
| - .setRoots(<String>[project, example], <String>[], <String, String>{}); |
| - // verify |
| - { |
| - ContextInfo rootInfo = manager.rootInfo; |
| - expect(rootInfo.children, hasLength(1)); |
| - { |
| - ContextInfo projectInfo = rootInfo.children[0]; |
| - expect(projectInfo.folder.path, project); |
| - expect(projectInfo.children, hasLength(1)); |
| - { |
| - ContextInfo exampleInfo = projectInfo.children[0]; |
| - expect(exampleInfo.folder.path, example); |
| - expect(exampleInfo.children, isEmpty); |
| - } |
| - } |
| - } |
| - expect(callbacks.currentContextPaths, hasLength(2)); |
| - expect(callbacks.currentContextPaths, unorderedEquals([project, example])); |
| + test_watch_addFileInSubfolder() { |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + // empty folder initially |
| + Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| + expect(filePaths, hasLength(0)); |
| + // add file in subfolder |
| + String filePath = posix.join(projPath, 'foo', 'bar.dart'); |
| + resourceProvider.newFile(filePath, 'contents'); |
| + // the file was added |
| + return pumpEventQueue().then((_) { |
| + expect(filePaths, hasLength(1)); |
| + expect(filePaths, contains(filePath)); |
| + }); |
| } |
| - void test_setRoots_nested_excludedByOuter_deep() { |
| - String a = '/a'; |
| - String c = '$a/b/c'; |
| - String aPubspec = '$a/pubspec.yaml'; |
| - String cPubspec = '$c/pubspec.yaml'; |
| + test_watch_addPackagespec_toRoot() { |
| + // prepare paths |
| + String root = '/root'; |
| + String rootFile = '$root/root.dart'; |
| + String rootPackagespec = '$root/.packages'; |
| // create files |
| - resourceProvider.newFile(aPubspec, 'name: aaa'); |
| - resourceProvider.newFile(cPubspec, 'name: ccc'); |
| - newFile( |
| - [a, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - exclude: |
| - - 'b**' |
| -'''); |
| - manager.setRoots(<String>[a, c], <String>[], <String, String>{}); |
| - // verify |
| - { |
| - ContextInfo rootInfo = manager.rootInfo; |
| - expect(rootInfo.children, hasLength(1)); |
| - { |
| - ContextInfo aInfo = rootInfo.children[0]; |
| - expect(aInfo.folder.path, a); |
| - expect(aInfo.children, hasLength(1)); |
| - { |
| - ContextInfo cInfo = aInfo.children[0]; |
| - expect(cInfo.folder.path, c); |
| - expect(cInfo.children, isEmpty); |
| - } |
| - } |
| - } |
| - expect(callbacks.currentContextPaths, hasLength(2)); |
| - expect(callbacks.currentContextPaths, unorderedEquals([a, c])); |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + // set roots |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root]); |
| + // verify files |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + // add packagespec - still just one root |
| + resourceProvider.newFile(rootPackagespec, ''); |
| + return pumpEventQueue().then((_) { |
| + callbacks.assertContextPaths([root]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + // TODO(pquitslund): verify that a new source factory is created -- |
| + // likely this will need to happen in a corresponding ServerContextManagerTest. |
| + }); |
| } |
| - void test_setRoots_nested_includedByOuter_innerFirst() { |
| - String project = '/project'; |
| - String projectPubspec = '$project/pubspec.yaml'; |
| - String example = '$project/example'; |
| - String examplePubspec = '$example/pubspec.yaml'; |
| + test_watch_addPackagespec_toSubFolder() { |
| + // prepare paths |
| + String root = '/root'; |
| + String rootFile = '$root/root.dart'; |
| + String subProject = '$root/sub/aaa'; |
| + String subPubspec = '$subProject/.packages'; |
| + String subFile = '$subProject/bin/a.dart'; |
| // create files |
| - resourceProvider.newFile(projectPubspec, 'name: project'); |
| - resourceProvider.newFile(examplePubspec, 'name: example'); |
| - manager |
| - .setRoots(<String>[example, project], <String>[], <String, String>{}); |
| - // verify |
| - { |
| - ContextInfo rootInfo = manager.rootInfo; |
| - expect(rootInfo.children, hasLength(1)); |
| - { |
| - ContextInfo projectInfo = rootInfo.children[0]; |
| - expect(projectInfo.folder.path, project); |
| - expect(projectInfo.children, hasLength(1)); |
| - { |
| - ContextInfo exampleInfo = projectInfo.children[0]; |
| - expect(exampleInfo.folder.path, example); |
| - expect(exampleInfo.children, isEmpty); |
| - } |
| - } |
| - } |
| - expect(callbacks.currentContextPaths, hasLength(2)); |
| - expect(callbacks.currentContextPaths, unorderedEquals([project, example])); |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + resourceProvider.newFile(subFile, 'library a;'); |
| + // set roots |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root]); |
| + // verify files |
| + callbacks.assertContextFiles(root, [rootFile, subFile]); |
| + // add .packages |
| + resourceProvider.newFile(subPubspec, ''); |
| + return pumpEventQueue().then((_) { |
| + callbacks.assertContextPaths([root, subProject]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProject, [subFile]); |
| + }); |
| } |
| - void test_setRoots_nested_includedByOuter_outerPubspec() { |
| - String project = '/project'; |
| - String projectPubspec = '$project/pubspec.yaml'; |
| - String example = '$project/example'; |
| + test_watch_addPackagespec_toSubFolder_ofSubFolder() { |
| + // prepare paths |
| + String root = '/root'; |
| + String rootFile = '$root/root.dart'; |
| + String subProject = '$root/sub'; |
| + String subPubspec = '$subProject/.packages'; |
| + String subFile = '$subProject/bin/sub.dart'; |
| + String subSubPubspec = '$subProject/subsub/.packages'; |
| // create files |
| - resourceProvider.newFile(projectPubspec, 'name: project'); |
| - resourceProvider.newFolder(example); |
| - manager |
| - .setRoots(<String>[project, example], <String>[], <String, String>{}); |
| - // verify |
| - { |
| - ContextInfo rootInfo = manager.rootInfo; |
| - expect(rootInfo.children, hasLength(1)); |
| - { |
| - ContextInfo projectInfo = rootInfo.children[0]; |
| - expect(projectInfo.folder.path, project); |
| - expect(projectInfo.children, isEmpty); |
| - } |
| - } |
| - expect(callbacks.currentContextPaths, hasLength(1)); |
| - expect(callbacks.currentContextPaths, unorderedEquals([project])); |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + resourceProvider.newFile(subPubspec, ''); |
| + resourceProvider.newFile(subFile, 'library sub;'); |
| + // set roots |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root, subProject]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProject, [subFile]); |
| + // add pubspec - ignore, because is already in a packagespec-based context |
| + resourceProvider.newFile(subSubPubspec, ''); |
| + return pumpEventQueue().then((_) { |
| + callbacks.assertContextPaths([root, subProject]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProject, [subFile]); |
| + }); |
| } |
| - void test_setRoots_nested_includedByOuter_twoPubspecs() { |
| - String project = '/project'; |
| - String projectPubspec = '$project/pubspec.yaml'; |
| - String example = '$project/example'; |
| - String examplePubspec = '$example/pubspec.yaml'; |
| + test_watch_addPackagespec_toSubFolder_withPubspec() { |
| + // prepare paths |
| + String root = '/root'; |
| + String rootFile = '$root/root.dart'; |
| + String subProject = '$root/sub/aaa'; |
| + String subPackagespec = '$subProject/.packages'; |
| + String subPubspec = '$subProject/pubspec.yaml'; |
| + String subFile = '$subProject/bin/a.dart'; |
| // create files |
| - resourceProvider.newFile(projectPubspec, 'name: project'); |
| - resourceProvider.newFile(examplePubspec, 'name: example'); |
| - manager |
| - .setRoots(<String>[project, example], <String>[], <String, String>{}); |
| - // verify |
| - { |
| - ContextInfo rootInfo = manager.rootInfo; |
| - expect(rootInfo.children, hasLength(1)); |
| - { |
| - ContextInfo projectInfo = rootInfo.children[0]; |
| - expect(projectInfo.folder.path, project); |
| - expect(projectInfo.children, hasLength(1)); |
| - { |
| - ContextInfo exampleInfo = projectInfo.children[0]; |
| - expect(exampleInfo.folder.path, example); |
| - expect(exampleInfo.children, isEmpty); |
| - } |
| - } |
| - } |
| - expect(callbacks.currentContextPaths, hasLength(2)); |
| - expect(callbacks.currentContextPaths, unorderedEquals([project, example])); |
| - } |
| + resourceProvider.newFile(subPubspec, 'pubspec'); |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + resourceProvider.newFile(subFile, 'library a;'); |
| + // set roots |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root, subProject]); |
| + // verify files |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProject, [subFile]); |
| - void test_setRoots_newFolderWithPackageRoot() { |
| - String packageRootPath = '/package'; |
| - manager.setRoots(<String>[projPath], <String>[], |
| - <String, String>{projPath: packageRootPath}); |
| - _checkPackageRoot(projPath, equals(packageRootPath)); |
| + // add .packages |
| + resourceProvider.newFile(subPackagespec, ''); |
| + return pumpEventQueue().then((_) { |
| + // Should NOT create another context. |
| + callbacks.assertContextPaths([root, subProject]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProject, [subFile]); |
| + }); |
| } |
| - void test_setRoots_newlyAddedFoldersGetProperPackageMap() { |
| - String packagePath = '/package/foo'; |
| - Folder packageFolder = resourceProvider.newFolder(packagePath); |
| - packageMapProvider.packageMap = { |
| - 'foo': [packageFolder] |
| - }; |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - expect(_currentPackageMap, equals(packageMapProvider.packageMap)); |
| + test_watch_addPubspec_toRoot() { |
| + // prepare paths |
| + String root = '/root'; |
| + String rootFile = '$root/root.dart'; |
| + String rootPubspec = '$root/pubspec.yaml'; |
| + // create files |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + // set roots |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root]); |
| + // verify files |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + // add pubspec - still just one root |
| + resourceProvider.newFile(rootPubspec, 'pubspec'); |
| + return pumpEventQueue().then((_) { |
| + callbacks.assertContextPaths([root]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + }); |
| } |
| - void test_setRoots_noContext_excludedFolder() { |
| + test_watch_addPubspec_toSubFolder() { |
| // prepare paths |
| - String project = '/project'; |
| - String excludedFolder = '$project/excluded'; |
| - String excludedPubspec = '$excludedFolder/pubspec.yaml'; |
| + String root = '/root'; |
| + String rootFile = '$root/root.dart'; |
| + String subProject = '$root/sub/aaa'; |
| + String subPubspec = '$subProject/pubspec.yaml'; |
| + String subFile = '$subProject/bin/a.dart'; |
| // create files |
| - resourceProvider.newFile(excludedPubspec, 'name: ignore-me'); |
| - // set "/project", and exclude "/project/excluded" |
| - manager.setRoots( |
| - <String>[project], <String>[excludedFolder], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + resourceProvider.newFile(subFile, 'library a;'); |
| + // set roots |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root]); |
| + // verify files |
| + callbacks.assertContextFiles(root, [rootFile, subFile]); |
| + // add pubspec |
| + resourceProvider.newFile(subPubspec, 'pubspec'); |
| + return pumpEventQueue().then((_) { |
| + callbacks.assertContextPaths([root, subProject]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProject, [subFile]); |
| + }); |
| } |
| - void test_setRoots_noContext_inDotFolder() { |
| - String pubspecPath = posix.join(projPath, '.pub', 'pubspec.yaml'); |
| - resourceProvider.newFile(pubspecPath, 'name: test'); |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // verify |
| - expect(callbacks.currentContextPaths, hasLength(1)); |
| - expect(callbacks.currentContextPaths, contains(projPath)); |
| - expect(callbacks.currentContextFilePaths[projPath], hasLength(0)); |
| + test_watch_addPubspec_toSubFolder_ofSubFolder() { |
| + // prepare paths |
| + String root = '/root'; |
| + String rootFile = '$root/root.dart'; |
| + String subProject = '$root/sub'; |
| + String subPubspec = '$subProject/pubspec.yaml'; |
| + String subFile = '$subProject/bin/sub.dart'; |
| + String subSubPubspec = '$subProject/subsub/pubspec.yaml'; |
| + // create files |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + resourceProvider.newFile(subPubspec, 'pubspec'); |
| + resourceProvider.newFile(subFile, 'library sub;'); |
| + // set roots |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root, subProject]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProject, [subFile]); |
| + // add pubspec - ignore, because is already in a pubspec-based context |
| + resourceProvider.newFile(subSubPubspec, 'pubspec'); |
| + return pumpEventQueue().then((_) { |
| + callbacks.assertContextPaths([root, subProject]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProject, [subFile]); |
| + }); |
| } |
| - void test_setRoots_noContext_inPackagesFolder() { |
| - String pubspecPath = posix.join(projPath, 'packages', 'pubspec.yaml'); |
| - resourceProvider.newFile(pubspecPath, 'name: test'); |
| + test_watch_deleteFile() { |
| + String filePath = posix.join(projPath, 'foo.dart'); |
| + // add root with a file |
| + File file = resourceProvider.newFile(filePath, 'contents'); |
| + Folder projFolder = file.parent; |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // verify |
| - expect(callbacks.currentContextPaths, hasLength(1)); |
| - expect(callbacks.currentContextPaths, contains(projPath)); |
| - expect(callbacks.currentContextFilePaths[projPath], hasLength(0)); |
| + // the file was added |
| + Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| + expect(filePaths, hasLength(1)); |
| + expect(filePaths, contains(filePath)); |
| + expect(file.exists, isTrue); |
| + expect(projFolder.exists, isTrue); |
| + // delete the file |
| + resourceProvider.deleteFile(filePath); |
| + return pumpEventQueue().then((_) { |
| + expect(file.exists, isFalse); |
| + expect(projFolder.exists, isTrue); |
| + return expect(filePaths, hasLength(0)); |
| + }); |
| } |
| - void test_setRoots_packageResolver() { |
| - Uri uri = Uri.parse('package:foo/foo.dart'); |
| - Source source = new TestSource(); |
| - packageResolver = new TestUriResolver({uri: source}); |
| + test_watch_deleteFolder() { |
| String filePath = posix.join(projPath, 'foo.dart'); |
| - resourceProvider.newFile(filePath, 'contents'); |
| + // add root with a file |
| + File file = resourceProvider.newFile(filePath, 'contents'); |
| + Folder projFolder = file.parent; |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - |
| - List<AnalysisContext> contextsInAnalysisRoot = |
| - manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| - expect(contextsInAnalysisRoot, hasLength(1)); |
| - AnalysisContext context = contextsInAnalysisRoot[0]; |
| - expect(context, isNotNull); |
| - Source result = context.sourceFactory.forUri2(uri); |
| - expect(result, same(source)); |
| + // the file was added |
| + Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| + expect(filePaths, hasLength(1)); |
| + expect(filePaths, contains(filePath)); |
| + expect(file.exists, isTrue); |
| + expect(projFolder.exists, isTrue); |
| + // delete the folder |
| + resourceProvider.deleteFolder(projPath); |
| + return pumpEventQueue().then((_) { |
| + expect(file.exists, isFalse); |
| + expect(projFolder.exists, isFalse); |
| + return expect(filePaths, hasLength(0)); |
| + }); |
| } |
| - void test_setRoots_pathContainsDotFile() { |
| - // If the path to a file (relative to the context root) contains a folder |
| - // whose name begins with '.', then the file is ignored. |
| - String project = '/project'; |
| - String fileA = '$project/foo.dart'; |
| - String fileB = '$project/.pub/bar.dart'; |
| - resourceProvider.newFile(fileA, ''); |
| - resourceProvider.newFile(fileB, ''); |
| - manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA]); |
| + test_watch_deletePackagespec_fromRoot() { |
| + // prepare paths |
| + String root = '/root'; |
| + String rootPubspec = '$root/.packages'; |
| + String rootFile = '$root/root.dart'; |
| + // create files |
| + resourceProvider.newFile(rootPubspec, ''); |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + // set roots |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + // delete the pubspec |
| + resourceProvider.deleteFile(rootPubspec); |
| + return pumpEventQueue().then((_) { |
| + callbacks.assertContextPaths([root]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + }); |
| } |
| - void test_setRoots_removeFolderWithoutPubspec() { |
| - packageMapProvider.packageMap = null; |
| - // add one root - there is a context |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - expect(callbacks.currentContextPaths, hasLength(1)); |
| - // set empty roots - no contexts |
| - manager.setRoots(<String>[], <String>[], <String, String>{}); |
| - expect(callbacks.currentContextPaths, hasLength(0)); |
| - expect(callbacks.currentContextFilePaths, hasLength(0)); |
| - } |
| - |
| - void test_setRoots_removeFolderWithPackagespec() { |
| - // create a pubspec |
| - String pubspecPath = posix.join(projPath, '.packages'); |
| - resourceProvider.newFile(pubspecPath, ''); |
| - // add one root - there is a context |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - expect(manager.changeSubscriptions, hasLength(1)); |
| - expect(callbacks.currentContextPaths, hasLength(1)); |
| - // set empty roots - no contexts |
| - manager.setRoots(<String>[], <String>[], <String, String>{}); |
| - expect(manager.changeSubscriptions, hasLength(0)); |
| - expect(callbacks.currentContextPaths, hasLength(0)); |
| - expect(callbacks.currentContextFilePaths, hasLength(0)); |
| - } |
| - |
| - void test_setRoots_removeFolderWithPackagespecFolder() { |
| + test_watch_deletePackagespec_fromSubFolder() { |
| // prepare paths |
| - String projectA = '/projectA'; |
| - String projectB = '/projectB'; |
| - String subProjectA = '$projectA/sub'; |
| - String subProjectB = '$projectB/sub'; |
| - String projectA_file = '$projectA/a.dart'; |
| - String projectB_file = '$projectB/a.dart'; |
| - String subProjectA_pubspec = '$subProjectA/.packages'; |
| - String subProjectB_pubspec = '$subProjectB/.packages'; |
| - String subProjectA_file = '$subProjectA/bin/sub_a.dart'; |
| - String subProjectB_file = '$subProjectB/bin/sub_b.dart'; |
| + String root = '/root'; |
| + String rootFile = '$root/root.dart'; |
| + String subProject = '$root/sub/aaa'; |
| + String subPubspec = '$subProject/.packages'; |
| + String subFile = '$subProject/bin/a.dart'; |
| // create files |
| - resourceProvider.newFile(projectA_file, '// a'); |
| - resourceProvider.newFile(projectB_file, '// b'); |
| - resourceProvider.newFile(subProjectA_pubspec, ''); |
| - resourceProvider.newFile(subProjectB_pubspec, ''); |
| - resourceProvider.newFile(subProjectA_file, '// sub-a'); |
| - resourceProvider.newFile(subProjectB_file, '// sub-b'); |
| + resourceProvider.newFile(subPubspec, ''); |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + resourceProvider.newFile(subFile, 'library a;'); |
| // set roots |
| - manager |
| - .setRoots(<String>[projectA, projectB], <String>[], <String, String>{}); |
| - callbacks |
| - .assertContextPaths([projectA, subProjectA, projectB, subProjectB]); |
| - callbacks.assertContextFiles(projectA, [projectA_file]); |
| - callbacks.assertContextFiles(projectB, [projectB_file]); |
| - callbacks.assertContextFiles(subProjectA, [subProjectA_file]); |
| - callbacks.assertContextFiles(subProjectB, [subProjectB_file]); |
| - // remove "projectB" |
| - manager.setRoots(<String>[projectA], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([projectA, subProjectA]); |
| - callbacks.assertContextFiles(projectA, [projectA_file]); |
| - callbacks.assertContextFiles(subProjectA, [subProjectA_file]); |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root, subProject]); |
| + // verify files |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProject, [subFile]); |
| + // delete the pubspec |
| + resourceProvider.deleteFile(subPubspec); |
| + return pumpEventQueue().then((_) { |
| + callbacks.assertContextPaths([root]); |
| + callbacks.assertContextFiles(root, [rootFile, subFile]); |
| + }); |
| } |
| - void test_setRoots_removeFolderWithPubspec() { |
| - // create a pubspec |
| - String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
| - resourceProvider.newFile(pubspecPath, 'pubspec'); |
| - // add one root - there is a context |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - expect(callbacks.currentContextPaths, hasLength(1)); |
| - // set empty roots - no contexts |
| - manager.setRoots(<String>[], <String>[], <String, String>{}); |
| - expect(callbacks.currentContextPaths, hasLength(0)); |
| - expect(callbacks.currentContextFilePaths, hasLength(0)); |
| + test_watch_deletePackagespec_fromSubFolder_withPubspec() { |
| + // prepare paths: |
| + // |
| + // root |
| + // root.dart |
| + // sub |
| + // aaa |
| + // .packages |
| + // pubspec.yaml |
| + // bin |
| + // a.dart |
| + // |
| + String root = '/root'; |
| + String rootFile = '$root/root.dart'; |
| + String subProject = '$root/sub/aaa'; |
| + String subPackagespec = '$subProject/.packages'; |
| + String subPubspec = '$subProject/pubspec.yaml'; |
| + String subFile = '$subProject/bin/a.dart'; |
| + // create files |
| + resourceProvider.newFile(subPackagespec, ''); |
| + resourceProvider.newFile(subPubspec, 'pubspec'); |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + resourceProvider.newFile(subFile, 'library a;'); |
| + // set roots |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root, subProject]); |
| + // verify files |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProject, [subFile]); |
| + // delete the packagespec |
| + resourceProvider.deleteFile(subPackagespec); |
| + return pumpEventQueue().then((_) { |
| + // Should NOT merge |
| + callbacks.assertContextPaths([root, subProject]); |
| + callbacks.assertContextFiles(subProject, [subFile]); |
| + }); |
| } |
| - void test_setRoots_removeFolderWithPubspecFolder() { |
| + test_watch_deletePubspec_fromRoot() { |
| // prepare paths |
| - String projectA = '/projectA'; |
| - String projectB = '/projectB'; |
| - String subProjectA = '$projectA/sub'; |
| - String subProjectB = '$projectB/sub'; |
| - String projectA_file = '$projectA/a.dart'; |
| - String projectB_file = '$projectB/a.dart'; |
| - String subProjectA_pubspec = '$subProjectA/pubspec.yaml'; |
| - String subProjectB_pubspec = '$subProjectB/pubspec.yaml'; |
| - String subProjectA_file = '$subProjectA/bin/sub_a.dart'; |
| - String subProjectB_file = '$subProjectB/bin/sub_b.dart'; |
| + String root = '/root'; |
| + String rootPubspec = '$root/pubspec.yaml'; |
| + String rootFile = '$root/root.dart'; |
| // create files |
| - resourceProvider.newFile(projectA_file, '// a'); |
| - resourceProvider.newFile(projectB_file, '// b'); |
| - resourceProvider.newFile(subProjectA_pubspec, 'pubspec'); |
| - resourceProvider.newFile(subProjectB_pubspec, 'pubspec'); |
| - resourceProvider.newFile(subProjectA_file, '// sub-a'); |
| - resourceProvider.newFile(subProjectB_file, '// sub-b'); |
| + resourceProvider.newFile(rootPubspec, 'pubspec'); |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| // set roots |
| - manager |
| - .setRoots(<String>[projectA, projectB], <String>[], <String, String>{}); |
| - callbacks |
| - .assertContextPaths([projectA, subProjectA, projectB, subProjectB]); |
| - callbacks.assertContextFiles(projectA, [projectA_file]); |
| - callbacks.assertContextFiles(projectB, [projectB_file]); |
| - callbacks.assertContextFiles(subProjectA, [subProjectA_file]); |
| - callbacks.assertContextFiles(subProjectB, [subProjectB_file]); |
| - // remove "projectB" |
| - manager.setRoots(<String>[projectA], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([projectA, subProjectA]); |
| - callbacks.assertContextFiles(projectA, [projectA_file]); |
| - callbacks.assertContextFiles(subProjectA, [subProjectA_file]); |
| - } |
| - |
| - void test_setRoots_removePackageRoot() { |
| - String packagePathFoo = '/package1/foo'; |
| - String packageRootPath = '/package2/foo'; |
| - Folder packageFolder = resourceProvider.newFolder(packagePathFoo); |
| - packageMapProvider.packageMap = { |
| - 'foo': [packageFolder] |
| - }; |
| - List<String> includedPaths = <String>[projPath]; |
| - List<String> excludedPaths = <String>[]; |
| - manager.setRoots(includedPaths, excludedPaths, |
| - <String, String>{projPath: packageRootPath}); |
| - _checkPackageRoot(projPath, equals(packageRootPath)); |
| - manager.setRoots(includedPaths, excludedPaths, <String, String>{}); |
| - expect(_currentPackageMap, equals(packageMapProvider.packageMap)); |
| - } |
| - |
| - void test_setRoots_rootPathContainsDotFile() { |
| - // If the path to the context root itself contains a folder whose name |
| - // begins with '.', then that is not sufficient to cause any files in the |
| - // context to be ignored. |
| - String project = '/.pub/project'; |
| - String fileA = '$project/foo.dart'; |
| - resourceProvider.newFile(fileA, ''); |
| - manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA]); |
| - } |
| - |
| - test_strong_mode_analysis_option() async { |
| - // Create files. |
| - newFile( |
| - [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
| - r''' |
| -analyzer: |
| - strong-mode: true |
| -'''); |
| - String libPath = newFolder([projPath, LIB_NAME]); |
| - newFile([libPath, 'main.dart']); |
| - // Setup context. |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // Verify that analysis options was parsed and strong-mode set. |
| - Map<String, int> fileTimestamps = |
| - callbacks.currentContextFilePaths[projPath]; |
| - expect(fileTimestamps, isNotEmpty); |
| - expect(callbacks.currentContext.analysisOptions.strongMode, true); |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + // delete the pubspec |
| + resourceProvider.deleteFile(rootPubspec); |
| + return pumpEventQueue().then((_) { |
| + callbacks.assertContextPaths([root]); |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + }); |
| } |
| - test_watch_addDummyLink() { |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // empty folder initially |
| - Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| - expect(filePaths, isEmpty); |
| - // add link |
| - String filePath = posix.join(projPath, 'foo.dart'); |
| - resourceProvider.newDummyLink(filePath); |
| - // the link was ignored |
| + test_watch_deletePubspec_fromSubFolder() { |
| + // prepare paths |
| + String root = '/root'; |
| + String rootFile = '$root/root.dart'; |
| + String subProject = '$root/sub/aaa'; |
| + String subPubspec = '$subProject/pubspec.yaml'; |
| + String subFile = '$subProject/bin/a.dart'; |
| + // create files |
| + resourceProvider.newFile(subPubspec, 'pubspec'); |
| + resourceProvider.newFile(rootFile, 'library root;'); |
| + resourceProvider.newFile(subFile, 'library a;'); |
| + // set roots |
| + manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| + callbacks.assertContextPaths([root, subProject]); |
| + // verify files |
| + callbacks.assertContextFiles(root, [rootFile]); |
| + callbacks.assertContextFiles(subProject, [subFile]); |
| + // delete the pubspec |
| + resourceProvider.deleteFile(subPubspec); |
| return pumpEventQueue().then((_) { |
| - expect(filePaths, isEmpty); |
| + callbacks.assertContextPaths([root]); |
| + callbacks.assertContextFiles(root, [rootFile, subFile]); |
| }); |
| } |
| - test_watch_addFile() { |
| - manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // empty folder initially |
| - Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| - expect(filePaths, hasLength(0)); |
| - // add file |
| + test_watch_modifyFile() { |
| String filePath = posix.join(projPath, 'foo.dart'); |
| + // add root with a file |
| resourceProvider.newFile(filePath, 'contents'); |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| // the file was added |
| + Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| + expect(filePaths, hasLength(1)); |
| + expect(filePaths, contains(filePath)); |
| + expect(filePaths[filePath], equals(callbacks.now)); |
| + // update the file |
| + callbacks.now++; |
| + resourceProvider.modifyFile(filePath, 'new contents'); |
| return pumpEventQueue().then((_) { |
| - expect(filePaths, hasLength(1)); |
| - expect(filePaths, contains(filePath)); |
| + return expect(filePaths[filePath], equals(callbacks.now)); |
| }); |
| } |
| - test_watch_addFile_excluded() { |
| - // prepare paths |
| - String project = '/project'; |
| - String folderA = '$project/aaa'; |
| - String folderB = '$project/bbb'; |
| - String fileA = '$folderA/a.dart'; |
| - String fileB = '$folderB/b.dart'; |
| - // create files |
| - resourceProvider.newFile(fileA, 'library a;'); |
| - // set roots |
| - manager.setRoots(<String>[project], <String>[folderB], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA]); |
| - // add a file, ignored as excluded |
| - resourceProvider.newFile(fileB, 'library b;'); |
| - return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA]); |
| - }); |
| - } |
| - |
| - test_watch_addFile_inDocFolder_inner() { |
| - // prepare paths |
| - String project = '/project'; |
| - String fileA = '$project/a.dart'; |
| - String fileB = '$project/lib/doc/b.dart'; |
| - // create files |
| - resourceProvider.newFile(fileA, ''); |
| - // set roots |
| - manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA]); |
| - // add a "lib/doc" file, it is not ignored |
| - resourceProvider.newFile(fileB, ''); |
| + test_watch_modifyPackageMapDependency() { |
| + // create a dependency file |
| + String dependencyPath = posix.join(projPath, 'dep'); |
| + resourceProvider.newFile(dependencyPath, 'contents'); |
| + packageMapProvider.dependencies.add(dependencyPath); |
| + // create a Dart file |
| + String dartFilePath = posix.join(projPath, 'main.dart'); |
| + resourceProvider.newFile(dartFilePath, 'contents'); |
| + // the created context has the expected empty package map |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + expect(_currentPackageMap, isEmpty); |
| + // configure package map |
| + String packagePath = '/package/foo'; |
| + resourceProvider.newFolder(packagePath); |
| + packageMapProvider.packageMap = { |
| + 'foo': [resourceProvider.newFolder(projPath)] |
| + }; |
| + // Changing a .dart file in the project shouldn't cause a new |
| + // package map to be picked up. |
| + resourceProvider.modifyFile(dartFilePath, 'new contents'); |
| return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA, fileB]); |
| + expect(_currentPackageMap, isEmpty); |
| + // However, changing the package map dependency should. |
| + resourceProvider.modifyFile(dependencyPath, 'new contents'); |
| + return pumpEventQueue().then((_) { |
| + expect(_currentPackageMap, equals(packageMapProvider.packageMap)); |
| + }); |
| }); |
| } |
| - test_watch_addFile_inDocFolder_topLevel() { |
| - // prepare paths |
| - String project = '/project'; |
| - String fileA = '$project/a.dart'; |
| - String fileB = '$project/doc/b.dart'; |
| - // create files |
| - resourceProvider.newFile(fileA, ''); |
| - // set roots |
| - manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA]); |
| - // add a "doc" file, it is ignored |
| - resourceProvider.newFile(fileB, ''); |
| + test_watch_modifyPackageMapDependency_fail() { |
| + // create a dependency file |
| + String dependencyPath = posix.join(projPath, 'dep'); |
| + resourceProvider.newFile(dependencyPath, 'contents'); |
| + packageMapProvider.dependencies.add(dependencyPath); |
| + // create a Dart file |
| + String dartFilePath = posix.join(projPath, 'main.dart'); |
| + resourceProvider.newFile(dartFilePath, 'contents'); |
| + // the created context has the expected empty package map |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + expect(_currentPackageMap, isEmpty); |
| + // Change the package map dependency so that the packageMapProvider is |
| + // re-run, and arrange for it to return null from computePackageMap(). |
| + packageMapProvider.packageMap = null; |
| + resourceProvider.modifyFile(dependencyPath, 'new contents'); |
| return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA]); |
| + // The package map should have been changed to null. |
| + expect(_currentPackageMap, isNull); |
| }); |
| } |
| - test_watch_addFile_pathContainsDotFile() async { |
| - // If a file is added and the path to it (relative to the context root) |
| - // contains a folder whose name begins with '.', then the file is ignored. |
| - String project = '/project'; |
| - String fileA = '$project/foo.dart'; |
| - String fileB = '$project/.pub/bar.dart'; |
| - resourceProvider.newFile(fileA, ''); |
| - manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA]); |
| - resourceProvider.newFile(fileB, ''); |
| - await pumpEventQueue(); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA]); |
| - } |
| + test_watch_modifyPackagespec() { |
| + String packagesPath = '$projPath/.packages'; |
| + String filePath = '$projPath/bin/main.dart'; |
| - test_watch_addFile_rootPathContainsDotFile() async { |
| - // If a file is added and the path to the context contains a folder whose |
| - // name begins with '.', then the file is not ignored. |
| - String project = '/.pub/project'; |
| - String fileA = '$project/foo.dart'; |
| - String fileB = '$project/bar/baz.dart'; |
| - resourceProvider.newFile(fileA, ''); |
| - manager.setRoots(<String>[project], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA]); |
| - resourceProvider.newFile(fileB, ''); |
| - await pumpEventQueue(); |
| - callbacks.assertContextPaths([project]); |
| - callbacks.assertContextFiles(project, [fileA, fileB]); |
| - } |
| + resourceProvider.newFile(packagesPath, ''); |
| + resourceProvider.newFile(filePath, 'library main;'); |
| - test_watch_addFileInSubfolder() { |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // empty folder initially |
| + |
| Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| - expect(filePaths, hasLength(0)); |
| - // add file in subfolder |
| - String filePath = posix.join(projPath, 'foo', 'bar.dart'); |
| - resourceProvider.newFile(filePath, 'contents'); |
| - // the file was added |
| - return pumpEventQueue().then((_) { |
| - expect(filePaths, hasLength(1)); |
| - expect(filePaths, contains(filePath)); |
| - }); |
| - } |
| + expect(filePaths, hasLength(1)); |
| + expect(filePaths, contains(filePath)); |
| + expect(_currentPackageMap, isEmpty); |
| - test_watch_addPackagespec_toRoot() { |
| - // prepare paths |
| - String root = '/root'; |
| - String rootFile = '$root/root.dart'; |
| - String rootPackagespec = '$root/.packages'; |
| - // create files |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root]); |
| - // verify files |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - // add packagespec - still just one root |
| - resourceProvider.newFile(rootPackagespec, ''); |
| + // update .packages |
| + callbacks.now++; |
| + resourceProvider.modifyFile(packagesPath, 'main:./lib/'); |
| return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([root]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - // TODO(pquitslund): verify that a new source factory is created -- |
| - // likely this will need to happen in a corresponding ServerContextManagerTest. |
| + // verify new package info |
| + expect(_currentPackageMap.keys, unorderedEquals(['main'])); |
| }); |
| } |
| - test_watch_addPackagespec_toSubFolder() { |
| - // prepare paths |
| - String root = '/root'; |
| - String rootFile = '$root/root.dart'; |
| - String subProject = '$root/sub/aaa'; |
| - String subPubspec = '$subProject/.packages'; |
| - String subFile = '$subProject/bin/a.dart'; |
| - // create files |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - resourceProvider.newFile(subFile, 'library a;'); |
| - // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root]); |
| - // verify files |
| - callbacks.assertContextFiles(root, [rootFile, subFile]); |
| - // add .packages |
| - resourceProvider.newFile(subPubspec, ''); |
| - return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([root, subProject]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - callbacks.assertContextFiles(subProject, [subFile]); |
| - }); |
| + /** |
| + * Verify that package URI's for source files in [path] will be resolved |
| + * using a package root matching [expectation]. |
| + */ |
| + void _checkPackageRoot(String path, expectation) { |
| + // TODO(brianwilkerson) Figure out how to test this. Possibly by comparing |
| + // the contents of the package map (although that approach doesn't work at |
| + // the moment). |
| +// FolderDisposition disposition = callbacks.currentContextDispositions[path]; |
| +// expect(disposition.packageRoot, expectation); |
| + // TODO(paulberry): we should also verify that the package map itself is |
| + // correct. See dartbug.com/23909. |
| } |
| - test_watch_addPackagespec_toSubFolder_ofSubFolder() { |
| - // prepare paths |
| - String root = '/root'; |
| - String rootFile = '$root/root.dart'; |
| - String subProject = '$root/sub'; |
| - String subPubspec = '$subProject/.packages'; |
| - String subFile = '$subProject/bin/sub.dart'; |
| - String subSubPubspec = '$subProject/subsub/.packages'; |
| - // create files |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - resourceProvider.newFile(subPubspec, ''); |
| - resourceProvider.newFile(subFile, 'library sub;'); |
| - // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root, subProject]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - callbacks.assertContextFiles(subProject, [subFile]); |
| - // add pubspec - ignore, because is already in a packagespec-based context |
| - resourceProvider.newFile(subSubPubspec, ''); |
| - return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([root, subProject]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - callbacks.assertContextFiles(subProject, [subFile]); |
| - }); |
| + Map<String, List<Folder>> _packageMap(String contextPath) { |
| + Folder folder = resourceProvider.getFolder(contextPath); |
| + return manager.folderMap[folder]?.sourceFactory?.packageMap; |
| } |
| +} |
| - test_watch_addPackagespec_toSubFolder_withPubspec() { |
| - // prepare paths |
| - String root = '/root'; |
| - String rootFile = '$root/root.dart'; |
| - String subProject = '$root/sub/aaa'; |
| - String subPackagespec = '$subProject/.packages'; |
| - String subPubspec = '$subProject/pubspec.yaml'; |
| - String subFile = '$subProject/bin/a.dart'; |
| - // create files |
| - resourceProvider.newFile(subPubspec, 'pubspec'); |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - resourceProvider.newFile(subFile, 'library a;'); |
| - // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root, subProject]); |
| - // verify files |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - callbacks.assertContextFiles(subProject, [subFile]); |
| +abstract class ContextManagerTest { |
| + /** |
| + * The name of the 'bin' directory. |
| + */ |
| + static const String BIN_NAME = 'bin'; |
| - // add .packages |
| - resourceProvider.newFile(subPackagespec, ''); |
| - return pumpEventQueue().then((_) { |
| - // Should NOT create another context. |
| - callbacks.assertContextPaths([root, subProject]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - callbacks.assertContextFiles(subProject, [subFile]); |
| - }); |
| + /** |
| + * The name of the 'example' directory. |
| + */ |
| + static const String EXAMPLE_NAME = 'example'; |
| + |
| + /** |
| + * The name of the 'lib' directory. |
| + */ |
| + static const String LIB_NAME = 'lib'; |
| + |
| + /** |
| + * The name of the 'src' directory. |
| + */ |
| + static const String SRC_NAME = 'src'; |
| + |
| + /** |
| + * The name of the 'test' directory. |
| + */ |
| + static const String TEST_NAME = 'test'; |
| + |
| + ContextManagerImpl manager; |
| + |
| + TestContextManagerCallbacks callbacks; |
| + |
| + MemoryResourceProvider resourceProvider; |
| + |
| + MockPackageMapProvider packageMapProvider; |
| + |
| + UriResolver packageResolver = null; |
| + |
| + UriResolver embeddedUriResolver = null; |
| + |
| + String projPath = '/my/proj'; |
| + |
| + AnalysisError missing_required_param = new AnalysisError( |
| + new TestSource(), 0, 1, HintCode.MISSING_REQUIRED_PARAM, [ |
| + ['x'] |
| + ]); |
| + |
| + AnalysisError missing_return = |
| + new AnalysisError(new TestSource(), 0, 1, HintCode.MISSING_RETURN, [ |
| + ['x'] |
| + ]); |
| + |
| + AnalysisError invalid_assignment_error = |
| + new AnalysisError(new TestSource(), 0, 1, HintCode.INVALID_ASSIGNMENT, [ |
| + ['x'], |
| + ['y'] |
| + ]); |
| + |
| + AnalysisError unused_local_variable = new AnalysisError( |
| + new TestSource(), 0, 1, HintCode.UNUSED_LOCAL_VARIABLE, [ |
| + ['x'] |
| + ]); |
| + |
| + List<Glob> get analysisFilesGlobs { |
| + List<String> patterns = <String>[ |
| + '**/*.${AnalysisEngine.SUFFIX_DART}', |
| + '**/*.${AnalysisEngine.SUFFIX_HTML}', |
| + '**/*.${AnalysisEngine.SUFFIX_HTM}', |
| + '**/${AnalysisEngine.ANALYSIS_OPTIONS_FILE}', |
| + '**/${AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE}' |
| + ]; |
| + return patterns |
| + .map((pattern) => new Glob(JavaFile.pathContext.separator, pattern)) |
| + .toList(); |
| } |
| - test_watch_addPubspec_toRoot() { |
| - // prepare paths |
| - String root = '/root'; |
| - String rootFile = '$root/root.dart'; |
| - String rootPubspec = '$root/pubspec.yaml'; |
| - // create files |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root]); |
| - // verify files |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - // add pubspec - still just one root |
| - resourceProvider.newFile(rootPubspec, 'pubspec'); |
| - return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([root]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - }); |
| + List<ErrorProcessor> get errorProcessors => callbacks.currentContext |
| + .getConfigurationData(CONFIGURED_ERROR_PROCESSORS); |
| + |
| + List<Linter> get lints => getLints(callbacks.currentContext); |
| + |
| + AnalysisOptions get options => callbacks.currentContext.analysisOptions; |
| + |
| + Map<String, List<Folder>> get _currentPackageMap => _packageMap(projPath); |
| + |
| + void deleteFile(List<String> pathComponents) { |
| + String filePath = posix.joinAll(pathComponents); |
| + resourceProvider.deleteFile(filePath); |
| } |
| - test_watch_addPubspec_toSubFolder() { |
| - // prepare paths |
| - String root = '/root'; |
| - String rootFile = '$root/root.dart'; |
| - String subProject = '$root/sub/aaa'; |
| - String subPubspec = '$subProject/pubspec.yaml'; |
| - String subFile = '$subProject/bin/a.dart'; |
| - // create files |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - resourceProvider.newFile(subFile, 'library a;'); |
| - // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root]); |
| - // verify files |
| - callbacks.assertContextFiles(root, [rootFile, subFile]); |
| - // add pubspec |
| - resourceProvider.newFile(subPubspec, 'pubspec'); |
| - return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([root, subProject]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - callbacks.assertContextFiles(subProject, [subFile]); |
| - }); |
| + ErrorProcessor getProcessor(AnalysisError error) => |
| + ErrorProcessor.getProcessor(callbacks.currentContext, error); |
| + |
| + String newFile(List<String> pathComponents, [String content = '']) { |
| + String filePath = posix.joinAll(pathComponents); |
| + resourceProvider.newFile(filePath, content); |
| + return filePath; |
| } |
| - test_watch_addPubspec_toSubFolder_ofSubFolder() { |
| - // prepare paths |
| - String root = '/root'; |
| - String rootFile = '$root/root.dart'; |
| - String subProject = '$root/sub'; |
| - String subPubspec = '$subProject/pubspec.yaml'; |
| - String subFile = '$subProject/bin/sub.dart'; |
| - String subSubPubspec = '$subProject/subsub/pubspec.yaml'; |
| - // create files |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - resourceProvider.newFile(subPubspec, 'pubspec'); |
| - resourceProvider.newFile(subFile, 'library sub;'); |
| - // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root, subProject]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - callbacks.assertContextFiles(subProject, [subFile]); |
| - // add pubspec - ignore, because is already in a pubspec-based context |
| - resourceProvider.newFile(subSubPubspec, 'pubspec'); |
| - return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([root, subProject]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - callbacks.assertContextFiles(subProject, [subFile]); |
| + String newFolder(List<String> pathComponents) { |
| + String folderPath = posix.joinAll(pathComponents); |
| + resourceProvider.newFolder(folderPath); |
| + return folderPath; |
| + } |
| + |
| + void processRequiredPlugins() { |
| + List<Plugin> plugins = <Plugin>[]; |
| + plugins.addAll(AnalysisEngine.instance.requiredPlugins); |
| + plugins.add(AnalysisEngine.instance.commandLinePlugin); |
| + plugins.add(AnalysisEngine.instance.optionsPlugin); |
| + plugins.add(linterPlugin); |
| + ExtensionManager manager = new ExtensionManager(); |
| + manager.processPlugins(plugins); |
| + } |
| + |
| + EmbedderUriResolver provideEmbeddedUriResolver(Folder folder) => |
| + embeddedUriResolver; |
| + |
| + UriResolver providePackageResolver(Folder folder) => packageResolver; |
| + |
| + void setUp() { |
| + processRequiredPlugins(); |
| + resourceProvider = new MemoryResourceProvider(); |
| + packageMapProvider = new MockPackageMapProvider(); |
| + DartSdkManager sdkManager = new DartSdkManager((_) { |
| + return new MockSdk(); |
| }); |
| + manager = new ContextManagerImpl( |
| + resourceProvider, |
| + sdkManager, |
| + providePackageResolver, |
| + provideEmbeddedUriResolver, |
| + packageMapProvider, |
| + analysisFilesGlobs, |
| + InstrumentationService.NULL_SERVICE, |
| + new AnalysisOptionsImpl()); |
| + callbacks = new TestContextManagerCallbacks(resourceProvider); |
| + manager.callbacks = callbacks; |
| + resourceProvider.newFolder(projPath); |
| + } |
| + |
| + /** |
| + * Verify that package URI's for source files in [path] will be resolved |
| + * using a package root matching [expectation]. |
| + */ |
| + void _checkPackageRoot(String path, expectation) { |
| + // TODO(brianwilkerson) Figure out how to test this. Possibly by comparing |
| + // the contents of the package map (although that approach doesn't work at |
| + // the moment). |
| +// FolderDisposition disposition = callbacks.currentContextDispositions[path]; |
| +// expect(disposition.packageRoot, expectation); |
| + // TODO(paulberry): we should also verify that the package map itself is |
| + // correct. See dartbug.com/23909. |
| + } |
| + |
| + Map<String, List<Folder>> _packageMap(String contextPath) { |
| + Folder folder = resourceProvider.getFolder(contextPath); |
| + return manager.folderMap[folder]?.sourceFactory?.packageMap; |
| + } |
| +} |
| + |
| +@reflectiveTest |
| +class ContextManagerWithNewOptionsTest extends ContextManagerWithOptionsTest { |
| + String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE; |
| +} |
| + |
| +@reflectiveTest |
| +class ContextManagerWithOldOptionsTest extends ContextManagerWithOptionsTest { |
| + String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_FILE; |
| +} |
| + |
| +abstract class ContextManagerWithOptionsTest extends ContextManagerTest { |
| + String get optionsFileName; |
| + |
| + test_analysis_options_file_delete() async { |
| + // Setup analysis options |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +embedded_libs: |
| + "dart:foobar": "../sdk_ext/entry.dart" |
| +analyzer: |
| + language: |
| + enableGenericMethods: true |
| + errors: |
| + unused_local_variable: false |
| +linter: |
| + rules: |
| + - camel_case_types |
| +'''); |
| + |
| + // Setup context. |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + await pumpEventQueue(); |
| + |
| + // Verify options were set. |
| + expect(errorProcessors, hasLength(1)); |
| + expect(lints, hasLength(1)); |
| + expect(options.enableGenericMethods, isTrue); |
| + |
| + // Remove options. |
| + deleteFile([projPath, optionsFileName]); |
| + await pumpEventQueue(); |
| + |
| + // Verify defaults restored. |
| + expect(errorProcessors, isEmpty); |
| + expect(lints, isEmpty); |
| + expect(options.enableGenericMethods, isFalse); |
| + } |
| + |
| + test_analysis_options_file_delete_with_embedder() async { |
| + // Setup _embedder.yaml. |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + newFile( |
| + [libPath, '_embedder.yaml'], |
| + r''' |
| +analyzer: |
| + strong-mode: true |
| + errors: |
| + missing_return: false |
| +linter: |
| + rules: |
| + - avoid_as |
| +'''); |
| + |
| + // Setup .packages file |
| + newFile( |
| + [projPath, '.packages'], |
| + r''' |
| +test_pack:lib/'''); |
| + |
| + // Setup analysis options |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| + language: |
| + enableGenericMethods: true |
| + errors: |
| + unused_local_variable: false |
| +linter: |
| + rules: |
| + - camel_case_types |
| +'''); |
| + |
| + // Setup context. |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + await pumpEventQueue(); |
| + |
| + // Verify options were set. |
| + expect(options.enableGenericMethods, isTrue); |
| + expect(options.strongMode, isTrue); |
| + expect(errorProcessors, hasLength(2)); |
| + expect(lints, hasLength(2)); |
| + |
| + // Remove options. |
| + deleteFile([projPath, optionsFileName]); |
| + await pumpEventQueue(); |
| + |
| + // Verify defaults restored. |
| + expect(options.enableGenericMethods, isFalse); |
| + expect(lints, hasLength(1)); |
| + expect(lints.first, new isInstanceOf<AvoidAs>()); |
| + expect(errorProcessors, hasLength(1)); |
| + expect(getProcessor(missing_return).severity, isNull); |
| + } |
| + |
| + test_analysis_options_parse_failure() async { |
| + // Create files. |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + newFile([libPath, 'main.dart']); |
| + String sdkExtPath = newFolder([projPath, 'sdk_ext']); |
| + newFile([sdkExtPath, 'entry.dart']); |
| + String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']); |
| + newFile([sdkExtSrcPath, 'part.dart']); |
| + // Setup analysis options file with ignore list. |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +; |
| +'''); |
| + // Setup context. |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + |
| + // No error means success. |
| + } |
| + |
| + test_configed_options() async { |
| + // Create files. |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + newFile([projPath, 'test', 'test.dart']); |
| + newFile( |
| + [projPath, 'pubspec.yaml'], |
| + r''' |
| +dependencies: |
| + test_pack: any |
| +analyzer: |
| + configuration: test_pack/config |
| +'''); |
| + |
| + // Setup .packages file |
| + newFile( |
| + [projPath, '.packages'], |
| + r''' |
| +test_pack:lib/'''); |
| + |
| + // Setup config.yaml. |
| + newFile( |
| + [libPath, 'config', 'config.yaml'], |
| + r''' |
| +analyzer: |
| + strong-mode: true |
| + language: |
| + enableSuperMixins: true |
| + errors: |
| + missing_return: false |
| +linter: |
| + rules: |
| + - avoid_as |
| +'''); |
| + |
| + // Setup analysis options |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| + exclude: |
| + - 'test/**' |
| + language: |
| + enableGenericMethods: true |
| + enableAsync: false |
| + errors: |
| + unused_local_variable: false |
| +linter: |
| + rules: |
| + - camel_case_types |
| +'''); |
| + |
| + // Setup context. |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + await pumpEventQueue(); |
| + |
| + // Confirm that one context was created. |
| + var contexts = |
| + manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| + expect(contexts, isNotNull); |
| + expect(contexts, hasLength(1)); |
| + |
| + var context = contexts.first; |
| + |
| + // Verify options. |
| + // * from `config.yaml`: |
| + expect(context.analysisOptions.strongMode, isTrue); |
| + expect(context.analysisOptions.enableSuperMixins, isTrue); |
| + expect(context.analysisOptions.enableAsync, isFalse); |
| + // * from analysis options: |
| + expect(context.analysisOptions.enableGenericMethods, isTrue); |
| + |
| + // * verify tests are excluded |
| + expect(callbacks.currentContextFilePaths[projPath].keys, |
| + unorderedEquals(['/my/proj/$optionsFileName'])); |
| + |
| + // Verify filter setup. |
| + expect(errorProcessors, hasLength(2)); |
| + |
| + // * (config.) |
| + expect(getProcessor(missing_return).severity, isNull); |
| + |
| + // * (options.) |
| + expect(getProcessor(unused_local_variable).severity, isNull); |
| + |
| + // Verify lints. |
| + var lintNames = lints.map((lint) => lint.name); |
| + expect( |
| + lintNames, |
| + unorderedEquals( |
| + ['avoid_as' /* config */, 'camel_case_types' /* options */])); |
| + } |
| + |
| + test_embedder_and_configed_options() async { |
| + // Create files. |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + String sdkExtPath = newFolder([projPath, 'sdk_ext']); |
| + newFile([projPath, 'test', 'test.dart']); |
| + newFile([sdkExtPath, 'entry.dart']); |
| + |
| + // Setup pubspec with configuration. |
| + newFile( |
| + [projPath, 'pubspec.yaml'], |
| + r''' |
| +dependencies: |
| + test_pack: any |
| +analyzer: |
| + configuration: test_pack/config |
| +'''); |
| + |
| + // Setup _embedder.yaml. |
| + newFile( |
| + [libPath, '_embedder.yaml'], |
| + r''' |
| +embedded_libs: |
| + "dart:foobar": "../sdk_ext/entry.dart" |
| +analyzer: |
| + strong-mode: true |
| + language: |
| + enableSuperMixins: true |
| + errors: |
| + missing_return: false |
| +linter: |
| + rules: |
| + - avoid_as |
| +'''); |
| + |
| + // Setup .packages file |
| + newFile( |
| + [projPath, '.packages'], |
| + r''' |
| +test_pack:lib/'''); |
| + |
| + // Setup analysis options |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| + exclude: |
| + - 'test/**' |
| + language: |
| + enableGenericMethods: true |
| + enableAsync: false |
| + errors: |
| + unused_local_variable: false |
| +linter: |
| + rules: |
| + - camel_case_types |
| +'''); |
| + |
| + // Setup config.yaml. |
| + newFile( |
| + [libPath, 'config', 'config.yaml'], |
| + r''' |
| +analyzer: |
| + errors: |
| + missing_required_param: error |
| +linter: |
| + rules: |
| + - always_specify_types |
| +'''); |
| + |
| + // Setup context. |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + await pumpEventQueue(); |
| + |
| + // Confirm that one context was created. |
| + var contexts = |
| + manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| + expect(contexts, isNotNull); |
| + expect(contexts, hasLength(1)); |
| + var context = contexts[0]; |
| + |
| + // Verify options. |
| + // * from `_embedder.yaml`: |
| + expect(context.analysisOptions.strongMode, isTrue); |
| + expect(context.analysisOptions.enableSuperMixins, isTrue); |
| + expect(context.analysisOptions.enableAsync, isFalse); |
| + // * from analysis options: |
| + expect(context.analysisOptions.enableGenericMethods, isTrue); |
| + |
| + // * verify tests are excluded |
| + expect( |
| + callbacks.currentContextFilePaths[projPath].keys, |
| + unorderedEquals( |
| + ['/my/proj/sdk_ext/entry.dart', '/my/proj/$optionsFileName'])); |
| + |
| + // Verify filter setup. |
| + expect(errorProcessors, hasLength(3)); |
| + |
| + // * (embedder.) |
| + expect(getProcessor(missing_return).severity, isNull); |
| + |
| + // * (config.) |
| + expect(getProcessor(missing_required_param).severity, ErrorSeverity.ERROR); |
| + |
| + // * (options.) |
| + expect(getProcessor(unused_local_variable).severity, isNull); |
| + |
| + // Verify lints. |
| + var lintNames = lints.map((lint) => lint.name); |
| + |
| + expect( |
| + lintNames, |
| + unorderedEquals([ |
| + 'avoid_as' /* embedder */, |
| + 'always_specify_types' /* config*/, |
| + 'camel_case_types' /* options */ |
| + ])); |
| + |
| + // Sanity check embedder libs. |
| + var source = context.sourceFactory.forUri('dart:foobar'); |
| + expect(source, isNotNull); |
| + expect(source.fullName, |
| + '/my/proj/sdk_ext/entry.dart'.replaceAll('/', JavaFile.separator)); |
| + } |
| + |
| + test_embedder_options() async { |
| + // Create files. |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + String sdkExtPath = newFolder([projPath, 'sdk_ext']); |
| + newFile([projPath, 'test', 'test.dart']); |
| + newFile([sdkExtPath, 'entry.dart']); |
| + // Setup _embedder.yaml. |
| + newFile( |
| + [libPath, '_embedder.yaml'], |
| + r''' |
| +embedded_libs: |
| + "dart:foobar": "../sdk_ext/entry.dart" |
| +analyzer: |
| + strong-mode: true |
| + language: |
| + enableSuperMixins: true |
| + errors: |
| + missing_return: false |
| +linter: |
| + rules: |
| + - avoid_as |
| +'''); |
| + // Setup .packages file |
| + newFile( |
| + [projPath, '.packages'], |
| + r''' |
| +test_pack:lib/'''); |
| + |
| + // Setup analysis options |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| + exclude: |
| + - 'test/**' |
| + language: |
| + enableGenericMethods: true |
| + enableAsync: false |
| + errors: |
| + unused_local_variable: false |
| +linter: |
| + rules: |
| + - camel_case_types |
| +'''); |
| + |
| + // Setup context. |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + await pumpEventQueue(); |
| + |
| + // Confirm that one context was created. |
| + var contexts = |
| + manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| + expect(contexts, isNotNull); |
| + expect(contexts, hasLength(1)); |
| + var context = contexts[0]; |
| + |
| + // Verify options. |
| + // * from `_embedder.yaml`: |
| + expect(context.analysisOptions.strongMode, isTrue); |
| + expect(context.analysisOptions.enableSuperMixins, isTrue); |
| + expect(context.analysisOptions.enableAsync, isFalse); |
| + // * from analysis options: |
| + expect(context.analysisOptions.enableGenericMethods, isTrue); |
| + |
| + // * verify tests are excluded |
| + expect( |
| + callbacks.currentContextFilePaths[projPath].keys, |
| + unorderedEquals( |
| + ['/my/proj/sdk_ext/entry.dart', '/my/proj/$optionsFileName'])); |
| + |
| + // Verify filter setup. |
| + expect(errorProcessors, hasLength(2)); |
| + |
| + // * (embedder.) |
| + expect(getProcessor(missing_return).severity, isNull); |
| + |
| + // * (options.) |
| + expect(getProcessor(unused_local_variable).severity, isNull); |
| + |
| + // Verify lints. |
| + var lintNames = lints.map((lint) => lint.name); |
| + |
| + expect( |
| + lintNames, |
| + unorderedEquals( |
| + ['avoid_as' /* embedder */, 'camel_case_types' /* options */])); |
| + |
| + // Sanity check embedder libs. |
| + var source = context.sourceFactory.forUri('dart:foobar'); |
| + expect(source, isNotNull); |
| + expect(source.fullName, |
| + '/my/proj/sdk_ext/entry.dart'.replaceAll('/', JavaFile.separator)); |
| } |
| - test_watch_deleteFile() { |
| - String filePath = posix.join(projPath, 'foo.dart'); |
| - // add root with a file |
| - File file = resourceProvider.newFile(filePath, 'contents'); |
| - Folder projFolder = file.parent; |
| + test_error_filter_analysis_option() async { |
| + // Create files. |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| + errors: |
| + unused_local_variable: ignore |
| +'''); |
| + // Setup context. |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // the file was added |
| - Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| - expect(filePaths, hasLength(1)); |
| - expect(filePaths, contains(filePath)); |
| - expect(file.exists, isTrue); |
| - expect(projFolder.exists, isTrue); |
| - // delete the file |
| - resourceProvider.deleteFile(filePath); |
| - return pumpEventQueue().then((_) { |
| - expect(file.exists, isFalse); |
| - expect(projFolder.exists, isTrue); |
| - return expect(filePaths, hasLength(0)); |
| - }); |
| + |
| + // Verify filter setup. |
| + expect(errorProcessors, hasLength(1)); |
| + expect(getProcessor(unused_local_variable).severity, isNull); |
| } |
| - test_watch_deleteFolder() { |
| - String filePath = posix.join(projPath, 'foo.dart'); |
| - // add root with a file |
| - File file = resourceProvider.newFile(filePath, 'contents'); |
| - Folder projFolder = file.parent; |
| + test_error_filter_analysis_option_multiple_filters() async { |
| + // Create files. |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| + errors: |
| + invalid_assignment: ignore |
| + unused_local_variable: error |
| +'''); |
| + // Setup context. |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // the file was added |
| - Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| - expect(filePaths, hasLength(1)); |
| - expect(filePaths, contains(filePath)); |
| - expect(file.exists, isTrue); |
| - expect(projFolder.exists, isTrue); |
| - // delete the folder |
| - resourceProvider.deleteFolder(projPath); |
| - return pumpEventQueue().then((_) { |
| - expect(file.exists, isFalse); |
| - expect(projFolder.exists, isFalse); |
| - return expect(filePaths, hasLength(0)); |
| - }); |
| - } |
| - test_watch_deletePackagespec_fromRoot() { |
| - // prepare paths |
| - String root = '/root'; |
| - String rootPubspec = '$root/.packages'; |
| - String rootFile = '$root/root.dart'; |
| - // create files |
| - resourceProvider.newFile(rootPubspec, ''); |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - // delete the pubspec |
| - resourceProvider.deleteFile(rootPubspec); |
| - return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([root]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - }); |
| - } |
| + // Verify filter setup. |
| + expect(errorProcessors, hasLength(2)); |
| - test_watch_deletePackagespec_fromSubFolder() { |
| - // prepare paths |
| - String root = '/root'; |
| - String rootFile = '$root/root.dart'; |
| - String subProject = '$root/sub/aaa'; |
| - String subPubspec = '$subProject/.packages'; |
| - String subFile = '$subProject/bin/a.dart'; |
| - // create files |
| - resourceProvider.newFile(subPubspec, ''); |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - resourceProvider.newFile(subFile, 'library a;'); |
| - // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root, subProject]); |
| - // verify files |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - callbacks.assertContextFiles(subProject, [subFile]); |
| - // delete the pubspec |
| - resourceProvider.deleteFile(subPubspec); |
| - return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([root]); |
| - callbacks.assertContextFiles(root, [rootFile, subFile]); |
| - }); |
| + expect(getProcessor(invalid_assignment_error).severity, isNull); |
| + expect(getProcessor(unused_local_variable).severity, ErrorSeverity.ERROR); |
| } |
| - test_watch_deletePackagespec_fromSubFolder_withPubspec() { |
| - // prepare paths: |
| - // |
| - // root |
| - // root.dart |
| - // sub |
| - // aaa |
| - // .packages |
| - // pubspec.yaml |
| - // bin |
| - // a.dart |
| - // |
| - String root = '/root'; |
| - String rootFile = '$root/root.dart'; |
| - String subProject = '$root/sub/aaa'; |
| - String subPackagespec = '$subProject/.packages'; |
| - String subPubspec = '$subProject/pubspec.yaml'; |
| - String subFile = '$subProject/bin/a.dart'; |
| - // create files |
| - resourceProvider.newFile(subPackagespec, ''); |
| - resourceProvider.newFile(subPubspec, 'pubspec'); |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - resourceProvider.newFile(subFile, 'library a;'); |
| - // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root, subProject]); |
| - // verify files |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - callbacks.assertContextFiles(subProject, [subFile]); |
| - // delete the packagespec |
| - resourceProvider.deleteFile(subPackagespec); |
| - return pumpEventQueue().then((_) { |
| - // Should NOT merge |
| - callbacks.assertContextPaths([root, subProject]); |
| - callbacks.assertContextFiles(subProject, [subFile]); |
| - }); |
| - } |
| + test_error_filter_analysis_option_synonyms() async { |
| + // Create files. |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| + errors: |
| + unused_local_variable: ignore |
| + ambiguous_import: false |
| +'''); |
| + // Setup context. |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - test_watch_deletePubspec_fromRoot() { |
| - // prepare paths |
| - String root = '/root'; |
| - String rootPubspec = '$root/pubspec.yaml'; |
| - String rootFile = '$root/root.dart'; |
| - // create files |
| - resourceProvider.newFile(rootPubspec, 'pubspec'); |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - // delete the pubspec |
| - resourceProvider.deleteFile(rootPubspec); |
| - return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([root]); |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - }); |
| + // Verify filter setup. |
| + expect(errorProcessors, isNotNull); |
| + expect(errorProcessors, hasLength(2)); |
| } |
| - test_watch_deletePubspec_fromSubFolder() { |
| - // prepare paths |
| - String root = '/root'; |
| - String rootFile = '$root/root.dart'; |
| - String subProject = '$root/sub/aaa'; |
| - String subPubspec = '$subProject/pubspec.yaml'; |
| - String subFile = '$subProject/bin/a.dart'; |
| - // create files |
| - resourceProvider.newFile(subPubspec, 'pubspec'); |
| - resourceProvider.newFile(rootFile, 'library root;'); |
| - resourceProvider.newFile(subFile, 'library a;'); |
| - // set roots |
| - manager.setRoots(<String>[root], <String>[], <String, String>{}); |
| - callbacks.assertContextPaths([root, subProject]); |
| - // verify files |
| - callbacks.assertContextFiles(root, [rootFile]); |
| - callbacks.assertContextFiles(subProject, [subFile]); |
| - // delete the pubspec |
| - resourceProvider.deleteFile(subPubspec); |
| - return pumpEventQueue().then((_) { |
| - callbacks.assertContextPaths([root]); |
| - callbacks.assertContextFiles(root, [rootFile, subFile]); |
| - }); |
| + test_error_filter_analysis_option_unpsecified() async { |
| + // Create files. |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| +# errors: |
| +# unused_local_variable: ignore |
| +'''); |
| + // Setup context. |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + |
| + // Verify filter setup. |
| + expect(errorProcessors, isEmpty); |
| } |
| - test_watch_modifyFile() { |
| - String filePath = posix.join(projPath, 'foo.dart'); |
| - // add root with a file |
| - resourceProvider.newFile(filePath, 'contents'); |
| + test_path_filter_analysis_option() async { |
| + // Create files. |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + newFile([libPath, 'main.dart']); |
| + newFile([libPath, 'nope.dart']); |
| + String sdkExtPath = newFolder([projPath, 'sdk_ext']); |
| + newFile([sdkExtPath, 'entry.dart']); |
| + String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']); |
| + newFile([sdkExtSrcPath, 'part.dart']); |
| + // Setup analysis options file with ignore list. |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| + exclude: |
| + - lib/nope.dart |
| + - 'sdk_ext/**' |
| +'''); |
| + // Setup context. |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - // the file was added |
| - Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| - expect(filePaths, hasLength(1)); |
| - expect(filePaths, contains(filePath)); |
| - expect(filePaths[filePath], equals(callbacks.now)); |
| - // update the file |
| - callbacks.now++; |
| - resourceProvider.modifyFile(filePath, 'new contents'); |
| - return pumpEventQueue().then((_) { |
| - return expect(filePaths[filePath], equals(callbacks.now)); |
| - }); |
| + // Verify that analysis options was parsed and the ignore patterns applied. |
| + Map<String, int> fileTimestamps = |
| + callbacks.currentContextFilePaths[projPath]; |
| + expect(fileTimestamps, isNotEmpty); |
| + List<String> files = fileTimestamps.keys.toList(); |
| + expect( |
| + files, |
| + unorderedEquals( |
| + ['/my/proj/lib/main.dart', '/my/proj/$optionsFileName'])); |
| } |
| - test_watch_modifyPackageMapDependency() { |
| - // create a dependency file |
| - String dependencyPath = posix.join(projPath, 'dep'); |
| - resourceProvider.newFile(dependencyPath, 'contents'); |
| - packageMapProvider.dependencies.add(dependencyPath); |
| - // create a Dart file |
| - String dartFilePath = posix.join(projPath, 'main.dart'); |
| - resourceProvider.newFile(dartFilePath, 'contents'); |
| - // the created context has the expected empty package map |
| + test_path_filter_child_contexts_option() async { |
| + // Create files. |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + newFile([libPath, 'main.dart']); |
| + newFile( |
| + [libPath, 'pubspec.yaml'], |
| + r''' |
| +name: foobar |
| +'''); |
| + String otherLibPath = newFolder([projPath, 'other_lib']); |
| + newFile([otherLibPath, 'entry.dart']); |
| + newFile( |
| + [otherLibPath, 'pubspec.yaml'], |
| + r''' |
| +name: other_lib |
| +'''); |
| + // Setup analysis options file with ignore list that ignores the 'other_lib' |
| + // directory by name. |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| + exclude: |
| + - 'other_lib' |
| +'''); |
| + // Setup context. |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - expect(_currentPackageMap, isEmpty); |
| - // configure package map |
| - String packagePath = '/package/foo'; |
| - resourceProvider.newFolder(packagePath); |
| - packageMapProvider.packageMap = { |
| - 'foo': [resourceProvider.newFolder(projPath)] |
| - }; |
| - // Changing a .dart file in the project shouldn't cause a new |
| - // package map to be picked up. |
| - resourceProvider.modifyFile(dartFilePath, 'new contents'); |
| - return pumpEventQueue().then((_) { |
| - expect(_currentPackageMap, isEmpty); |
| - // However, changing the package map dependency should. |
| - resourceProvider.modifyFile(dependencyPath, 'new contents'); |
| - return pumpEventQueue().then((_) { |
| - expect(_currentPackageMap, equals(packageMapProvider.packageMap)); |
| - }); |
| - }); |
| + // Verify that the context in other_lib wasn't created and that the |
| + // context in lib was created. |
| + var contexts = |
| + manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| + expect(contexts.length, 2); |
| + expect(contexts[0].name, equals('/my/proj')); |
| + expect(contexts[1].name, equals('/my/proj/lib')); |
| } |
| - test_watch_modifyPackageMapDependency_fail() { |
| - // create a dependency file |
| - String dependencyPath = posix.join(projPath, 'dep'); |
| - resourceProvider.newFile(dependencyPath, 'contents'); |
| - packageMapProvider.dependencies.add(dependencyPath); |
| - // create a Dart file |
| - String dartFilePath = posix.join(projPath, 'main.dart'); |
| - resourceProvider.newFile(dartFilePath, 'contents'); |
| - // the created context has the expected empty package map |
| + test_path_filter_recursive_wildcard_child_contexts_option() async { |
| + // Create files. |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + newFile([libPath, 'main.dart']); |
| + newFile( |
| + [libPath, 'pubspec.yaml'], |
| + r''' |
| + name: foobar |
| + '''); |
| + String otherLibPath = newFolder([projPath, 'other_lib']); |
| + newFile([otherLibPath, 'entry.dart']); |
| + newFile( |
| + [otherLibPath, 'pubspec.yaml'], |
| + r''' |
| + name: other_lib |
| + '''); |
| + // Setup analysis options file with ignore list that ignores 'other_lib' |
| + // and all descendants. |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| + exclude: |
| + - 'other_lib/**' |
| + '''); |
| + // Setup context. |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| - expect(_currentPackageMap, isEmpty); |
| - // Change the package map dependency so that the packageMapProvider is |
| - // re-run, and arrange for it to return null from computePackageMap(). |
| - packageMapProvider.packageMap = null; |
| - resourceProvider.modifyFile(dependencyPath, 'new contents'); |
| - return pumpEventQueue().then((_) { |
| - // The package map should have been changed to null. |
| - expect(_currentPackageMap, isNull); |
| - }); |
| + // Verify that the context in other_lib wasn't created and that the |
| + // context in lib was created. |
| + var contexts = |
| + manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| + expect(contexts.length, 2); |
| + expect(contexts[0].name, equals('/my/proj')); |
| + expect(contexts[1].name, equals('/my/proj/lib')); |
| } |
| - test_watch_modifyPackagespec() { |
| - String packagesPath = '$projPath/.packages'; |
| - String filePath = '$projPath/bin/main.dart'; |
| - |
| - resourceProvider.newFile(packagesPath, ''); |
| - resourceProvider.newFile(filePath, 'library main;'); |
| - |
| + test_path_filter_wildcard_child_contexts_option() async { |
| + // Create files. |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + newFile([libPath, 'main.dart']); |
| + newFile( |
| + [libPath, 'pubspec.yaml'], |
| + r''' |
| +name: foobar |
| +'''); |
| + String otherLibPath = newFolder([projPath, 'other_lib']); |
| + newFile([otherLibPath, 'entry.dart']); |
| + newFile( |
| + [otherLibPath, 'pubspec.yaml'], |
| + r''' |
| +name: other_lib |
| +'''); |
| + // Setup analysis options file with ignore list that ignores 'other_lib' |
| + // and all immediate children. |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| + exclude: |
| + - 'other_lib/*' |
| +'''); |
| + // Setup context. |
| manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + // Verify that the context in other_lib wasn't created and that the |
| + // context in lib was created. |
| + var contexts = |
| + manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| + expect(contexts.length, 2); |
| + expect(contexts[0].name, equals('/my/proj')); |
| + expect(contexts[1].name, equals('/my/proj/lib')); |
| + } |
| - Map<String, int> filePaths = callbacks.currentContextFilePaths[projPath]; |
| - expect(filePaths, hasLength(1)); |
| - expect(filePaths, contains(filePath)); |
| - expect(_currentPackageMap, isEmpty); |
| - |
| - // update .packages |
| - callbacks.now++; |
| - resourceProvider.modifyFile(packagesPath, 'main:./lib/'); |
| - return pumpEventQueue().then((_) { |
| - // verify new package info |
| - expect(_currentPackageMap.keys, unorderedEquals(['main'])); |
| - }); |
| + void test_setRoots_nested_excludedByOuter() { |
| + String project = '/project'; |
| + String projectPubspec = '$project/pubspec.yaml'; |
| + String example = '$project/example'; |
| + String examplePubspec = '$example/pubspec.yaml'; |
| + // create files |
| + resourceProvider.newFile(projectPubspec, 'name: project'); |
| + resourceProvider.newFile(examplePubspec, 'name: example'); |
| + newFile( |
| + [project, optionsFileName], |
| + r''' |
| +analyzer: |
| + exclude: |
| + - 'example' |
| +'''); |
| + manager |
| + .setRoots(<String>[project, example], <String>[], <String, String>{}); |
| + // verify |
| + { |
| + ContextInfo rootInfo = manager.rootInfo; |
| + expect(rootInfo.children, hasLength(1)); |
| + { |
| + ContextInfo projectInfo = rootInfo.children[0]; |
| + expect(projectInfo.folder.path, project); |
| + expect(projectInfo.children, hasLength(1)); |
| + { |
| + ContextInfo exampleInfo = projectInfo.children[0]; |
| + expect(exampleInfo.folder.path, example); |
| + expect(exampleInfo.children, isEmpty); |
| + } |
| + } |
| + } |
| + expect(callbacks.currentContextPaths, hasLength(2)); |
| + expect(callbacks.currentContextPaths, unorderedEquals([project, example])); |
| } |
| - /** |
| - * Verify that package URI's for source files in [path] will be resolved |
| - * using a package root matching [expectation]. |
| - */ |
| - void _checkPackageRoot(String path, expectation) { |
| - // TODO(brianwilkerson) Figure out how to test this. Possibly by comparing |
| - // the contents of the package map (although that approach doesn't work at |
| - // the moment). |
| -// FolderDisposition disposition = callbacks.currentContextDispositions[path]; |
| -// expect(disposition.packageRoot, expectation); |
| - // TODO(paulberry): we should also verify that the package map itself is |
| - // correct. See dartbug.com/23909. |
| + void test_setRoots_nested_excludedByOuter_deep() { |
| + String a = '/a'; |
| + String c = '$a/b/c'; |
| + String aPubspec = '$a/pubspec.yaml'; |
| + String cPubspec = '$c/pubspec.yaml'; |
| + // create files |
| + resourceProvider.newFile(aPubspec, 'name: aaa'); |
| + resourceProvider.newFile(cPubspec, 'name: ccc'); |
| + newFile( |
| + [a, optionsFileName], |
| + r''' |
| +analyzer: |
| + exclude: |
| + - 'b**' |
| +'''); |
| + manager.setRoots(<String>[a, c], <String>[], <String, String>{}); |
| + // verify |
| + { |
| + ContextInfo rootInfo = manager.rootInfo; |
| + expect(rootInfo.children, hasLength(1)); |
| + { |
| + ContextInfo aInfo = rootInfo.children[0]; |
| + expect(aInfo.folder.path, a); |
| + expect(aInfo.children, hasLength(1)); |
| + { |
| + ContextInfo cInfo = aInfo.children[0]; |
| + expect(cInfo.folder.path, c); |
| + expect(cInfo.children, isEmpty); |
| + } |
| + } |
| + } |
| + expect(callbacks.currentContextPaths, hasLength(2)); |
| + expect(callbacks.currentContextPaths, unorderedEquals([a, c])); |
| } |
| - Map<String, List<Folder>> _packageMap(String contextPath) { |
| - Folder folder = resourceProvider.getFolder(contextPath); |
| - return manager.folderMap[folder]?.sourceFactory?.packageMap; |
| + test_strong_mode_analysis_option() async { |
| + // Create files. |
| + newFile( |
| + [projPath, optionsFileName], |
| + r''' |
| +analyzer: |
| + strong-mode: true |
| +'''); |
| + String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]); |
| + newFile([libPath, 'main.dart']); |
| + // Setup context. |
| + manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| + // Verify that analysis options was parsed and strong-mode set. |
| + Map<String, int> fileTimestamps = |
| + callbacks.currentContextFilePaths[projPath]; |
| + expect(fileTimestamps, isNotEmpty); |
| + expect(callbacks.currentContext.analysisOptions.strongMode, true); |
| } |
| } |