| // 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. | |
| import 'package:analyzer/src/summary/idl.dart'; | |
| import 'package:analyzer/src/summary/package_bundle_reader.dart'; | |
| import 'package:test/test.dart'; | |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; | |
| main() { | |
| defineReflectiveSuite(() { | |
| defineReflectiveTests(SummaryDataStoreTest); | |
| }); | |
| } | |
| /// A matcher for ConflictingSummaryException. | |
| const isConflictingSummaryException = | |
| const TypeMatcher<ConflictingSummaryException>(); | |
| UnlinkedPublicNamespace _namespaceWithParts(List<String> parts) { | |
| _UnlinkedPublicNamespaceMock namespace = new _UnlinkedPublicNamespaceMock(); | |
| namespace.parts = parts; | |
| return namespace; | |
| } | |
| @reflectiveTest | |
| class SummaryDataStoreTest { | |
| SummaryDataStore dataStore = | |
| new SummaryDataStore(<String>[], disallowOverlappingSummaries: true); | |
| _PackageBundleMock bundle1 = new _PackageBundleMock(); | |
| _PackageBundleMock bundle2 = new _PackageBundleMock(); | |
| _UnlinkedUnitMock unlinkedUnit11 = new _UnlinkedUnitMock(); | |
| _UnlinkedUnitMock unlinkedUnit12 = new _UnlinkedUnitMock(); | |
| _UnlinkedUnitMock unlinkedUnit21 = new _UnlinkedUnitMock(); | |
| _LinkedLibraryMock linkedLibrary1 = new _LinkedLibraryMock(); | |
| _LinkedLibraryMock linkedLibrary2 = new _LinkedLibraryMock(); | |
| void setUp() { | |
| _setupDataStore(dataStore); | |
| } | |
| test_addBundle() { | |
| expect(dataStore.bundles, unorderedEquals([bundle1, bundle2])); | |
| expect(dataStore.uriToSummaryPath, | |
| containsPair('package:p1/u1.dart', '/p1.ds')); | |
| // unlinkedMap | |
| expect(dataStore.unlinkedMap, hasLength(3)); | |
| expect(dataStore.unlinkedMap, | |
| containsPair('package:p1/u1.dart', unlinkedUnit11)); | |
| expect(dataStore.unlinkedMap, | |
| containsPair('package:p1/u2.dart', unlinkedUnit12)); | |
| expect(dataStore.unlinkedMap, | |
| containsPair('package:p2/u1.dart', unlinkedUnit21)); | |
| // linkedMap | |
| expect(dataStore.linkedMap, hasLength(2)); | |
| expect(dataStore.linkedMap, | |
| containsPair('package:p1/u1.dart', linkedLibrary1)); | |
| expect(dataStore.linkedMap, | |
| containsPair('package:p2/u1.dart', linkedLibrary2)); | |
| } | |
| test_addBundle_dartUris() { | |
| _PackageBundleMock bundle = new _PackageBundleMock(); | |
| bundle.unlinkedUnitUris = <String>['dart:core']; | |
| bundle.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit11]; | |
| bundle.linkedLibraryUris = <String>['dart:core']; | |
| bundle.linkedLibraries = <LinkedLibrary>[linkedLibrary1]; | |
| bundle.apiSignature = 'signature'; | |
| dataStore.addBundle('/p3.ds', bundle); | |
| } | |
| test_addBundle_fileUris() { | |
| _PackageBundleMock bundle = new _PackageBundleMock(); | |
| bundle.unlinkedUnitUris = <String>['file:/foo.dart']; | |
| bundle.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit11]; | |
| bundle.linkedLibraryUris = <String>['file:/foo.dart']; | |
| bundle.linkedLibraries = <LinkedLibrary>[linkedLibrary1]; | |
| bundle.apiSignature = 'signature'; | |
| dataStore.addBundle('/p3.ds', bundle); | |
| } | |
| test_addBundle_multiProject() { | |
| _PackageBundleMock bundle = new _PackageBundleMock(); | |
| bundle.unlinkedUnitUris = <String>[ | |
| 'package:p2/u1.dart', | |
| 'package:p1/u1.dart' | |
| ]; | |
| bundle.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit21, unlinkedUnit11]; | |
| bundle.linkedLibraryUris = <String>[ | |
| 'package:p2/u1.dart', | |
| 'package:p1/u1.dart' | |
| ]; | |
| bundle.linkedLibraries = <LinkedLibrary>[linkedLibrary2, linkedLibrary1]; | |
| bundle.apiSignature = 'signature'; | |
| // p3 conflicts (overlaps) with existing summaries. | |
| expect(() => dataStore.addBundle('/p3.ds', bundle), | |
| throwsA(isConflictingSummaryException)); | |
| } | |
| test_addBundle_multiProjectOverlap() { | |
| SummaryDataStore dataStore2 = | |
| new SummaryDataStore(<String>[], disallowOverlappingSummaries: false); | |
| _setupDataStore(dataStore2); | |
| _PackageBundleMock bundle = new _PackageBundleMock(); | |
| bundle.unlinkedUnitUris = <String>[ | |
| 'package:p2/u1.dart', | |
| 'package:p1/u1.dart' | |
| ]; | |
| bundle.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit21, unlinkedUnit11]; | |
| bundle.linkedLibraryUris = <String>[ | |
| 'package:p2/u1.dart', | |
| 'package:p1/u1.dart' | |
| ]; | |
| bundle.linkedLibraries = <LinkedLibrary>[linkedLibrary2, linkedLibrary1]; | |
| bundle.apiSignature = 'signature'; | |
| // p3 conflicts (overlaps) with existing summaries, but now allowed. | |
| dataStore2.addBundle('/p3.ds', bundle); | |
| } | |
| test_getContainingLibraryUris_libraryUri() { | |
| String partUri = 'package:p1/u1.dart'; | |
| List<String> uris = dataStore.getContainingLibraryUris(partUri); | |
| expect(uris, unorderedEquals([partUri])); | |
| } | |
| test_getContainingLibraryUris_partUri() { | |
| String partUri = 'package:p1/u2.dart'; | |
| List<String> uris = dataStore.getContainingLibraryUris(partUri); | |
| expect(uris, unorderedEquals(['package:p1/u1.dart'])); | |
| } | |
| test_getContainingLibraryUris_unknownUri() { | |
| String partUri = 'package:notInStore/foo.dart'; | |
| List<String> uris = dataStore.getContainingLibraryUris(partUri); | |
| expect(uris, isNull); | |
| } | |
| void _setupDataStore(SummaryDataStore store) { | |
| var namespace1 = _namespaceWithParts(['package:p1/u2.dart']); | |
| var namespace2 = _namespaceWithParts([]); | |
| // bundle1 | |
| unlinkedUnit11.publicNamespace = namespace1; | |
| unlinkedUnit12.publicNamespace = namespace2; | |
| bundle1.unlinkedUnitUris = <String>[ | |
| 'package:p1/u1.dart', | |
| 'package:p1/u2.dart' | |
| ]; | |
| bundle1.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit11, unlinkedUnit12]; | |
| bundle1.linkedLibraryUris = <String>['package:p1/u1.dart']; | |
| bundle1.linkedLibraries = <LinkedLibrary>[linkedLibrary1]; | |
| bundle1.apiSignature = 'signature1'; | |
| store.addBundle('/p1.ds', bundle1); | |
| // bundle2 | |
| unlinkedUnit21.publicNamespace = namespace2; | |
| bundle2.unlinkedUnitUris = <String>['package:p2/u1.dart']; | |
| bundle2.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit21]; | |
| bundle2.linkedLibraryUris = <String>['package:p2/u1.dart']; | |
| bundle2.linkedLibraries = <LinkedLibrary>[linkedLibrary2]; | |
| bundle2.apiSignature = 'signature2'; | |
| store.addBundle('/p2.ds', bundle2); | |
| } | |
| } | |
| class _LinkedLibraryMock implements LinkedLibrary { | |
| @override | |
| noSuchMethod(Invocation invocation) { | |
| throw new StateError('Unexpected invocation of ${invocation.memberName}'); | |
| } | |
| } | |
| class _PackageBundleMock implements PackageBundle { | |
| @override | |
| String apiSignature; | |
| @override | |
| List<LinkedLibrary> linkedLibraries; | |
| @override | |
| List<String> linkedLibraryUris; | |
| @override | |
| List<UnlinkedUnit> unlinkedUnits; | |
| @override | |
| List<String> unlinkedUnitUris; | |
| @override | |
| noSuchMethod(Invocation invocation) { | |
| throw new StateError('Unexpected invocation of ${invocation.memberName}'); | |
| } | |
| } | |
| class _UnlinkedPublicNamespaceMock implements UnlinkedPublicNamespace { | |
| @override | |
| List<String> parts; | |
| @override | |
| noSuchMethod(Invocation invocation) { | |
| throw new StateError('Unexpected invocation of ${invocation.memberName}'); | |
| } | |
| } | |
| class _UnlinkedUnitMock implements UnlinkedUnit { | |
| @override | |
| bool isPartOf; | |
| @override | |
| List<int> lineStarts; | |
| @override | |
| UnlinkedPublicNamespace publicNamespace; | |
| @override | |
| noSuchMethod(Invocation invocation) { | |
| throw new StateError('Unexpected invocation of ${invocation.memberName}'); | |
| } | |
| } |