Index: dart/editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/internal/index/file/FileNodeManagerTest.java |
=================================================================== |
--- dart/editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/internal/index/file/FileNodeManagerTest.java (revision 0) |
+++ dart/editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/internal/index/file/FileNodeManagerTest.java (revision 0) |
@@ -0,0 +1,224 @@ |
+/* |
+ * Copyright (c) 2014, the Dart project authors. |
+ * |
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except |
+ * in compliance with the License. You may obtain a copy of the License at |
+ * |
+ * http://www.eclipse.org/legal/epl-v10.html |
+ * |
+ * Unless required by applicable law or agreed to in writing, software distributed under the License |
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
+ * or implied. See the License for the specific language governing permissions and limitations under |
+ * the License. |
+ */ |
+package com.google.dart.engine.internal.index.file; |
+ |
+import com.google.common.base.Objects; |
+import com.google.common.collect.ImmutableMap; |
+import com.google.common.collect.Lists; |
+import com.google.dart.engine.context.AnalysisContext; |
+import com.google.dart.engine.element.Element; |
+import com.google.dart.engine.index.Location; |
+import com.google.dart.engine.index.Relationship; |
+import com.google.dart.engine.utilities.logging.Logger; |
+ |
+import junit.framework.TestCase; |
+ |
+import static org.fest.assertions.Assertions.assertThat; |
+import static org.mockito.Matchers.any; |
+import static org.mockito.Matchers.anyString; |
+import static org.mockito.Mockito.mock; |
+import static org.mockito.Mockito.times; |
+import static org.mockito.Mockito.verify; |
+import static org.mockito.Mockito.verifyZeroInteractions; |
+import static org.mockito.Mockito.when; |
+ |
+import java.io.ByteArrayInputStream; |
+import java.io.ByteArrayOutputStream; |
+import java.io.InputStream; |
+import java.util.List; |
+import java.util.Map; |
+ |
+public class FileNodeManagerTest extends TestCase { |
+ private FileManager fileManager = mock(FileManager.class); |
+ private Logger logger = mock(Logger.class); |
+ private AnalysisContext context = mock(AnalysisContext.class); |
+ private int contextId = 13; |
+ private ContextCodec contextCodec = mock(ContextCodec.class); |
+ private StringCodec stringCodec = new StringCodec(); |
+ private ElementCodec elementCodec = mock(ElementCodec.class); |
+ private int nextElementId = 0; |
+ private RelationshipCodec relationshipCodec = new RelationshipCodec(stringCodec); |
+ private FileNodeManager nodeManager = new FileNodeManager( |
+ fileManager, |
+ logger, |
+ stringCodec, |
+ contextCodec, |
+ elementCodec, |
+ relationshipCodec); |
+ |
+ public void test_clear() throws Exception { |
+ nodeManager.clear(); |
+ verify(fileManager, times(1)).clear(); |
+ } |
+ |
+ public void test_getContextCodec() throws Exception { |
+ assertSame(contextCodec, nodeManager.getContextCodec()); |
+ } |
+ |
+ public void test_getElementCodec() throws Exception { |
+ assertSame(elementCodec, nodeManager.getElementCodec()); |
+ } |
+ |
+ public void test_getLocationCount_empty() throws Exception { |
+ assertEquals(0, nodeManager.getLocationCount()); |
+ } |
+ |
+ public void test_getNode_contextNull() throws Exception { |
+ String name = "42.index"; |
+ // prepare output stream |
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
+ when(fileManager.openOutputStream(name)).thenReturn(outputStream); |
+ // put Node |
+ { |
+ IndexNode node = new IndexNode(context, elementCodec, relationshipCodec); |
+ nodeManager.putNode(name, node); |
+ } |
+ // force "null" context |
+ when(contextCodec.decode(contextId)).thenReturn(null); |
+ // prepare input stream |
+ InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); |
+ when(fileManager.openInputStream(name)).thenReturn(inputStream); |
+ // no Node |
+ IndexNode node = nodeManager.getNode(name); |
+ assertNull(node); |
+ // no exceptions |
+ verifyZeroInteractions(logger); |
+ } |
+ |
+ public void test_getNode_invalidVersion() throws Exception { |
+ String name = "42.index"; |
+ // prepare a stream with an invalid version |
+ when(fileManager.openInputStream(name)).thenReturn( |
+ new ByteArrayInputStream(new byte[] {0x01, 0x02, 0x03, 0x04})); |
+ // no Node |
+ IndexNode node = nodeManager.getNode(name); |
+ assertNull(node); |
+ // failed |
+ verify(logger).logError(anyString(), any(IllegalStateException.class)); |
+ } |
+ |
+ public void test_getNode_streamException() throws Exception { |
+ String name = "42.index"; |
+ when(fileManager.openInputStream(name)).thenThrow(new Exception()); |
+ // no Node |
+ IndexNode node = nodeManager.getNode(name); |
+ assertNull(node); |
+ // failed |
+ verify(logger).logError(anyString(), any(Throwable.class)); |
+ } |
+ |
+ public void test_getNode_streamNull() throws Exception { |
+ String name = "42.index"; |
+ when(fileManager.openInputStream(name)).thenReturn(null); |
+ // no Node |
+ IndexNode node = nodeManager.getNode(name); |
+ assertNull(node); |
+ } |
+ |
+ public void test_getStringCodec() throws Exception { |
+ assertSame(stringCodec, nodeManager.getStringCodec()); |
+ } |
+ |
+ public void test_newNode() throws Exception { |
+ IndexNode node = nodeManager.newNode(context); |
+ assertSame(context, node.getContext()); |
+ assertEquals(0, node.getLocationCount()); |
+ } |
+ |
+ public void test_putNode_getNode() throws Exception { |
+ String name = "42.index"; |
+ // prepare output stream |
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
+ when(fileManager.openOutputStream(name)).thenReturn(outputStream); |
+ // prepare elements |
+ Element elementA = mockElement(); |
+ Element elementB = mockElement(); |
+ Element elementC = mockElement(); |
+ Relationship relationship = Relationship.getRelationship("my-relationship"); |
+ // put Node |
+ { |
+ // prepare relations |
+ int elementIdA = 0; |
+ int elementIdB = 1; |
+ int elementIdC = 2; |
+ int relationshipId = relationshipCodec.encode(relationship); |
+ RelationKeyData key = new RelationKeyData(elementIdA, relationshipId); |
+ List<LocationData> locations = Lists.newArrayList( |
+ new LocationData(elementIdB, 1, 10), |
+ new LocationData(elementIdC, 2, 20)); |
+ Map<RelationKeyData, List<LocationData>> relations = ImmutableMap.of(key, locations); |
+ // prepare Node |
+ IndexNode node = new IndexNode(context, elementCodec, relationshipCodec); |
+ node.setRelations(relations); |
+ // put Node |
+ nodeManager.putNode(name, node); |
+ } |
+ // has locations |
+ assertEquals(2, nodeManager.getLocationCount()); |
+ // prepare input stream |
+ InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); |
+ when(fileManager.openInputStream(name)).thenReturn(inputStream); |
+ // get Node |
+ IndexNode node = nodeManager.getNode(name); |
+ assertEquals(2, node.getLocationCount()); |
+ { |
+ Location[] locations = node.getRelationships(elementA, relationship); |
+ assertThat(locations).hasSize(2); |
+ assertHasLocation(locations, elementB, 1, 10); |
+ assertHasLocation(locations, elementC, 2, 20); |
+ } |
+ } |
+ |
+ public void test_putNode_streamException() throws Exception { |
+ String name = "42.index"; |
+ when(fileManager.openOutputStream(name)).thenThrow(new Exception()); |
+ // try to put |
+ IndexNode node = mock(IndexNode.class); |
+ nodeManager.putNode(name, node); |
+ // failed |
+ verify(logger).logError(anyString(), any(Throwable.class)); |
+ } |
+ |
+ public void test_removeNode() throws Exception { |
+ String name = "42.index"; |
+ nodeManager.removeNode(name); |
+ verify(fileManager).delete(name); |
+ } |
+ |
+ @Override |
+ protected void setUp() throws Exception { |
+ super.setUp(); |
+ when(contextCodec.encode(context)).thenReturn(contextId); |
+ when(contextCodec.decode(contextId)).thenReturn(context); |
+ } |
+ |
+ private void assertHasLocation(Location[] locations, Element element, int offset, int length) { |
+ for (Location location : locations) { |
+ if (Objects.equal(location.getElement(), element) && location.getOffset() == offset |
+ && location.getLength() == length) { |
+ return; |
+ } |
+ } |
+ fail("Expected to find Location(element=" + element + ", offset=" + offset + ", length=" |
+ + length + ")"); |
+ } |
+ |
+ private Element mockElement() { |
+ int elementId = nextElementId++; |
+ Element element = mock(Element.class); |
+ when(elementCodec.encode(element)).thenReturn(elementId); |
+ when(elementCodec.decode(context, elementId)).thenReturn(element); |
+ return element; |
+ } |
+} |
Property changes on: dart/editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/internal/index/file/FileNodeManagerTest.java |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |