Index: pkg/analysis_server/test/services/index/store/split_store_test.dart |
diff --git a/pkg/analysis_server/test/services/index/store/split_store_test.dart b/pkg/analysis_server/test/services/index/store/split_store_test.dart |
deleted file mode 100644 |
index fbe43d73cd1b04a047df95db72453aba8134bab3..0000000000000000000000000000000000000000 |
--- a/pkg/analysis_server/test/services/index/store/split_store_test.dart |
+++ /dev/null |
@@ -1,1108 +0,0 @@ |
-// Copyright (c) 2014, 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 test.services.src.index.store.split_store; |
- |
-import 'dart:async'; |
- |
-import 'package:analysis_server/src/provisional/index/index_core.dart'; |
-import 'package:analysis_server/src/services/index/index.dart'; |
-import 'package:analysis_server/src/services/index/indexable_element.dart'; |
-import 'package:analysis_server/src/services/index/store/codec.dart'; |
-import 'package:analysis_server/src/services/index/store/memory_node_manager.dart'; |
-import 'package:analysis_server/src/services/index/store/split_store.dart'; |
-import 'package:analyzer/dart/element/element.dart'; |
-import 'package:analyzer/src/dart/element/element.dart'; |
-import 'package:analyzer/src/generated/engine.dart'; |
-import 'package:analyzer/src/generated/source.dart'; |
-import 'package:test_reflective_loader/test_reflective_loader.dart'; |
-import 'package:typed_mock/typed_mock.dart'; |
-import 'package:unittest/unittest.dart'; |
- |
-import '../../../mocks.dart'; |
-import '../../../utils.dart'; |
-import 'mocks.dart'; |
-import 'single_source_container.dart'; |
- |
-main() { |
- initializeTestEnvironment(); |
- defineReflectiveTests(_FileNodeManagerTest); |
- defineReflectiveTests(_IndexNodeTest); |
- defineReflectiveTests(_LocationDataTest); |
- defineReflectiveTests(_RelationKeyDataTest); |
- defineReflectiveTests(_SplitIndexStoreTest); |
-} |
- |
-void _assertHasLocation(List<LocationImpl> locations, IndexableElement element, |
- int offset, int length, |
- {bool isQualified: false, bool isResolved: true}) { |
- for (LocationImpl location in locations) { |
- if ((element == null || location.indexable == element) && |
- location.offset == offset && |
- location.length == length && |
- location.isQualified == isQualified && |
- location.isResolved == isResolved) { |
- return; |
- } |
- } |
- fail('Expected to find Location' |
- '(element=$element, offset=$offset, length=$length)'); |
-} |
- |
-void _assertHasLocationQ(List<LocationImpl> locations, IndexableElement element, |
- int offset, int length) { |
- _assertHasLocation(locations, element, offset, length, isQualified: true); |
-} |
- |
-@reflectiveTest |
-class _FileNodeManagerTest { |
- MockLogger logger = new MockLogger(); |
- StringCodec stringCodec = new StringCodec(); |
- RelationshipCodec relationshipCodec; |
- |
- AnalysisContext context = new MockAnalysisContext('context'); |
- ContextCodec contextCodec = new MockContextCodec(); |
- int contextId = 13; |
- |
- ElementCodec elementCodec = new MockElementCodec(); |
- int nextElementId = 0; |
- |
- FileNodeManager nodeManager; |
- FileManager fileManager = new _MockFileManager(); |
- |
- void setUp() { |
- relationshipCodec = new RelationshipCodec(stringCodec); |
- nodeManager = new FileNodeManager(fileManager, logger, stringCodec, |
- contextCodec, elementCodec, relationshipCodec); |
- when(contextCodec.encode(context)).thenReturn(contextId); |
- when(contextCodec.decode(contextId)).thenReturn(context); |
- } |
- |
- void test_clear() { |
- nodeManager.clear(); |
- verify(fileManager.clear()).once(); |
- } |
- |
- void test_getLocationCount_empty() { |
- expect(nodeManager.locationCount, 0); |
- } |
- |
- void test_getNode_contextNull() { |
- String name = '42.index'; |
- // record bytes |
- List<int> bytes; |
- when(fileManager.write(name, anyObject)).thenInvoke((name, bs) { |
- bytes = bs; |
- }); |
- // put Node |
- Future putFuture; |
- { |
- IndexNode node = new IndexNode(context, elementCodec, relationshipCodec); |
- putFuture = nodeManager.putNode(name, node); |
- } |
- // do in the "put" Future |
- putFuture.then((_) { |
- // force "null" context |
- when(contextCodec.decode(contextId)).thenReturn(null); |
- // prepare input bytes |
- when(fileManager.read(name)).thenReturn(new Future.value(bytes)); |
- // get Node |
- return nodeManager.getNode(name).then((IndexNode node) { |
- expect(node, isNull); |
- // no exceptions |
- verifyZeroInteractions(logger); |
- }); |
- }); |
- } |
- |
- test_getNode_invalidVersion() { |
- String name = '42.index'; |
- // prepare a stream with an invalid version |
- when(fileManager.read(name)) |
- .thenReturn(new Future.value([0x01, 0x02, 0x03, 0x04])); |
- // do in the Future |
- return nodeManager.getNode(name).then((IndexNode node) { |
- // no IndexNode |
- expect(node, isNull); |
- // failed |
- verify(logger.logError(anyObject, anyObject)).once(); |
- }); |
- } |
- |
- test_getNode_streamException() { |
- String name = '42.index'; |
- when(fileManager.read(name)).thenReturn(new Future(() { |
- return throw new Exception(); |
- })); |
- // do in the Future |
- return nodeManager.getNode(name).then((IndexNode node) { |
- expect(node, isNull); |
- // failed |
- verify(logger.logError(anyString, anyObject)).once(); |
- }); |
- } |
- |
- test_getNode_streamNull() { |
- String name = '42.index'; |
- when(fileManager.read(name)).thenReturn(new Future.value(null)); |
- // do in the Future |
- return nodeManager.getNode(name).then((IndexNode node) { |
- expect(node, isNull); |
- // OK |
- verifyZeroInteractions(logger); |
- }); |
- } |
- |
- void test_newNode() { |
- IndexNode node = nodeManager.newNode(context); |
- expect(node.context, context); |
- expect(node.locationCount, 0); |
- } |
- |
- test_putNode_getNode() { |
- String name = '42.index'; |
- // record bytes |
- List<int> bytes; |
- when(fileManager.write(name, anyObject)).thenInvoke((name, bs) { |
- bytes = bs; |
- }); |
- // prepare elements |
- IndexableElement elementA = _mockElement(); |
- IndexableElement elementB = _mockElement(); |
- IndexableElement elementC = _mockElement(); |
- RelationshipImpl relationship = |
- RelationshipImpl.getRelationship('my-relationship'); |
- // put Node |
- Future putFuture; |
- { |
- // prepare relations |
- int relationshipId = relationshipCodec.encode(relationship); |
- RelationKeyData key = |
- new RelationKeyData.forData(0, 1, 2, relationshipId); |
- List<LocationData> locations = [ |
- new LocationData.forData(3, 4, 5, 1, 10, 2), |
- new LocationData.forData(6, 7, 8, 2, 20, 3) |
- ]; |
- Map<RelationKeyData, List<LocationData>> relations = {key: locations}; |
- // prepare Node |
- IndexNode node = new _MockIndexNode(); |
- when(node.context).thenReturn(context); |
- when(node.relations).thenReturn(relations); |
- when(node.locationCount).thenReturn(2); |
- // put Node |
- putFuture = nodeManager.putNode(name, node); |
- } |
- // do in the Future |
- putFuture.then((_) { |
- // has locations |
- expect(nodeManager.locationCount, 2); |
- // prepare input bytes |
- when(fileManager.read(name)).thenReturn(new Future.value(bytes)); |
- // get Node |
- return nodeManager.getNode(name).then((IndexNode node) { |
- expect(2, node.locationCount); |
- { |
- List<LocationImpl> locations = |
- node.getRelationships(elementA, relationship); |
- expect(locations, hasLength(2)); |
- _assertHasLocation(locations, elementB, 1, 10); |
- _assertHasLocationQ(locations, elementC, 2, 20); |
- } |
- }); |
- }); |
- } |
- |
- test_putNode_streamException() { |
- String name = '42.index'; |
- Exception exception = new Exception(); |
- when(fileManager.write(name, anyObject)).thenReturn(new Future(() { |
- return throw exception; |
- })); |
- // prepare IndexNode |
- IndexNode node = new _MockIndexNode(); |
- when(node.context).thenReturn(context); |
- when(node.locationCount).thenReturn(0); |
- when(node.relations).thenReturn({}); |
- // try to put |
- return nodeManager.putNode(name, node).then((_) { |
- // failed |
- verify(logger.logError(anyString, anyObject)).once(); |
- }); |
- } |
- |
- void test_removeNode() { |
- String name = '42.index'; |
- nodeManager.removeNode(name); |
- verify(fileManager.delete(name)).once(); |
- } |
- |
- IndexableElement _mockElement() { |
- int id1 = nextElementId++; |
- int id2 = nextElementId++; |
- int id3 = nextElementId++; |
- Element element = new MockElement(); |
- IndexableObject indexable = new IndexableElement(element); |
- when(elementCodec.encode1(indexable)).thenReturn(id1); |
- when(elementCodec.encode2(indexable)).thenReturn(id2); |
- when(elementCodec.encode3(indexable)).thenReturn(id3); |
- when(elementCodec.decode(context, id1, id2, id3)).thenReturn(indexable); |
- return indexable; |
- } |
-} |
- |
-@reflectiveTest |
-class _IndexNodeTest { |
- AnalysisContext context = new MockAnalysisContext('context'); |
- ElementCodec elementCodec = new MockElementCodec(); |
- int nextElementId = 0; |
- IndexNode node; |
- RelationshipCodec relationshipCodec; |
- StringCodec stringCodec = new StringCodec(); |
- |
- void setUp() { |
- relationshipCodec = new RelationshipCodec(stringCodec); |
- node = new IndexNode(context, elementCodec, relationshipCodec); |
- } |
- |
- void test_getContext() { |
- expect(node.context, context); |
- } |
- |
- void test_recordRelationship() { |
- IndexableElement elementA = _mockElement(); |
- IndexableElement elementB = _mockElement(); |
- IndexableElement elementC = _mockElement(); |
- RelationshipImpl relationship = |
- RelationshipImpl.getRelationship('my-relationship'); |
- LocationImpl locationA = new LocationImpl(elementB, 1, 2); |
- LocationImpl locationB = new LocationImpl(elementC, 10, 20); |
- // empty initially |
- expect(node.locationCount, 0); |
- // record |
- node.recordRelationship(elementA, relationship, locationA); |
- expect(node.locationCount, 1); |
- node.recordRelationship(elementA, relationship, locationB); |
- expect(node.locationCount, 2); |
- // get relations |
- expect(node.getRelationships(elementB, relationship), isEmpty); |
- { |
- List<LocationImpl> locations = |
- node.getRelationships(elementA, relationship); |
- expect(locations, hasLength(2)); |
- _assertHasLocation(locations, null, 1, 2); |
- _assertHasLocation(locations, null, 10, 20); |
- } |
- // verify relations map |
- { |
- Map<RelationKeyData, List<LocationData>> relations = node.relations; |
- expect(relations, hasLength(1)); |
- List<LocationData> locations = relations.values.first; |
- expect(locations, hasLength(2)); |
- } |
- } |
- |
- void test_setRelations() { |
- IndexableElement elementA = _mockElement(); |
- IndexableElement elementB = _mockElement(); |
- IndexableElement elementC = _mockElement(); |
- RelationshipImpl relationship = |
- RelationshipImpl.getRelationship('my-relationship'); |
- // record |
- { |
- int relationshipId = relationshipCodec.encode(relationship); |
- RelationKeyData key = |
- new RelationKeyData.forData(0, 1, 2, relationshipId); |
- List<LocationData> locations = [ |
- new LocationData.forData(3, 4, 5, 1, 10, 2), |
- new LocationData.forData(6, 7, 8, 2, 20, 3) |
- ]; |
- node.relations = {key: locations}; |
- } |
- // request |
- List<LocationImpl> locations = |
- node.getRelationships(elementA, relationship); |
- expect(locations, hasLength(2)); |
- _assertHasLocation(locations, elementB, 1, 10); |
- _assertHasLocationQ(locations, elementC, 2, 20); |
- } |
- |
- IndexableElement _mockElement() { |
- int id1 = nextElementId++; |
- int id2 = nextElementId++; |
- int id3 = nextElementId++; |
- Element element = new MockElement(); |
- IndexableElement indexable = new IndexableElement(element); |
- when(elementCodec.encode1(indexable)).thenReturn(id1); |
- when(elementCodec.encode2(indexable)).thenReturn(id2); |
- when(elementCodec.encode3(indexable)).thenReturn(id3); |
- when(elementCodec.decode(context, id1, id2, id3)).thenReturn(indexable); |
- return indexable; |
- } |
-} |
- |
-@reflectiveTest |
-class _LocationDataTest { |
- AnalysisContext context = new MockAnalysisContext('context'); |
- ElementCodec elementCodec = new MockElementCodec(); |
- StringCodec stringCodec = new StringCodec(); |
- |
- void test_newForData() { |
- Element element = new MockElement(); |
- IndexableElement indexable = new IndexableElement(element); |
- when(elementCodec.decode(context, 11, 12, 13)).thenReturn(indexable); |
- LocationData locationData = new LocationData.forData(11, 12, 13, 1, 2, 0); |
- LocationImpl location = locationData.getLocation(context, elementCodec); |
- expect(location.indexable, indexable); |
- expect(location.offset, 1); |
- expect(location.length, 2); |
- expect(location.isQualified, isFalse); |
- expect(location.isResolved, isFalse); |
- } |
- |
- void test_newForObject() { |
- // prepare Element |
- Element element = new MockElement(); |
- IndexableElement indexable = new IndexableElement(element); |
- when(elementCodec.encode1(indexable)).thenReturn(11); |
- when(elementCodec.encode2(indexable)).thenReturn(12); |
- when(elementCodec.encode3(indexable)).thenReturn(13); |
- when(elementCodec.decode(context, 11, 12, 13)).thenReturn(indexable); |
- // create |
- LocationImpl location = new LocationImpl(indexable, 1, 2); |
- LocationData locationData = |
- new LocationData.forObject(elementCodec, location); |
- // touch 'hashCode' |
- locationData.hashCode; |
- // == |
- expect( |
- locationData == new LocationData.forData(11, 12, 13, 1, 2, 2), isTrue); |
- // getLocation() |
- { |
- LocationImpl newLocation = |
- locationData.getLocation(context, elementCodec); |
- expect(newLocation.indexable, indexable); |
- expect(newLocation.offset, 1); |
- expect(newLocation.length, 2); |
- } |
- // no Element - no Location |
- { |
- when(elementCodec.decode(context, 11, 12, 13)).thenReturn(null); |
- LocationImpl newLocation = |
- locationData.getLocation(context, elementCodec); |
- expect(newLocation, isNull); |
- } |
- } |
-} |
- |
-/** |
- * [LocationImpl] has no [==] and [hashCode], so to compare locations by value we |
- * need to wrap them into such object. |
- */ |
-class _LocationEqualsWrapper { |
- final LocationImpl location; |
- |
- _LocationEqualsWrapper(this.location); |
- |
- @override |
- int get hashCode { |
- return 31 * (31 * location.indexable.hashCode + location.offset) + |
- location.length; |
- } |
- |
- @override |
- bool operator ==(Object other) { |
- if (other is _LocationEqualsWrapper) { |
- return other.location.offset == location.offset && |
- other.location.length == location.length && |
- other.location.indexable == location.indexable; |
- } |
- return false; |
- } |
-} |
- |
-class _MockFileManager extends TypedMock implements FileManager {} |
- |
-class _MockIndexNode extends TypedMock implements IndexNode {} |
- |
-@reflectiveTest |
-class _RelationKeyDataTest { |
- AnalysisContext context = new MockAnalysisContext('context'); |
- ElementCodec elementCodec = new MockElementCodec(); |
- RelationshipCodec relationshipCodec = new MockRelationshipCodec(); |
- StringCodec stringCodec = new StringCodec(); |
- |
- void test_newFromData() { |
- RelationKeyData keyData = new RelationKeyData.forData(11, 12, 13, 2); |
- // equals |
- expect(keyData == this, isFalse); |
- expect(keyData == new RelationKeyData.forData(11, 12, 13, 20), isFalse); |
- expect(keyData == keyData, isTrue); |
- expect(keyData == new RelationKeyData.forData(11, 12, 13, 2), isTrue); |
- } |
- |
- void test_newFromObjects() { |
- // prepare Element |
- IndexableElement indexable; |
- { |
- Element element = new MockElement(); |
- indexable = new IndexableElement(element); |
- ElementLocation location = new ElementLocationImpl.con3(['foo', 'bar']); |
- when(element.location).thenReturn(location); |
- when(context.getElement(location)).thenReturn(indexable); |
- when(elementCodec.encode1(indexable)).thenReturn(11); |
- when(elementCodec.encode2(indexable)).thenReturn(12); |
- when(elementCodec.encode3(indexable)).thenReturn(13); |
- } |
- // prepare relationship |
- RelationshipImpl relationship = |
- RelationshipImpl.getRelationship('my-relationship'); |
- int relationshipId = 1; |
- when(relationshipCodec.encode(relationship)).thenReturn(relationshipId); |
- // create RelationKeyData |
- RelationKeyData keyData = new RelationKeyData.forObject( |
- elementCodec, relationshipCodec, indexable, relationship); |
- // touch |
- keyData.hashCode; |
- // equals |
- expect(keyData == this, isFalse); |
- expect(keyData == new RelationKeyData.forData(11, 12, 13, 20), isFalse); |
- expect(keyData == keyData, isTrue); |
- expect(keyData == new RelationKeyData.forData(11, 12, 13, relationshipId), |
- isTrue); |
- } |
-} |
- |
-@reflectiveTest |
-class _SplitIndexStoreTest { |
- AnalysisContext contextA = new MockAnalysisContext('contextA'); |
- AnalysisContext contextB = new MockAnalysisContext('contextB'); |
- AnalysisContext contextC = new MockAnalysisContext('contextC'); |
- |
- Element elementA = new MockElement('elementA'); |
- Element elementB = new MockElement('elementB'); |
- Element elementC = new MockElement('elementC'); |
- Element elementD = new MockElement('elementD'); |
- |
- IndexableElement indexableA; |
- IndexableElement indexableB; |
- IndexableElement indexableC; |
- IndexableElement indexableD; |
- |
- Source librarySource = new MockSource('librarySource'); |
- CompilationUnitElement libraryUnitElement = new MockCompilationUnitElement(); |
- LibraryElement libraryElement = new MockLibraryElement(); |
- |
- Source librarySourceB = new MockSource('librarySourceB'); |
- LibraryElement libraryElementB = new MockLibraryElement(); |
- CompilationUnitElement libraryUnitElementB = new MockCompilationUnitElement(); |
- |
- ElementCodec elementCodec = new MockElementCodec(); |
- MemoryNodeManager nodeManager = new MemoryNodeManager(); |
- RelationshipImpl relationship = |
- RelationshipImpl.getRelationship('test-relationship'); |
- Source sourceA = new MockSource('sourceA'); |
- Source sourceB = new MockSource('sourceB'); |
- Source sourceC = new MockSource('sourceC'); |
- Source sourceD = new MockSource('sourceD'); |
- SplitIndexStore store; |
- CompilationUnitElement unitElementA = new MockCompilationUnitElement(); |
- CompilationUnitElement unitElementB = new MockCompilationUnitElement(); |
- CompilationUnitElement unitElementC = new MockCompilationUnitElement(); |
- CompilationUnitElement unitElementD = new MockCompilationUnitElement(); |
- |
- void setUp() { |
- indexableA = new IndexableElement(elementA); |
- indexableB = new IndexableElement(elementB); |
- indexableC = new IndexableElement(elementC); |
- indexableD = new IndexableElement(elementD); |
- |
- nodeManager.elementCodec = elementCodec; |
- store = new SplitIndexStore( |
- nodeManager, <IndexObjectManager>[new DartUnitIndexObjectManager()]); |
- when(elementCodec.encode1(indexableA)).thenReturn(11); |
- when(elementCodec.encode2(indexableA)).thenReturn(12); |
- when(elementCodec.encode3(indexableA)).thenReturn(13); |
- when(elementCodec.encode1(indexableB)).thenReturn(21); |
- when(elementCodec.encode2(indexableB)).thenReturn(22); |
- when(elementCodec.encode3(indexableB)).thenReturn(23); |
- when(elementCodec.encode1(indexableC)).thenReturn(31); |
- when(elementCodec.encode2(indexableC)).thenReturn(32); |
- when(elementCodec.encode3(indexableC)).thenReturn(33); |
- when(elementCodec.encode1(indexableD)).thenReturn(41); |
- when(elementCodec.encode2(indexableD)).thenReturn(42); |
- when(elementCodec.encode3(indexableD)).thenReturn(43); |
- when(elementCodec.decode(contextA, 11, 12, 13)).thenReturn(indexableA); |
- when(elementCodec.decode(contextA, 21, 22, 23)).thenReturn(indexableB); |
- when(elementCodec.decode(contextA, 31, 32, 33)).thenReturn(indexableC); |
- when(elementCodec.decode(contextA, 41, 42, 43)).thenReturn(indexableD); |
- when(contextA.isDisposed).thenReturn(false); |
- when(contextB.isDisposed).thenReturn(false); |
- when(contextC.isDisposed).thenReturn(false); |
- when(sourceA.fullName).thenReturn('/home/user/sourceA.dart'); |
- when(sourceB.fullName).thenReturn('/home/user/sourceB.dart'); |
- when(sourceC.fullName).thenReturn('/home/user/sourceC.dart'); |
- when(sourceD.fullName).thenReturn('/home/user/sourceD.dart'); |
- when(elementA.context).thenReturn(contextA); |
- when(elementB.context).thenReturn(contextA); |
- when(elementC.context).thenReturn(contextA); |
- when(elementD.context).thenReturn(contextA); |
- when(elementA.enclosingElement).thenReturn(unitElementA); |
- when(elementB.enclosingElement).thenReturn(unitElementB); |
- when(elementC.enclosingElement).thenReturn(unitElementC); |
- when(elementD.enclosingElement).thenReturn(unitElementD); |
- when(elementA.source).thenReturn(sourceA); |
- when(elementB.source).thenReturn(sourceB); |
- when(elementC.source).thenReturn(sourceC); |
- when(elementD.source).thenReturn(sourceD); |
- when(elementA.library).thenReturn(libraryElement); |
- when(elementB.library).thenReturn(libraryElement); |
- when(elementC.library).thenReturn(libraryElement); |
- when(elementD.library).thenReturn(libraryElement); |
- when(unitElementA.source).thenReturn(sourceA); |
- when(unitElementB.source).thenReturn(sourceB); |
- when(unitElementC.source).thenReturn(sourceC); |
- when(unitElementD.source).thenReturn(sourceD); |
- when(unitElementA.library).thenReturn(libraryElement); |
- when(unitElementB.library).thenReturn(libraryElement); |
- when(unitElementC.library).thenReturn(libraryElement); |
- when(unitElementD.library).thenReturn(libraryElement); |
- // library |
- when(librarySource.fullName).thenReturn('/home/user/librarySource.dart'); |
- when(libraryUnitElement.library).thenReturn(libraryElement); |
- when(libraryUnitElement.source).thenReturn(librarySource); |
- when(libraryElement.source).thenReturn(librarySource); |
- when(libraryElement.definingCompilationUnit).thenReturn(libraryUnitElement); |
- // library B |
- when(librarySourceB.fullName).thenReturn('/home/user/librarySource.dart'); |
- when(libraryUnitElementB.library).thenReturn(libraryElementB); |
- when(libraryUnitElementB.source).thenReturn(librarySourceB); |
- when(libraryElementB.source).thenReturn(librarySourceB); |
- when(libraryElementB.definingCompilationUnit) |
- .thenReturn(libraryUnitElementB); |
- } |
- |
- void test_aboutToIndexDart_disposedContext() { |
- when(contextA.isDisposed).thenReturn(true); |
- expect(store.aboutToIndex(contextA, unitElementA), isFalse); |
- } |
- |
- Future test_aboutToIndexDart_library_first() { |
- when(libraryElement.parts) |
- .thenReturn(<CompilationUnitElement>[unitElementA, unitElementB]); |
- { |
- store.aboutToIndex(contextA, libraryUnitElement); |
- store.doneIndex(); |
- } |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, []); |
- }); |
- } |
- |
- test_aboutToIndexDart_library_secondWithoutOneUnit() { |
- LocationImpl locationA = mockLocation(indexableA); |
- LocationImpl locationB = mockLocation(indexableB); |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordRelationship(indexableA, relationship, locationA); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextA, unitElementB); |
- store.recordRelationship(indexableA, relationship, locationB); |
- store.doneIndex(); |
- } |
- // "A" and "B" locations |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, [locationA, locationB]); |
- // apply "libraryUnitElement", only with "B" |
- when(libraryElement.parts).thenReturn([unitElementB]); |
- { |
- store.aboutToIndex(contextA, libraryUnitElement); |
- store.doneIndex(); |
- } |
- }).then((_) { |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, [locationB]); |
- }); |
- }); |
- } |
- |
- void test_aboutToIndexDart_nullContext() { |
- expect(store.aboutToIndex(null, unitElementA), isFalse); |
- } |
- |
- void test_aboutToIndexDart_nullLibraryElement() { |
- when(unitElementA.library).thenReturn(null); |
- expect(store.aboutToIndex(contextA, unitElementA), isFalse); |
- } |
- |
- void test_aboutToIndexDart_nullLibraryUnitElement() { |
- when(libraryElement.definingCompilationUnit).thenReturn(null); |
- expect(store.aboutToIndex(contextA, unitElementA), isFalse); |
- } |
- |
- void test_aboutToIndexDart_nullUnitElement() { |
- expect(store.aboutToIndex(contextA, null), isFalse); |
- } |
- |
- test_cancelIndexDart() { |
- LocationImpl locationA = mockLocation(indexableA); |
- LocationImpl locationB = mockLocation(indexableA); |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordRelationship(indexableA, relationship, locationA); |
- store.recordRelationship(indexableA, relationship, locationB); |
- store.recordTopLevelDeclaration(elementA); |
- store.cancelIndex(); |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, []); |
- expect(store.getTopLevelDeclarations((name) => true), isEmpty); |
- }); |
- } |
- |
- void test_clear() { |
- LocationImpl locationA = mockLocation(indexableA); |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordRelationship(indexableA, relationship, locationA); |
- store.doneIndex(); |
- expect(nodeManager.isEmpty(), isFalse); |
- // clear |
- store.clear(); |
- expect(nodeManager.isEmpty(), isTrue); |
- } |
- |
- test_getRelationships_empty() { |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- expect(locations, isEmpty); |
- }); |
- } |
- |
- void test_getStatistics() { |
- // empty initially |
- { |
- String statistics = store.statistics; |
- expect(statistics, contains('0 locations')); |
- expect(statistics, contains('0 sources')); |
- } |
- // add 2 locations |
- LocationImpl locationA = mockLocation(indexableA); |
- LocationImpl locationB = mockLocation(indexableB); |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordRelationship(indexableA, relationship, locationA); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextA, unitElementB); |
- store.recordRelationship(indexableA, relationship, locationB); |
- store.doneIndex(); |
- } |
- { |
- String statistics = store.statistics; |
- expect(statistics, contains('2 locations')); |
- expect(statistics, contains('3 sources')); |
- } |
- } |
- |
- void test_recordRelationship_multiplyDefinedElement() { |
- Element multiplyElement = |
- new MultiplyDefinedElementImpl(contextA, <Element>[elementA, elementB]); |
- LocationImpl location = mockLocation(indexableA); |
- store.recordRelationship( |
- new IndexableElement(multiplyElement), relationship, location); |
- store.doneIndex(); |
- expect(nodeManager.isEmpty(), isTrue); |
- } |
- |
- void test_recordRelationship_nullElement() { |
- LocationImpl locationA = mockLocation(indexableA); |
- store.recordRelationship(null, relationship, locationA); |
- store.doneIndex(); |
- expect(nodeManager.isEmpty(), isTrue); |
- } |
- |
- void test_recordRelationship_nullLocation() { |
- store.recordRelationship(indexableA, relationship, null); |
- store.doneIndex(); |
- expect(nodeManager.isEmpty(), isTrue); |
- } |
- |
- test_recordRelationship_oneElement_twoNodes() { |
- LocationImpl locationA = mockLocation(indexableA); |
- LocationImpl locationB = mockLocation(indexableB); |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordRelationship(indexableA, relationship, locationA); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextA, unitElementB); |
- store.recordRelationship(indexableA, relationship, locationB); |
- store.doneIndex(); |
- } |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, [locationA, locationB]); |
- }); |
- } |
- |
- test_recordRelationship_oneLocation() { |
- LocationImpl locationA = mockLocation(indexableA); |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordRelationship(indexableA, relationship, locationA); |
- store.doneIndex(); |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, [locationA]); |
- }); |
- } |
- |
- test_recordRelationship_twoLocations() { |
- LocationImpl locationA = mockLocation(indexableA); |
- LocationImpl locationB = mockLocation(indexableA); |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordRelationship(indexableA, relationship, locationA); |
- store.recordRelationship(indexableA, relationship, locationB); |
- store.doneIndex(); |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, [locationA, locationB]); |
- }); |
- } |
- |
- test_removeContext() { |
- LocationImpl locationA = mockLocation(indexableA); |
- LocationImpl locationB = mockLocation(indexableB); |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordRelationship(indexableA, relationship, locationA); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextA, unitElementB); |
- store.recordRelationship(indexableA, relationship, locationB); |
- store.doneIndex(); |
- } |
- // "A" and "B" locations |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, [locationA, locationB]); |
- // remove "A" context |
- store.removeContext(contextA); |
- }).then((_) { |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, []); |
- }); |
- }); |
- } |
- |
- void test_removeContext_nullContext() { |
- store.removeContext(null); |
- } |
- |
- test_removeSource_library() async { |
- when(elementB.library).thenReturn(libraryElementB); |
- when(unitElementB.library).thenReturn(libraryElementB); |
- LocationImpl locationA = mockLocation(indexableA); |
- LocationImpl locationB = mockLocation(indexableB); |
- LocationImpl locationC = mockLocation(indexableC); |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordRelationship(indexableD, relationship, locationA); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextA, unitElementB); |
- store.recordRelationship(indexableD, relationship, locationB); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextA, unitElementC); |
- store.recordRelationship(indexableD, relationship, locationC); |
- store.doneIndex(); |
- } |
- // "A", "B" and "C" locations |
- { |
- var locations = await store.getRelationships(indexableD, relationship); |
- assertLocations(locations, [locationA, locationB, locationC]); |
- } |
- // remove "librarySource" |
- store.removeSource(contextA, librarySource); |
- // only "B" location, which is in "librarySourceB" |
- { |
- var locations = await store.getRelationships(indexableD, relationship); |
- assertLocations(locations, [locationB]); |
- } |
- } |
- |
- void test_removeSource_nullContext() { |
- store.removeSource(null, sourceA); |
- } |
- |
- test_removeSource_unit() { |
- LocationImpl locationA = mockLocation(indexableA); |
- LocationImpl locationB = mockLocation(indexableB); |
- LocationImpl locationC = mockLocation(indexableC); |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordRelationship(indexableA, relationship, locationA); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextA, unitElementB); |
- store.recordRelationship(indexableA, relationship, locationB); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextA, unitElementC); |
- store.recordRelationship(indexableA, relationship, locationC); |
- store.doneIndex(); |
- } |
- // "A", "B" and "C" locations |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, [locationA, locationB, locationC]); |
- }).then((_) { |
- // remove "A" source |
- store.removeSource(contextA, sourceA); |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, [locationB, locationC]); |
- }); |
- }); |
- } |
- |
- test_removeSources_library() { |
- LocationImpl locationA = mockLocation(indexableA); |
- LocationImpl locationB = mockLocation(indexableB); |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordRelationship(indexableA, relationship, locationA); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextA, unitElementB); |
- store.recordRelationship(indexableA, relationship, locationB); |
- store.doneIndex(); |
- } |
- // "A" and "B" locations |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, [locationA, locationB]); |
- }).then((_) { |
- // remove "librarySource" |
- store.removeSources(contextA, new SingleSourceContainer(librarySource)); |
- return store |
- .getRelationships(indexableA, relationship) |
- .then((List<LocationImpl> locations) { |
- assertLocations(locations, []); |
- }); |
- }); |
- } |
- |
- void test_removeSources_nullContext() { |
- store.removeSources(null, null); |
- } |
- |
- void test_removeSources_unit() { |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordTopLevelDeclaration(elementA); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextA, unitElementB); |
- store.recordTopLevelDeclaration(elementB); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextA, unitElementC); |
- store.recordTopLevelDeclaration(elementC); |
- store.doneIndex(); |
- } |
- // A, B, C elements |
- { |
- List<Element> elements = store.getTopLevelDeclarations(anyName); |
- expect(elements, unorderedEquals([elementA, elementB, elementC])); |
- } |
- // remove "A" source |
- store.removeSources(contextA, new SingleSourceContainer(sourceA)); |
- store.removeSource(contextA, sourceA); |
- { |
- List<Element> elements = store.getTopLevelDeclarations(anyName); |
- expect(elements, unorderedEquals([elementB, elementC])); |
- } |
- } |
- |
- void test_universe_aboutToIndex() { |
- when(elementCodec.decode(contextA, 11, 12, 13)) |
- .thenReturn(new IndexableElement(elementA)); |
- when(elementCodec.decode(contextB, 21, 22, 23)) |
- .thenReturn(new IndexableElement(elementB)); |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordTopLevelDeclaration(elementA); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextB, unitElementB); |
- store.recordTopLevelDeclaration(elementB); |
- store.doneIndex(); |
- } |
- // elementA, elementB |
- { |
- List<Element> elements = store.getTopLevelDeclarations(anyName); |
- expect(elements, unorderedEquals([elementA, elementB])); |
- } |
- // re-index "unitElementA" |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.doneIndex(); |
- } |
- { |
- List<Element> elements = store.getTopLevelDeclarations(anyName); |
- expect(elements, unorderedEquals([elementB])); |
- } |
- } |
- |
- void test_universe_clear() { |
- when(elementCodec.decode(contextA, 11, 12, 13)) |
- .thenReturn(new IndexableElement(elementA)); |
- when(elementCodec.decode(contextB, 21, 22, 23)) |
- .thenReturn(new IndexableElement(elementB)); |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordTopLevelDeclaration(elementA); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextB, unitElementB); |
- store.recordTopLevelDeclaration(elementB); |
- store.doneIndex(); |
- } |
- // elementA, elementB |
- { |
- List<Element> elements = store.getTopLevelDeclarations(anyName); |
- expect(elements, unorderedEquals([elementA, elementB])); |
- } |
- // clear |
- store.clear(); |
- { |
- List<Element> elements = store.getTopLevelDeclarations(anyName); |
- expect(elements, isEmpty); |
- } |
- } |
- |
- void test_universe_removeContext() { |
- when(elementCodec.decode(contextA, 11, 12, 13)) |
- .thenReturn(new IndexableElement(elementA)); |
- when(elementCodec.decode(contextB, 21, 22, 23)) |
- .thenReturn(new IndexableElement(elementB)); |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordTopLevelDeclaration(elementA); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextB, unitElementB); |
- store.recordTopLevelDeclaration(elementB); |
- store.doneIndex(); |
- } |
- // elementA, elementB |
- { |
- List<Element> elements = store.getTopLevelDeclarations(anyName); |
- expect(elements, unorderedEquals([elementA, elementB])); |
- } |
- // remove "contextA" |
- store.removeContext(contextA); |
- { |
- List<Element> elements = store.getTopLevelDeclarations(anyName); |
- expect(elements, unorderedEquals([elementB])); |
- } |
- } |
- |
- void test_universe_removeSource() { |
- when(elementCodec.decode(contextA, 11, 12, 13)) |
- .thenReturn(new IndexableElement(elementA)); |
- when(elementCodec.decode(contextB, 21, 22, 23)) |
- .thenReturn(new IndexableElement(elementB)); |
- { |
- store.aboutToIndex(contextA, unitElementA); |
- store.recordTopLevelDeclaration(elementA); |
- store.doneIndex(); |
- } |
- { |
- store.aboutToIndex(contextB, unitElementB); |
- store.recordTopLevelDeclaration(elementB); |
- store.doneIndex(); |
- } |
- // elementA, elementB |
- { |
- List<Element> elements = store.getTopLevelDeclarations(anyName); |
- expect(elements, unorderedEquals([elementA, elementB])); |
- } |
- // remove "sourceA" |
- store.removeSource(contextA, sourceA); |
- { |
- List<Element> elements = store.getTopLevelDeclarations(anyName); |
- expect(elements, unorderedEquals([elementB])); |
- } |
- } |
- |
- static bool anyName(String name) => true; |
- |
- /** |
- * Asserts that the [actual] locations have all the [expected] locations and |
- * only them. |
- */ |
- static void assertLocations( |
- List<LocationImpl> actual, List<LocationImpl> expected) { |
- List<_LocationEqualsWrapper> actualWrappers = wrapLocations(actual); |
- List<_LocationEqualsWrapper> expectedWrappers = wrapLocations(expected); |
- expect(actualWrappers, unorderedEquals(expectedWrappers)); |
- } |
- |
- /** |
- * @return the new [LocationImpl] mock. |
- */ |
- static LocationImpl mockLocation(IndexableElement indexable) { |
- LocationImpl location = new MockLocation(); |
- when(location.indexable).thenReturn(indexable); |
- when(location.offset).thenReturn(0); |
- when(location.length).thenReturn(0); |
- when(location.isQualified).thenReturn(true); |
- when(location.isResolved).thenReturn(true); |
- return location; |
- } |
- |
- /** |
- * Wraps the given locations into [LocationEqualsWrapper]. |
- */ |
- static List<_LocationEqualsWrapper> wrapLocations( |
- List<LocationImpl> locations) { |
- List<_LocationEqualsWrapper> wrappers = <_LocationEqualsWrapper>[]; |
- for (LocationImpl location in locations) { |
- wrappers.add(new _LocationEqualsWrapper(location)); |
- } |
- return wrappers; |
- } |
-} |