package de.is24.deadcode4j.analyzer; import de.is24.deadcode4j.*; import de.is24.deadcode4j.junit.FileLoader; import de.is24.deadcode4j.junit.LoggingRule; import org.junit.After; import org.junit.Before; import org.junit.Rule; import java.util.Map; import java.util.Set; import static com.google.common.collect.Iterables.concat; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; public abstract class AnAnalyzer<T extends Analyzer> { protected T objectUnderTest; protected AnalysisContext analysisContext; protected boolean analysisIsFinished; @Rule public LoggingRule enableLogging() { return new LoggingRule(); } @Before public final void initAnalyzer() { objectUnderTest = createAnalyzer(); } @Before public final void initAnalysisContext() { analysisContext = AnalysisContextBuilder.givenAnalysisContext( ModuleBuilder.givenModule("de.is24:deadcode4j-junit")); analysisIsFinished = false; } @After public void doFinishAnalysis() { finishAnalysisIfNecessary(); } protected T createAnalyzer() { return null; } protected void analyzeFile(String fileName) { System.out.println("Testing " + objectUnderTest); objectUnderTest.doAnalysis(analysisContext, FileLoader.getFile(fileName)); } protected void finishAnalysis() { this.objectUnderTest.finishAnalysis(this.analysisContext); this.objectUnderTest.finishAnalysis(this.analysisContext, this.analysisContext.getAnalyzedCode()); this.analysisIsFinished = true; } protected void finishAnalysisIfNecessary() { if (!analysisIsFinished) { finishAnalysis(); } } protected void assertThatClassesAreReported(String... classes) { assertThat(analysisContext.getAnalyzedCode().getAnalyzedClasses(), containsInAnyOrder(classes)); } protected void assertThatDependenciesAreReportedFor(String depender, String... dependee) { finishAnalysisIfNecessary(); Map<String, Set<String>> codeDependencies = analysisContext.getAnalyzedCode().getCodeDependencies(); assertThat("No dependencies were reported for [" + depender + "]!", codeDependencies, hasEntry(equalTo(depender), any(Set.class))); assertThat("Incorrect dependencies reported for [" + depender + "]!", codeDependencies.get(depender), containsInAnyOrder(dependee)); } protected void assertThatDependenciesAreReported(String... dependee) { finishAnalysisIfNecessary(); Map<String, Set<String>> codeDependencies = analysisContext.getAnalyzedCode().getCodeDependencies(); Iterable<String> allReportedDependees = concat(codeDependencies.values()); assertThat(allReportedDependees, containsInAnyOrder(dependee)); } protected void assertThatNoDependenciesAreReported() { finishAnalysisIfNecessary(); Map<String, Set<String>> codeDependencies = analysisContext.getAnalyzedCode().getCodeDependencies(); assertThat(codeDependencies.size(), is(0)); } protected void assertThatIntermediateResultIsStored() { doFinishAnalysis(); assertThat(this.analysisContext.getCache(), hasEntry(anything(), instanceOf(IntermediateResult.class))); } }