blob: e728175bf18e30837ee7351a360e49d4aaecb185 [file] [log] [blame]
/*
* 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 junit.framework.TestCase;
import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.List;
import java.util.Map;
public class IndexNodeTest extends TestCase {
private AnalysisContext context = mock(AnalysisContext.class);
private StringCodec stringCodec = new StringCodec();
private ElementCodec elementCodec = mock(ElementCodec.class);
private int nextElementId = 0;
private RelationshipCodec relationshipCodec = new RelationshipCodec(stringCodec);
private IndexNode node = new IndexNode(context, elementCodec, relationshipCodec);
public void test_getContext() throws Exception {
assertSame(context, node.getContext());
}
public void test_recordRelationship() throws Exception {
Element elementA = mockElement();
Element elementB = mockElement();
Element elementC = mockElement();
Relationship relationship = Relationship.getRelationship("my-relationship");
Location locationA = new Location(elementB, 1, 2);
Location locationB = new Location(elementC, 10, 20);
// empty initially
assertEquals(0, node.getLocationCount());
// record
node.recordRelationship(elementA, relationship, locationA);
assertEquals(1, node.getLocationCount());
node.recordRelationship(elementA, relationship, locationB);
assertEquals(2, node.getLocationCount());
// get relations
assertThat(node.getRelationships(elementB, relationship)).isEmpty();
{
Location[] locations = node.getRelationships(elementA, relationship);
assertThat(locations).hasSize(2);
boolean hasLocationA = false;
boolean hasLocationB = false;
for (Location location : locations) {
hasLocationA |= location.getOffset() == 1 && location.getLength() == 2;
hasLocationB |= location.getOffset() == 10 && location.getLength() == 20;
}
assertTrue(hasLocationA);
assertTrue(hasLocationB);
}
// verify relations map
{
Map<RelationKeyData, List<LocationData>> relations = node.getRelations();
assertEquals(1, relations.size());
List<LocationData> locations = relations.values().iterator().next();
assertEquals(2, locations.size());
}
}
public void test_setRelations() throws Exception {
Element elementA = mockElement();
Element elementB = mockElement();
Element elementC = mockElement();
Relationship relationship = Relationship.getRelationship("my-relationship");
// record
{
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);
node.setRelations(relations);
}
// request
Location[] locations = node.getRelationships(elementA, relationship);
assertThat(locations).hasSize(2);
assertHasLocation(locations, elementB, 1, 10);
assertHasLocation(locations, elementC, 2, 20);
}
@Override
protected void tearDown() throws Exception {
stringCodec = null;
elementCodec = null;
relationshipCodec = null;
node = null;
super.tearDown();
}
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(element.getDisplayName()).thenReturn("element_" + elementId);
when(elementCodec.encode(element, true)).thenReturn(elementId);
when(elementCodec.encode(element, false)).thenReturn(elementId);
when(elementCodec.decode(context, elementId)).thenReturn(element);
return element;
}
}