// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. library analyzer.test.generated.package_test; import 'package:analyzer/exception/exception.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/src/generated/engine.dart'; import 'package:analyzer/src/generated/package.dart'; import 'package:analyzer/src/generated/sdk.dart'; import 'package:analyzer/src/generated/source.dart'; import 'package:package_config/packages.dart'; import 'package:test/test.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; import '../src/context/mock_sdk.dart'; import 'resolver_test_case.dart'; main() { defineReflectiveSuite(() { defineReflectiveTests(DependencyFinderTest); defineReflectiveTests(PackageDescriptionTest); defineReflectiveTests(PackageManagerTest); }); } /** * The name of the pubspec.yaml file. */ const String pubspecName = 'pubspec.yaml'; @reflectiveTest class DependencyFinderTest extends ResolverTestCase { void test_transitiveDependenciesFor_circularDependencies() { String packageA = resourceProvider.convertPath('/pub-cache/a-1.0'); String packageB = resourceProvider.convertPath('/pub-cache/b-1.0'); String packageC = resourceProvider.convertPath('/pub-cache/c-1.0'); resourceProvider.newFile('$packageA/$pubspecName', ''' dependencies: b: any '''); resourceProvider.newFile('$packageB/$pubspecName', ''' dependencies: c: any '''); resourceProvider.newFile('$packageC/$pubspecName', ''' dependencies: a: any '''); Map> packageMap = >{ 'a': [resourceProvider.getFolder(packageA)], 'b': [resourceProvider.getFolder(packageB)], 'c': [resourceProvider.getFolder(packageC)], }; DependencyFinder finder = new DependencyFinder(resourceProvider); List result = finder.transitiveDependenciesFor(packageMap, packageA); expect(result, unorderedEquals([packageB, packageC])); } void test_transitiveDependenciesFor_missingPubspec() { String packagePath = '/pub-cache/a-1.0'; Map> packageMap = >{ 'a': [resourceProvider.getFolder(packagePath)] }; DependencyFinder finder = new DependencyFinder(resourceProvider); expect(() => finder.transitiveDependenciesFor(packageMap, packagePath), throwsA(new isInstanceOf())); } void test_transitiveDependenciesFor_noDependencies() { String packagePath = '/pub-cache/a-1.0'; resourceProvider.newFile('$packagePath/$pubspecName', ''); Map> packageMap = >{ 'a': [resourceProvider.getFolder(packagePath)] }; DependencyFinder finder = new DependencyFinder(resourceProvider); List result = finder.transitiveDependenciesFor(packageMap, packagePath); expect(result, hasLength(0)); } void test_transitiveDependenciesFor_overlappingDependencies() { String packageA = resourceProvider.convertPath('/pub-cache/a-1.0'); String packageB = resourceProvider.convertPath('/pub-cache/b-1.0'); String packageC = resourceProvider.convertPath('/pub-cache/c-1.0'); String packageD = resourceProvider.convertPath('/pub-cache/d-1.0'); resourceProvider.newFile('$packageA/$pubspecName', ''' dependencies: b: any c: any '''); resourceProvider.newFile('$packageB/$pubspecName', ''' dependencies: d: any '''); resourceProvider.newFile('$packageC/$pubspecName', ''' dependencies: d: any '''); resourceProvider.newFile('$packageD/$pubspecName', ''); Map> packageMap = >{ 'a': [resourceProvider.getFolder(packageA)], 'b': [resourceProvider.getFolder(packageB)], 'c': [resourceProvider.getFolder(packageC)], 'd': [resourceProvider.getFolder(packageD)], }; DependencyFinder finder = new DependencyFinder(resourceProvider); List result = finder.transitiveDependenciesFor(packageMap, packageA); expect(result, unorderedEquals([packageB, packageC, packageD])); } void test_transitiveDependenciesFor_simpleDependencies() { String packageA = resourceProvider.convertPath('/pub-cache/a-1.0'); String packageB = resourceProvider.convertPath('/pub-cache/b-1.0'); String packageC = resourceProvider.convertPath('/pub-cache/c-1.0'); resourceProvider.newFile('$packageA/$pubspecName', ''' dependencies: b: any c: any '''); resourceProvider.newFile('$packageB/$pubspecName', ''); resourceProvider.newFile('$packageC/$pubspecName', ''); Map> packageMap = >{ 'a': [resourceProvider.getFolder(packageA)], 'b': [resourceProvider.getFolder(packageB)], 'c': [resourceProvider.getFolder(packageC)], }; DependencyFinder finder = new DependencyFinder(resourceProvider); List result = finder.transitiveDependenciesFor(packageMap, packageA); expect(result, unorderedEquals([packageB, packageC])); } } @reflectiveTest class PackageDescriptionTest extends ResolverTestCase { void test_equal_false_differentOptions() { String packageId = 'path1;path2'; DartSdk sdk = new MockSdk(); AnalysisOptionsImpl options1 = new AnalysisOptionsImpl(); AnalysisOptionsImpl options2 = new AnalysisOptionsImpl(); options2.enableLazyAssignmentOperators = !options1.enableLazyAssignmentOperators; PackageDescription first = new PackageDescription(packageId, sdk, options1); PackageDescription second = new PackageDescription(packageId, sdk, options2); expect(first == second, isFalse); } void test_equal_false_differentPaths() { String packageId1 = 'path1;path2'; String packageId2 = 'path1;path3'; DartSdk sdk = new MockSdk(); AnalysisOptions options = new AnalysisOptionsImpl(); PackageDescription first = new PackageDescription(packageId1, sdk, options); PackageDescription second = new PackageDescription(packageId2, sdk, options); expect(first == second, isFalse); } void test_equal_false_differentSdks() { String packageId = 'path1;path2'; DartSdk sdk1 = new MockSdk(); DartSdk sdk2 = new MockSdk(); AnalysisOptions options = new AnalysisOptionsImpl(); PackageDescription first = new PackageDescription(packageId, sdk1, options); PackageDescription second = new PackageDescription(packageId, sdk2, options); expect(first == second, isFalse); } void test_equal_true() { String packageId = 'path1;path2'; DartSdk sdk = new MockSdk(); AnalysisOptions options = new AnalysisOptionsImpl(); PackageDescription first = new PackageDescription(packageId, sdk, options); PackageDescription second = new PackageDescription(packageId, sdk, options); expect(first == second, isTrue); } } @reflectiveTest class PackageManagerTest extends ResolverTestCase { void test_getContext() { String packageA = resourceProvider.convertPath('/pub-cache/a-1.0'); String packageB1 = resourceProvider.convertPath('/pub-cache/b-1.0'); String packageB2 = resourceProvider.convertPath('/pub-cache/b-2.0'); String packageC = resourceProvider.convertPath('/pub-cache/c-1.0'); resourceProvider.newFile('$packageA/$pubspecName', ''' dependencies: b: any c: any '''); resourceProvider.newFile('$packageB1/$pubspecName', ''); resourceProvider.newFile('$packageB2/$pubspecName', ''); resourceProvider.newFile('$packageC/$pubspecName', ''); Packages packages1 = new _MockPackages({ 'a': new Uri.file(packageA), 'b': new Uri.file(packageB1), 'c': new Uri.file(packageC), }); DartUriResolver resolver = new DartUriResolver(new MockSdk()); AnalysisOptions options = new AnalysisOptionsImpl(); // // Verify that we can compute a context for a package. // PackageManager manager = new PackageManager(resourceProvider); AnalysisContext context1 = manager.getContext(packageA, packages1, resolver, options); expect(context1, isNotNull); // // Verify that if we have the same package map we get the same context. // AnalysisContext context2 = manager.getContext(packageA, packages1, resolver, options); expect(context2, same(context1)); // // Verify that if we have a different package map we get a different context. // Packages packages3 = new _MockPackages({ 'a': new Uri.file(packageA), 'b': new Uri.file(packageB2), 'c': new Uri.file(packageC), }); AnalysisContext context3 = manager.getContext(packageA, packages3, resolver, options); expect(context3, isNot(same(context1))); } } /** * An implementation of [Packages] used for testing. */ class _MockPackages implements Packages { final Map map; _MockPackages(this.map); @override Iterable get packages => map.keys; @override Map asMap() => map; @override Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)}) { fail('Unexpected invocation of resolve'); } }