package de.is24.deadcode4j.analyzer;
import org.junit.Test;
import static com.google.common.collect.Iterables.concat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assume.assumeThat;
public final class A_ClassDependencyAnalyzer extends AByteCodeAnalyzer<ClassDependencyAnalyzer> {
@Override
protected ClassDependencyAnalyzer createAnalyzer() {
return new ClassDependencyAnalyzer();
}
@Test
public void reportsDependenciesToObject() {
analyzeFile("SingleClass.class");
assertThatDependenciesAreReportedFor("SingleClass", "java.lang.Object");
}
@Test
public void reportsTheDependencyOfAClassToAnother() {
analyzeFile("DependingClass.class");
assertThatDependenciesAreReportedFor("DependingClass",
"IndependentClass",
"java.lang.Object");
}
@Test
public void recognizesDependenciesToInnerClass() {
analyzeFile("de/is24/deadcode4j/analyzer/classdependency/ClassWithInnerClasses.class");
Iterable<String> allDependencies = concat(analysisContext.getAnalyzedCode().getCodeDependencies().values());
assumeThat("Inner classes are only defined, but not used by the parent class!", allDependencies, containsInAnyOrder("java.lang.Object", "de.is24.deadcode4j.analyzer.classdependency.ClassWithInnerClasses$UsedStaticInnerClass"));
}
@Test
public void recognizesDependencyOfInnerClassToParentClass() {
analyzeFile("de/is24/deadcode4j/analyzer/classdependency/ClassWithInnerClasses$UnusedInnerClass.class");
assertThatClassesAreReported("de.is24.deadcode4j.analyzer.classdependency.ClassWithInnerClasses$UnusedInnerClass");
assertThatDependenciesAreReportedFor("de.is24.deadcode4j.analyzer.classdependency.ClassWithInnerClasses$UnusedInnerClass",
"de.is24.deadcode4j.analyzer.classdependency.ClassWithInnerClasses",
"java.lang.Object");
}
@Test
public void recognizesNoDependencyOfStaticInnerClassToParentClass() {
analyzeFile("de/is24/deadcode4j/analyzer/classdependency/ClassWithInnerClasses$UnusedStaticInnerClass.class");
Iterable<String> allDependencies = concat(analysisContext.getAnalyzedCode().getCodeDependencies().values());
assumeThat("Although technically correct (to keep up the namespace, the parent class is required), the static inner class does not access the parent class!", allDependencies, containsInAnyOrder("java.lang.Object"));
}
}