// 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.assertTrue;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
public class DependencyGraphTest {
private static final Dependable XOO = new TestDependable("boo");
private static final Dependable BAY = new TestDependable("bay");
private static final Dependable BAR = new TestDependable("bar");
private static final Dependable FOO = new TestDependable("foo");
private static final Dependable XYZ = new TestDependable("xyz");
private DependencyGraph deps;
@Before
public void setUp() {
deps = new DependencyGraph(null, new HashSet(Arrays.asList(FOO, BAR,
BAY, XOO, XYZ)));
deps.addDependency(FOO, BAR);
deps.addDependency(FOO, BAY);
deps.addDependency(FOO, BAY);
deps.addDependency(XOO, FOO);
deps.addDependency(XOO, BAY);
deps.addDependency(BAY, BAR);
}
@Test
public void testGetDependants() {
assertResult(deps.getDependants(FOO), XOO);
assertResult(deps.getDependants(BAR), FOO, BAY);
assertResult(deps.getDependants(BAY), FOO, XOO);
assertResult(deps.getDependants(XOO), new Dependable[] {});
}
@Test
public void testGetDependencies() {
assertResult(deps.getDependencies(FOO), BAR, BAY);
assertResult(deps.getDependencies(BAR), new Dependable[] {});
assertResult(deps.getDependencies(BAY), BAR);
assertResult(deps.getDependencies(XOO), FOO, BAY);
}
@Test
public void testDependencyWeight() {
assertEquals(1, deps.getDependencyWeight(FOO, BAR));
assertEquals(2, deps.getDependencyWeight(FOO, BAY));
assertEquals(0, deps.getDependencyWeight(FOO, XOO));
}
@Test
public void testInstability() {
assertInstability(2, 1, deps.getInstability(FOO));
assertInstability(2, 0, deps.getInstability(XOO));
assertInstability(0, 1, deps.getInstability(BAR));
assertInstability(0, 0, deps.getInstability(XYZ));
assertInstability(1, 2, deps.getInstability(BAY));
}
@Test
public void testDependencyWeightDoesNotAffectInstability() {
assertInstability(2, 1, deps.getInstability(FOO));
deps.addDependency(FOO, BAR);
assertInstability(2, 1, deps.getInstability(FOO));
deps.addDependency(FOO, BAR);
assertInstability(2, 1, deps.getInstability(FOO));
deps.addDependency(XOO, FOO);
assertInstability(2, 1, deps.getInstability(FOO));
}
private void assertInstability(float dependencies, float dependants,
float actual) {
float expected = dependencies / (dependants + dependencies);
// Workaround for incorrect double assertEquals in some JUnit4 versions
assertTrue(Double.valueOf(expected).equals(Double.valueOf(actual)));
}
@Test
public void testDependencyOnSelfIsIgnored() {
deps.addDependency(XYZ, XYZ);
assertTrue(deps.getDependants(XYZ).isEmpty());
assertTrue(deps.getDependencies(XYZ).isEmpty());
}
@Test
public void testOuterDependency() {
deps.addDependency(XYZ, new TestDependable("outer"));
assertTrue(deps.getDependencies(XYZ).isEmpty());
}
@Test
public void testOuterDependant() {
deps.addDependency(new TestDependable("outer"), XYZ);
assertTrue(deps.getDependants(XYZ).isEmpty());
}
private void assertResult(Set<Dependable> actual, Dependable... expected) {
assertEquals(actual.size(), expected.length);
for (Object item : expected)
assertTrue(actual.contains(item));
}
}