package de.is24.deadcode4j.plugin; import de.is24.deadcode4j.AnalysisStage; import de.is24.deadcode4j.DeadCode; import org.apache.maven.plugin.logging.Log; import org.junit.Before; import org.junit.Test; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; import static java.util.Arrays.asList; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; public class A_DeadCodeLogger { private final Collection<String> noClasses = Collections.emptyList(); private DeadCodeLogger objectUnderTest; private Log logMock; private static Collection<String> classes(String... classes) { return asList(classes); } @Before public void setUpMojo() { logMock = mock(Log.class); objectUnderTest = new DeadCodeLogger(logMock); } @Test public void logsThatNoDeadCodeWasFound() throws Exception { DeadCode deadCode = new DeadCode(noExceptions(), classes("A", "B"), noClasses); objectUnderTest.log(deadCode); verifyNumberOfAnalyzedClassesIs(2); verifyNoDeadCodeWasFound(); } @Test public void logsThatOneDeadClassOfThreeWasFound() throws Exception { DeadCode deadCode = new DeadCode(noExceptions(), classes("A", "B", "SingleClass"), classes("SingleClass")); objectUnderTest.log(deadCode); verifyNumberOfAnalyzedClassesIs(3); verify(logMock).warn("Found 1 unused class(es):"); verify(logMock).warn(" SingleClass"); } @Test public void logsThatAnExceptionOccurredDuringFileAnalysis() { DeadCode deadCode = new DeadCode(exceptionAt(AnalysisStage.FILE_ANALYSIS), noClasses, noClasses); objectUnderTest.log(deadCode); verify(logMock, times(1)).warn(anyString()); } @Test public void logsThatAnExceptionOccurredDuringGeneralSetup() { DeadCode deadCode = new DeadCode(exceptionAt(AnalysisStage.GENERAL_SETUP), noClasses, noClasses); objectUnderTest.log(deadCode); verify(logMock, times(1)).error(anyString()); } @Test public void logsThatAnExceptionOccurredDuringModuleSetup() { DeadCode deadCode = new DeadCode(exceptionAt(AnalysisStage.MODULE_SETUP), noClasses, noClasses); objectUnderTest.log(deadCode); verify(logMock, times(1)).warn(anyString()); } @Test public void logsThatAnExceptionOccurredDuringDeadCodeAnalysis() { DeadCode deadCode = new DeadCode(exceptionAt(AnalysisStage.DEADCODE_ANALYSIS), noClasses, noClasses); objectUnderTest.log(deadCode); verify(logMock, times(1)).warn(anyString()); } private EnumSet<AnalysisStage> noExceptions() { return EnumSet.noneOf(AnalysisStage.class); } private EnumSet<AnalysisStage> exceptionAt(AnalysisStage fileAnalysis) { return EnumSet.of(fileAnalysis); } private void verifyNumberOfAnalyzedClassesIs(int count) { verify(logMock).info("Analyzed " + count + " class(es)."); } private void verifyNoDeadCodeWasFound() { verify(logMock).info("No unused classes found. Rejoice!"); } }