package de.is24.deadcode4j;
import org.junit.Before;
import org.junit.Test;
import java.util.Collection;
import java.util.EnumSet;
import java.util.Map;
import java.util.Set;
import static com.google.common.collect.Maps.newHashMap;
import static com.google.common.collect.Sets.newHashSet;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.hasSize;
public class A_DeadCodeComputer {
private DeadCodeComputer objectUnderTest;
private Map<String, Set<String>> codeDependencies = newHashMap();
@Before
public void setUpObjectUnderTest() {
this.objectUnderTest = new DeadCodeComputer();
codeDependencies.clear();
}
@Test
public void recognizesASingleClassAsDeadCode() {
setUpDependency("SingleClass");
Collection<String> deadClasses = computeDeadClasses();
assertThat("Should recognize one class as dead", deadClasses, hasSize(1));
assertThat(deadClasses, contains("SingleClass"));
}
@Test
public void recognizesTwoInterdependentClassesAsLiveCode() {
setUpDependency("A", "B");
setUpDependency("B", "A");
Collection<String> deadClasses = computeDeadClasses();
assertThat("Should find NO dead code", deadClasses, hasSize(0));
}
@Test
public void recognizesDependencyChainAsPartlyDeadCode() {
setUpDependency("DependingClass", "IndependentClass");
setUpDependency("IndependentClass");
Collection<String> deadClasses = computeDeadClasses();
assertThat("Should recognize one class as dead", deadClasses, contains("DependingClass"));
}
private void setUpDependency(String depender, String... dependees) {
codeDependencies.put(depender, newHashSet(dependees));
}
private Collection<String> computeDeadClasses() {
AnalyzedCode analyzedCode = new AnalyzedCode(
EnumSet.noneOf(AnalysisStage.class), codeDependencies.keySet(), codeDependencies);
DeadCode deadCode = objectUnderTest.computeDeadCode(analyzedCode);
return deadCode.getDeadClasses();
}
}