// 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.javaengine.dependencyengine;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.HashSet;
import java.util.Set;
import org.dtangler.core.dependencies.DependencyGraph;
import org.dtangler.javaengine.dependencyengine.ClassDependencies;
import org.dtangler.javaengine.types.JavaClass;
import org.dtangler.javaengine.types.JavaScope;
import org.junit.Before;
import org.junit.Test;
public class ClassDependenciesTest {
private Set<JavaClass> classes;
private JavaClass foo;
private JavaClass fooImpl;
private JavaClass someUtil;
private JavaClass anotherUtil;
@Before
public void setUpClasses() {
foo = createClass("eg.foo.Foo", new String[] {});
fooImpl = createClass("eg.fooimpl.FooImpl", "eg.foo.Foo", "eg.foo.Foo",
"eg.util.SomeUtil");
someUtil = createClass("eg.util.SomeUtil", "eg.util.AnotherUtil");
anotherUtil = createClass("eg.util.AnotherUtil", new String[] {});
classes = new HashSet();
classes.add(foo);
classes.add(fooImpl);
classes.add(someUtil);
classes.add(anotherUtil);
}
@Test
public void testGetClassDependencies() {
ClassDependencies engine = new ClassDependencies(classes);
DependencyGraph deps = engine.getDependencies().getDependencyGraph(
JavaScope.classes);
assertTrue(deps.getDependencies(foo.toDependable()).isEmpty());
assertEquals(2, deps.getDependencies(fooImpl.toDependable()).size());
assertTrue(deps.getDependencies(fooImpl.toDependable()).contains(
foo.toDependable()));
assertTrue(deps.getDependencies(fooImpl.toDependable()).contains(
someUtil.toDependable()));
assertEquals(1, deps.getDependencies(someUtil.toDependable()).size());
assertTrue(deps.getDependencies(someUtil.toDependable()).contains(
anotherUtil.toDependable()));
assertTrue(deps.getDependencies(anotherUtil.toDependable()).isEmpty());
}
@Test
public void testInnerclassDependant() {
String innerClass = "eg.foo.Foo$Inner";
JavaClass innerFoo = createClass(innerClass, "eg.foo.Foo",
"eg.util.AnotherUtil");
foo.addDependency(innerClass);
JavaClass usesInner = createClass("eg.bar.needsInner", innerClass);
classes.add(innerFoo);
classes.add(usesInner);
ClassDependencies engine = new ClassDependencies(classes);
DependencyGraph deps = engine.getDependencies().getDependencyGraph(
JavaScope.classes);
assertTrue(deps.getDependencies(usesInner.toDependable()).contains(
foo.toDependable()));
assertEquals(1, usesInner.toDependable().getContentCount());
}
@Test
public void testProjectInnerClassToParent() {
String innerClass = "eg.foo.Foo$Inner";
JavaClass innerFoo = createClass(innerClass, "eg.foo.Foo",
"eg.util.AnotherUtil");
foo.addDependency(innerClass);
JavaClass usesInner = createClass("eg.bar.needsInner", innerClass);
classes.add(innerFoo);
classes.add(usesInner);
ClassDependencies engine = new ClassDependencies(classes);
DependencyGraph deps = engine.getDependencies().getDependencyGraph(
JavaScope.classes);
assertEquals(5, deps.getAllItems().size());
assertEquals(1, deps.getDependencies(foo.toDependable()).size());
assertTrue(deps.getDependencies(foo.toDependable()).contains(
anotherUtil.toDependable()));
assertEquals(2, foo.toDependable().getContentCount());
}
@Test
public void testInnerClassDependsOnInnerClass() {
String innerClass1 = "eg.foo.Foo$Inner1";
String innerClass2 = "eg.foo.Foo$Inner2";
JavaClass innerFoo1 = createClass(innerClass1, "eg.foo.Foo",
innerClass2);
JavaClass innerFoo2 = createClass(innerClass1, "eg.foo.Foo",
"eg.util.AnotherUtil");
foo.addDependency(innerClass1);
foo.addDependency(innerClass2);
classes.add(innerFoo1);
classes.add(innerFoo2);
ClassDependencies engine = new ClassDependencies(classes);
DependencyGraph deps = engine.getDependencies().getDependencyGraph(
JavaScope.classes);
assertEquals(4, deps.getAllItems().size());
assertEquals(0, deps.getDependencies(foo.toDependable()).size());
assertEquals(2, foo.toDependable().getContentCount());
}
@Test
public void testProjectInnerInnerClassToParent() {
String innerClass = "eg.foo.Foo$Inner";
String innerInnerClass = "eg.foo.Foo$Inner$Inner";
JavaClass innerFoo = createClass(innerClass, "eg.foo.Foo",
innerInnerClass);
JavaClass innerInnerFoo = createClass(innerInnerClass, "eg.foo.Foo",
innerClass);
foo.addDependency(innerClass);
foo.addDependency(innerInnerClass);
classes.add(innerFoo);
classes.add(innerInnerFoo);
ClassDependencies engine = new ClassDependencies(classes);
DependencyGraph deps = engine.getDependencies().getDependencyGraph(
JavaScope.classes);
assertEquals(4, deps.getAllItems().size());
assertEquals(3, foo.toDependable().getContentCount());
}
private JavaClass createClass(String className, String... dependencies) {
JavaClass clazz = new JavaClass(className);
for (String dependency : dependencies)
clazz.addDependency(dependency);
return clazz;
}
}