// This product is provided under the terms of EPL (Eclipse Public License)
// version 1.0.
//
// The full license text can be read from: http://www.eclipse.org/org/documents/epl-v10.php
package org.dtangler.core.dependencies;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.dtangler.core.dependencies.Dependencies.DependencyFilter;
import org.junit.Test;
public class DependenciesTest {
private final Dependable A1 = new TestDependable("a1", TestScope.scope1);
private final Dependable A2 = new TestDependable("a2", TestScope.scope1);
private final Dependable A3 = new TestDependable("a3", TestScope.scope1);
private final Dependable A4 = new TestDependable("a4", TestScope.scope1);
private final Dependable A5 = new TestDependable("a5", TestScope.scope1);
private final Dependable B1 = new TestDependable("b1", TestScope.scope2);
private final Dependable B2 = new TestDependable("b2", TestScope.scope2);
private final Dependable B3 = new TestDependable("b3", TestScope.scope2);
private final Dependable C1 = new TestDependable("c1", TestScope.scope3);
private final Dependable C2 = new TestDependable("c2", TestScope.scope3);
private final Dependable C3 = new TestDependable("c3", TestScope.scope3);
private final Dependable a1 = new TestDependable("a", TestScope.scope3);
private final Dependable b1 = new TestDependable("b", TestScope.scope3);
private final Dependable c1 = new TestDependable("c", TestScope.scope3);
private final Dependable a2 = new TestDependable("d", TestScope.scope3);
private final Dependable b2 = new TestDependable("d", TestScope.scope3);
private Map<Dependable, Integer> createMap(Dependable... items) {
Map<Dependable, Integer> result = new HashMap();
for (Dependable item : items) {
result.put(item, 1);
}
return result;
}
private Set<Dependable> createSet(Dependable... items) {
return new HashSet(Arrays.asList(items));
}
@Test
public void testEmptyDependencies() {
assertTrue(new Dependencies().getAvailableScopes().isEmpty());
}
@Test
public void testGetEmptyGraph() {
DependencyGraph graph = new Dependencies()
.getDependencyGraph(TestScope.scope1);
assertTrue(graph.getAllItems().isEmpty());
}
@Test
public void testGetAvailableScopesByAddingDeps() {
Dependencies deps = new Dependencies();
assertTrue(deps.getAvailableScopes().isEmpty());
deps.addDependencies(B1, createMap(B2));
assertEquals(Arrays.asList(TestScope.scope2), deps.getAvailableScopes());
deps.addDependencies(C1, createMap(A2));
assertEquals(Arrays.asList(TestScope.scope1, TestScope.scope2,
TestScope.scope3), deps.getAvailableScopes());
}
@Test
public void testGetParentAndChildScopesWithAllScopes() {
Dependencies deps = new Dependencies();
deps.addChild(A1, B1);
deps.addChild(B1, C1);
assertEquals(TestScope.scope2, deps.getChildScope(TestScope.scope1));
assertEquals(TestScope.scope3, deps.getChildScope(TestScope.scope2));
assertNull(deps.getChildScope(TestScope.scope3));
assertEquals(TestScope.scope2, deps.getParentScope(TestScope.scope3));
assertEquals(TestScope.scope1, deps.getParentScope(TestScope.scope2));
assertNull(deps.getParentScope(TestScope.scope1));
}
@Test
public void testGetParentAndChildScopesWithSomeScopes() {
Dependencies deps = new Dependencies();
deps.addChild(A1, C1);
assertEquals(TestScope.scope3, deps.getChildScope(TestScope.scope1));
assertNull(deps.getChildScope(TestScope.scope2));
assertNull(deps.getChildScope(TestScope.scope3));
assertEquals(TestScope.scope1, deps.getParentScope(TestScope.scope3));
assertNull(deps.getParentScope(TestScope.scope2));
assertNull(deps.getParentScope(TestScope.scope1));
}
@Test
public void testGetAvailableScopesByAddingParentChildRelations() {
Dependencies deps = new Dependencies();
assertTrue(deps.getAvailableScopes().isEmpty());
deps.addChild(B1, B2);
assertEquals(Arrays.asList(TestScope.scope2), deps.getAvailableScopes());
deps.addChild(C1, A2);
assertEquals(Arrays.asList(TestScope.scope1, TestScope.scope2,
TestScope.scope3), deps.getAvailableScopes());
}
@Test
public void testSimpleGraphWithOneScope() {
Dependencies deps = new Dependencies();
deps.addDependencies(A1, createMap(A2, A3));
deps.addDependencies(A2, createMap(A3));
DependencyGraph graph = deps.getDependencyGraph(TestScope.scope1);
assertEquals(createSet(A1, A2, A3), graph.getAllItems());
assertEquals(createSet(A2, A3), graph.getDependencies(A1));
assertEquals(createSet(A3), graph.getDependencies(A2));
assertEquals(Collections.EMPTY_SET, graph.getDependencies(A3));
}
@Test
public void testTwoScopesGraphWithDerivedDependencies() {
Dependencies deps = new Dependencies();
deps.addDependencies(A1, createMap(A2, A3));
deps.addDependencies(A2, createMap(A3));
deps.addDependencies(A4, createMap(A3));
deps.addDependencies(A5, createMap(A1, A4));
deps.addChild(B1, A1);
deps.addChild(B1, A2);
deps.addChild(B2, A3);
deps.addChild(B3, A4);
deps.addChild(B3, A5);
DependencyGraph graph = deps.getDependencyGraph(TestScope.scope2);
assertEquals(createSet(B1, B2, B3), graph.getAllItems());
assertEquals(createSet(B2), graph.getDependencies(B1));
assertEquals(Collections.EMPTY_SET, graph.getDependencies(B2));
assertEquals(createSet(B1, B2), graph.getDependencies(B3));
}
@Test
public void testTwoScopesGraphWithDirectAndDerivedDependencies() {
Dependencies deps = new Dependencies();
deps.addDependencies(A1, createMap(A2));
deps.addDependencies(B1, createMap(B3));
deps.addChild(B1, A1);
deps.addChild(B2, A2);
DependencyGraph graph = deps.getDependencyGraph(TestScope.scope2);
assertEquals(createSet(B1, B2, B3), graph.getAllItems());
assertEquals(createSet(B2, B3), graph.getDependencies(B1));
assertEquals(Collections.EMPTY_SET, graph.getDependencies(B2));
assertEquals(Collections.EMPTY_SET, graph.getDependencies(B3));
}
@Test
public void testThreeScopesGraphWithDerivedDependencies() {
Dependencies deps = new Dependencies();
deps.addDependencies(A2, createMap(A1));
deps.addDependencies(B3, createMap(B2));
deps.addChild(B1, A1);
deps.addChild(B2, A2);
deps.addChild(C1, B1);
deps.addChild(C2, B2);
deps.addChild(C3, B3);
DependencyGraph graph = deps.getDependencyGraph(TestScope.scope3);
assertEquals(createSet(C1, C2, C3), graph.getAllItems());
assertEquals(Collections.EMPTY_SET, graph.getDependencies(C1));
assertEquals(createSet(C1), graph.getDependencies(C2));
assertEquals(createSet(C2), graph.getDependencies(C3));
}
@Test
public void testGetGraphByParentsOneScopeUp() {
Dependencies deps = new Dependencies();
deps.addDependencies(A1, createMap(A2, A3, A4));
deps.addDependencies(A2, createMap(A3, A4));
deps.addChild(B1, A1);
deps.addChild(B1, A2);
deps.addChild(B2, A3);
deps.addChild(B3, A4);
DependencyGraph graph = deps.getDependencyGraph(TestScope.scope1,
new HashSet(Arrays.asList(B1, B2)), DependencyFilter.none);
assertEquals(createSet(A1, A2, A3), graph.getAllItems());
assertEquals(createSet(A2, A3), graph.getDependencies(A1));
assertEquals(createSet(A3), graph.getDependencies(A2));
assertEquals(Collections.EMPTY_SET, graph.getDependencies(A3));
DependencyGraph graphFiltered = deps.getDependencyGraph(
TestScope.scope1, new HashSet(Arrays.asList(B1)),
DependencyFilter.itemsContributingToTheParentDependencyWeight);
assertTrue(graphFiltered.getAllItems().size() == 0);
graphFiltered = deps.getDependencyGraph(TestScope.scope1, new HashSet(
Arrays.asList(B1, B2)),
DependencyFilter.itemsContributingToTheParentDependencyWeight);
assertEquals(createSet(A1, A2, A3), graphFiltered.getAllItems());
assertEquals(createSet(A3), graphFiltered.getDependencies(A1));
assertEquals(createSet(A3), graphFiltered.getDependencies(A2));
graphFiltered = deps.getDependencyGraph(TestScope.scope1, new HashSet(
Arrays.asList(B1, B3)),
DependencyFilter.itemsContributingToTheParentDependencyWeight);
assertEquals(createSet(A1, A2, A4), graphFiltered.getAllItems());
assertEquals(createSet(A4), graphFiltered.getDependencies(A1));
assertEquals(createSet(A4), graphFiltered.getDependencies(A2));
graphFiltered = deps.getDependencyGraph(TestScope.scope1, new HashSet(
Arrays.asList(B2, B3)),
DependencyFilter.itemsContributingToTheParentDependencyWeight);
assertTrue(graphFiltered.getAllItems().size() == 0);
graphFiltered = deps.getDependencyGraph(TestScope.scope1, new HashSet(
Arrays.asList(B1, B2, B3)),
DependencyFilter.itemsContributingToTheParentDependencyWeight);
assertEquals(createSet(A1, A2, A3, A4), graphFiltered.getAllItems());
assertEquals(createSet(A3, A4), graphFiltered.getDependencies(A1));
assertEquals(createSet(A3, A4), graphFiltered.getDependencies(A2));
assertEquals(Collections.EMPTY_SET, graphFiltered.getDependencies(A3));
assertEquals(Collections.EMPTY_SET, graphFiltered.getDependencies(A4));
}
@Test
public void testGetGraphByParentsTwoScopesUp() {
Dependencies deps = new Dependencies();
deps.addDependencies(A1, createMap(A2, A3, A4));
deps.addDependencies(A2, createMap(A3, A4));
deps.addChild(B1, A1);
deps.addChild(B1, A2);
deps.addChild(B2, A3);
deps.addChild(B3, A4);
deps.addChild(C1, B1);
deps.addChild(C2, B2);
deps.addChild(C3, B3);
DependencyGraph graph = deps.getDependencyGraph(TestScope.scope1,
new HashSet(Arrays.asList(C1, C2)), DependencyFilter.none);
assertEquals(createSet(A1, A2, A3), graph.getAllItems());
assertEquals(createSet(A2, A3), graph.getDependencies(A1));
assertEquals(createSet(A3), graph.getDependencies(A2));
assertEquals(Collections.EMPTY_SET, graph.getDependencies(A3));
DependencyGraph graphFiltered = deps.getDependencyGraph(
TestScope.scope1, new HashSet(Arrays.asList(C1)),
DependencyFilter.itemsContributingToTheParentDependencyWeight);
assertTrue(graphFiltered.getAllItems().size() == 0);
graphFiltered = deps.getDependencyGraph(
TestScope.scope1, new HashSet(Arrays.asList(C1, C2)),
DependencyFilter.itemsContributingToTheParentDependencyWeight);
assertEquals(createSet(A1, A2, A3), graphFiltered.getAllItems());
assertEquals(createSet(A3), graphFiltered.getDependencies(A1));
assertEquals(createSet(A3), graphFiltered.getDependencies(A2));
}
@Test
public void testSetParentToSelfIsIgnored() {
Dependencies deps = new Dependencies();
deps.addChild(A1, A1);
assertEquals(createSet(A1), deps.getDependencyGraph(TestScope.scope1)
.getAllItems());
assertEquals(Collections.EMPTY_SET, deps.getChilds(A1));
}
@Test
public void testCyclicParents() {
Dependencies deps = new Dependencies();
deps.addChild(B1, A1);
deps.addChild(C1, B1);
deps.addChild(A1, C1);
assertEquals(createSet(C1), deps.getChilds(A1));
assertEquals(createSet(A1), deps.getChilds(B1));
assertEquals(createSet(B1), deps.getChilds(C1));
}
@Test
public void testGetParent() {
Dependencies deps = new Dependencies();
deps.addChild(A1, B1);
deps.addChild(A1, B2);
deps.addChild(A2, B3);
assertEquals(createSet(A1), deps.getParents(B1, deps.getParentScope(B1
.getScope())));
assertEquals(createSet(A1), deps.getParents(B2, deps.getParentScope(B2
.getScope())));
assertEquals(createSet(A2), deps.getParents(B3, deps.getParentScope(B3
.getScope())));
}
@Test
public void testGetDependencyWeight() {
Dependencies deps = createDependenciesWithWeights();
assertEquals(2, deps.getDependencyGraph(TestScope.scope3)
.getDependencyWeight(a1, b1));
assertEquals(1, deps.getDependencyGraph(TestScope.scope3)
.getDependencyWeight(b1, a2));
assertEquals(0, deps.getDependencyGraph(TestScope.scope3)
.getDependencyWeight(a2, b2));
assertEquals(24, deps.getDependencyGraph(TestScope.scope3)
.getDependencyWeight(b2, b1));
assertEquals(2, deps.getDependencyGraph(TestScope.scope3)
.getDependencyWeight(c1, a1));
}
private Dependencies createDependenciesWithWeights() {
Dependencies deps = new Dependencies();
Map<Dependable, Integer> a1b1 = createWeights(b1, 2);
deps.addDependencies(a1, a1b1);
Map<Dependable, Integer> b1a2 = createWeights(a2, 1);
deps.addDependencies(b1, b1a2);
Map<Dependable, Integer> a2b2 = createWeights(b2, 0);
deps.addDependencies(a2, a2b2);
Map<Dependable, Integer> b2b1 = createWeights(b1, 24);
deps.addDependencies(b2, b2b1);
Map<Dependable, Integer> c1a1 = createWeights(a1, 2);
deps.addDependencies(c1, c1a1);
return deps;
}
private Map<Dependable, Integer> createWeights(Dependable to, Integer amount) {
Map<Dependable, Integer> dependencyWeight = new HashMap();
dependencyWeight.put(to, amount);
return dependencyWeight;
}
}