package de.is24.deadcode4j.analyzer; import de.is24.deadcode4j.analyzer.constants.ClassWithInnerClassNamedLikePotentialTarget; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import java.util.List; import java.util.Map; import java.util.Set; import static com.google.common.collect.Iterables.concat; import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Sets.newHashSet; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; public final class A_ReferenceToConstantsAnalyzer extends AnAnalyzer<ReferenceToConstantsAnalyzer> { private static final String FQ_CONSTANTS = "de.is24.deadcode4j.analyzer.constants.Constants"; private Set<String> dependers = newHashSet(); private List<String> dependees = newArrayList(); @Before public void setUp() throws Exception { analysisContext.addAnalyzedClass(FQ_CONSTANTS); // make this class known to the context analysisContext.addAnalyzedClass(FQ_CONSTANTS + ".More"); dependers.clear(); dependees.clear(); } @After public void assertNoOtherDependenciesExist() { Map<String, ? extends Iterable<String>> codeDependencies = analysisContext.getAnalyzedCode().getCodeDependencies(); assertThat("Classes with dependencies", codeDependencies.keySet(), equalTo(this.dependers)); List<String> allReportedClasses = newArrayList(concat(codeDependencies.values())); assertThat("Classes being referenced", allReportedClasses, containsInAnyOrder(this.dependees.toArray())); } @Override protected ReferenceToConstantsAnalyzer createAnalyzer() { return new ReferenceToConstantsAnalyzer(); } @Test public void recognizesDependencyToConstantInExpression() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingConstantInExpression.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingConstantInExpression"); } @Test public void recognizesDependencyToConstantInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingConstantInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingConstantInField"); } @Test public void recognizesDependencyToConstantInMethod() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingConstantInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingConstantInMethod"); } @Test public void recognizesDependencyToConstantOfImplementedInterfaceUsedByInnerClassInExpression() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/InnerClassUsingConstantOfImplementedInterfaceInExpression.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.InnerClassUsingConstantOfImplementedInterfaceInExpression$InnerClass"); } @Test public void recognizesDependencyToConstantOfImplementedInterfaceInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingConstantOfImplementedInterfaceInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingConstantOfImplementedInterfaceInField"); } @Test public void recognizesDependencyToConstantOfSuperclassInMethod() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingConstantOfSuperclassInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingConstantOfSuperclassInMethod"); } @Test public void recognizesDependencyToNestedConstantOfImplementedInterfaceInExpression() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingNestedConstantOfImplementedInterfaceInField.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.ClassUsingNestedConstantOfImplementedInterfaceInField", FQ_CONSTANTS + "$More"); } @Test public void recognizesDependencyToNestedConstantOfImplementedInterfaceUsedByInnerClassInExpression() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/InnerClassUsingNestedConstantOfImplementedInterfaceInExpression.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.InnerClassUsingNestedConstantOfImplementedInterfaceInExpression$InnerClass", FQ_CONSTANTS + "$More"); } @Test public void recognizesDependencyToNestedConstantOfSuperclassInMethod() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingNestedConstantOfSuperclassInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.ClassUsingNestedConstantOfSuperclassInMethod", FQ_CONSTANTS + "$More"); } @Test public void recognizesDependencyToFullyQualifiedConstantInExpression() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingFQConstantInExpression.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingFQConstantInExpression"); } @Test public void recognizesDependencyToFullyQualifiedConstantInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingFQConstantInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingFQConstantInField"); } @Test public void recognizesDependencyToFullyQualifiedConstantInMethod() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingFQConstantInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingFQConstantInMethod"); } @Test public void recognizesDependencyToConstantViaStaticImportInExpression() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingConstantViaStaticImportInExpression.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingConstantViaStaticImportInExpression"); } @Test public void recognizesDependencyToConstantViaStaticImportInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingConstantViaStaticImportInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingConstantViaStaticImportInField"); } @Test public void recognizesDependencyToConstantViaStaticImportInMethod() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingConstantViaStaticImportInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingConstantViaStaticImportInMethod"); } @Test public void recognizesDependencyToConstantViaStaticImportInSwitch() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingConstantViaStaticImportInSwitch.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingConstantViaStaticImportInSwitch"); } @Test public void recognizesDependencyToConstantViaAsteriskStaticImportInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingConstantViaAsteriskStaticImportInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingConstantViaAsteriskStaticImportInField"); } @Test public void recognizesReferenceToConstantOfOtherPackageViaStaticImportIsOverwrittenByLocalVariable() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingStaticImportForConstantWithSameLocalNameInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingStaticImportForConstantWithSameLocalNameInMethod$InnerClass"); } @Test public void recognizesReferenceToConstantOfOtherPackageViaStaticImportIsOverwrittenByLocalVariableInSuperiorBlock() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingStaticImportForConstantWithSameLocalNameInSuperiorBlocksMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingStaticImportForConstantWithSameLocalNameInSuperiorBlocksMethod$InnerClass"); } @Test public void recognizesReferenceToConstantOfOtherPackageViaStaticImportIsOverwrittenByLocalVariableInStaticInitializer() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingStaticImportForConstantWithSameLocalNameInStaticInitializer.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingStaticImportForConstantWithSameLocalNameInStaticInitializer$InnerClass"); } @Test public void recognizesReferenceToConstantOfOtherPackageViaStaticImportExistsAlthoughInnerClassDefinesInstanceFieldWithSameName() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingStaticImportForConstantWithSameFieldNameDefinedByInnerClassInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassUsingStaticImportForConstantWithSameFieldNameDefinedByInnerClassInMethod"); triggerFinishAnalysisEvent(); } @Test public void recognizesReferenceToConstantOfOtherPackageViaStaticImportIsOverwrittenByInstanceFieldBeingDeclaredAfterItIsReferenced() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingStaticImportForConstantWithSameFieldNameBeingDeclaredAfterItIsReferencedInMethod.java"); triggerFinishAnalysisEvent(); assertNoOtherDependenciesExist(); } @Test public void recognizesReferenceToConstantOfOtherPackageViaStaticImportIsOverwrittenByStaticField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingStaticImportForConstantWithSameStaticFieldNameInMethod.java"); triggerFinishAnalysisEvent(); assertNoOtherDependenciesExist(); } @Test public void recognizesReferenceToConstantOfOtherPackageIsOverwrittenByCatchClauseParameter() { // no one says you cannot name a variable like an imported class :( analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingImportForConstantWithSameParameterNameInCatchClause.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingImportForConstantWithSameParameterNameInCatchClause$InnerClass"); } @Test public void recognizesReferenceToConstantOfOtherPackageIsOverwrittenByConstructorParameter() { // no one says you cannot name a variable like an imported class :( analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingImportForConstantWithSameParameterNameInConstructor.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingImportForConstantWithSameParameterNameInConstructor$InnerClass"); } @Test public void recognizesReferenceToConstantOfOtherPackageIsOverwrittenByLocalVariable() { // no one says you cannot name a variable like an imported class :( analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingImportForConstantWithSameLocalNameInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingImportForConstantWithSameLocalNameInMethod$InnerClass"); } @Test public void recognizesReferenceToConstantOfOtherPackageIsOverwrittenByInstanceField() { // not allowed by JVM: prefers field all the time; however, the import may be defined analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingImportForConstantWithSameFieldNameInMethod.java"); triggerFinishAnalysisEvent(); assertNoOtherDependenciesExist(); } @Test public void recognizesReferenceToConstantOfOtherPackageIsOverwrittenByEnum() { // not allowed by JVM: prefers field all the time; however, the import may be defined analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/EnumUsingImportForConstantWithSameEnumName.java"); triggerFinishAnalysisEvent(); assertNoOtherDependenciesExist(); } @Test public void recognizesReferenceToConstantOfOtherPackageIsOverwrittenByMethodParameter() { // no one says you cannot name a variable like an imported class :( analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingImportForConstantWithSameParameterNameInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingImportForConstantWithSameParameterNameInMethod$InnerClass"); } @Test public void recognizesReferenceToConstantOfOtherPackageIsOverwrittenByStaticVariable() { // not allowed by JVM: prefers field all the time; however, the import may be defined analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingImportForConstantWithSameStaticFieldNameInMethod.java"); triggerFinishAnalysisEvent(); assertNoOtherDependenciesExist(); } @Test public void recognizesDependencyToInnerClassInsteadOfPackageClass() { // make sure JVM specs don't mess with our assumptions assertThat(new ClassWithInnerClassNamedLikePotentialTarget().foo, is("bar")); assertThat(new ClassWithInnerClassNamedLikePotentialTarget.InnerClass().foo, is("bar")); analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassWithInnerClassNamedLikePotentialTarget.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.ClassWithInnerClassNamedLikePotentialTarget", "de.is24.deadcode4j.analyzer.constants.ClassWithInnerClassNamedLikePotentialTarget$Constants"); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassWithInnerClassNamedLikePotentialTarget$AnotherInnerClass"); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.ClassWithInnerClassNamedLikePotentialTarget$InnerClass", "de.is24.deadcode4j.analyzer.constants.ClassWithInnerClassNamedLikePotentialTarget$Constants"); } @Test public void recognizesDependencyToConstantOfOtherPackageInExpression() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingConstantOfOtherPackageInExpression.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingConstantOfOtherPackageInExpression"); } @Test public void recognizesDependencyToConstantOfOtherPackageInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingConstantOfOtherPackageInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingConstantOfOtherPackageInField"); } @Test public void recognizesDependencyToConstantOfOtherPackageInMethod() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingConstantOfOtherPackageInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingConstantOfOtherPackageInMethod"); } @Test public void recognizesDependencyToFullyQualifiedConstantOfOtherPackageInExpression() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingFQConstantOfOtherPackageInExpression.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingFQConstantOfOtherPackageInExpression"); } @Test public void recognizesDependencyToFullyQualifiedConstantOfOtherPackageInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingFQConstantOfOtherPackageInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingFQConstantOfOtherPackageInField"); } @Test public void recognizesDependencyToFullyQualifiedConstantOfOtherPackageInMethod() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingFQConstantOfOtherPackageInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingFQConstantOfOtherPackageInMethod"); } @Test public void recognizesDependencyToConstantOfOtherPackageViaAsteriskImportInExpression() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingConstantOfOtherPackageViaAsteriskImportInExpression.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingConstantOfOtherPackageViaAsteriskImportInExpression"); } @Test public void recognizesDependencyToConstantOfOtherPackageViaAsteriskImportInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingConstantOfOtherPackageViaAsteriskImportInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingConstantOfOtherPackageViaAsteriskImportInField"); } @Test public void recognizesDependencyToConstantOfOtherPackageViaAsteriskImportInMethod() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingConstantOfOtherPackageViaAsteriskImportInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingConstantOfOtherPackageViaAsteriskImportInMethod"); } @Test public void recognizesDependencyToConstantOfOtherPackageViaStaticImportInExpression() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingConstantOfOtherPackageViaStaticImportInExpression.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingConstantOfOtherPackageViaStaticImportInExpression"); } @Test public void recognizesDependencyToConstantOfOtherPackageViaStaticImportInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingConstantOfOtherPackageViaStaticImportInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingConstantOfOtherPackageViaStaticImportInField"); } @Test public void recognizesDependencyToConstantOfOtherPackageViaStaticImportInMethod() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingConstantOfOtherPackageViaStaticImportInMethod.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingConstantOfOtherPackageViaStaticImportInMethod"); } @Test public void recognizesDependencyToConstantOfOtherPackageViaAsteriskStaticImportInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingConstantOfOtherPackageViaAsteriskStaticImportInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingConstantOfOtherPackageViaAsteriskStaticImportInField"); } @Test public void recognizesEnumsDependencyToConstantInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/EnumUsingConstantInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.EnumUsingConstantInField"); } @Test public void recognizesDependencyToConstantForInnerClassesInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingInnerClassOfConstantInField.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.ClassUsingInnerClassOfConstantInField", FQ_CONSTANTS + "$More"); } @Test public void recognizesDependencyToConstantForInnerClassViaStaticImportInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingInnerClassOfConstantViaStaticImportInField.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.ClassUsingInnerClassOfConstantViaStaticImportInField", FQ_CONSTANTS + "$More"); } @Test public void recognizesDependencyToConstantOfInnerClassViaStaticImportInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingConstantOfInnerClassViaStaticImportInField.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.ClassUsingConstantOfInnerClassViaStaticImportInField", FQ_CONSTANTS + "$More"); } @Test public void recognizesDependencyToConstantForInnerClassViaAsteriskStaticImportInField() { } @Test public void recognizesDependencyToConstantOfOtherPackageForInnerClassesInField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/subpackage/ClassUsingInnerClassOfConstantOfOtherPackageInField.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.subpackage.ClassUsingInnerClassOfConstantOfOtherPackageInField", FQ_CONSTANTS + "$More"); } @Test public void recognizesAnnotationsDependencyToConstantAsDefault() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/AnnotationUsingConstantAsDefault.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.AnnotationUsingConstantAsDefault"); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.AnnotationUsingConstantAsDefault", "java.lang.annotation.ElementType"); } @Test public void recognizesReferenceOfInnerClassToOuterClassInFieldViaQualifier() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/InnerClassUsingConstantOfOuterClassInFieldViaQualifier.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.InnerClassUsingConstantOfOuterClassInFieldViaQualifier$InnerClass", "de.is24.deadcode4j.analyzer.constants.InnerClassUsingConstantOfOuterClassInFieldViaQualifier"); } @Test public void recognizesReferenceOfInnerClassToOuterClassInFieldDirectly() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/InnerClassUsingConstantOfOuterClassInFieldDirectly.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.InnerClassUsingConstantOfOuterClassInFieldDirectly$InnerClass", "de.is24.deadcode4j.analyzer.constants.InnerClassUsingConstantOfOuterClassInFieldDirectly"); } @Test public void recognizesReferenceOfAnonymousClassToOuterClassInFieldDirectly() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/AnonymousClassUsingConstantOfOuterClassInFieldDirectly.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.AnonymousClassUsingConstantOfOuterClassInFieldDirectly$1", "de.is24.deadcode4j.analyzer.constants.AnonymousClassUsingConstantOfOuterClassInFieldDirectly"); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.AnonymousClassUsingConstantOfOuterClassInFieldDirectly$1$1", "de.is24.deadcode4j.analyzer.constants.AnonymousClassUsingConstantOfOuterClassInFieldDirectly"); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.AnonymousClassUsingConstantOfOuterClassInFieldDirectly$1$1", "de.is24.deadcode4j.analyzer.constants.AnonymousClassUsingConstantOfOuterClassInFieldDirectly$1"); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.AnonymousClassUsingConstantOfOuterClassInFieldDirectly$1$1", "de.is24.deadcode4j.analyzer.constants.AnonymousClassUsingConstantOfOuterClassInFieldDirectly$Inner"); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.AnonymousClassUsingConstantOfOuterClassInFieldDirectly$Inner", "de.is24.deadcode4j.analyzer.constants.AnonymousClassUsingConstantOfOuterClassInFieldDirectly"); } @Ignore("Although this is no inlined constant it screws performance a bit, as we have no way of identifying the reference and thus perform many unnecessary class resolvings.") @Test public void recognizesReferenceToEnumerationInSwitch() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingEnumConstantInSwitch.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.ClassUsingEnumConstantInSwitch", "de.is24.deadcode4j.analyzer.constants.EnumUsingConstantInField"); } @Test public void ignoresReferencesToStaticMethods() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingStaticMethodInStaticField.java"); triggerFinishAnalysisEvent(); assertNoOtherDependenciesExist(); } @Test public void ignoresReferencesToStaticMethodsOfToStaticallyImportedClasses() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingStaticMethodOfStaticallyImportedClassInMethod.java"); triggerFinishAnalysisEvent(); } @Test public void ignoresReferencesToStaticMethodsOfNestedClasses() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassUsingStaticMethodOfNestedClassInMethod.java"); triggerFinishAnalysisEvent(); assertNoOtherDependenciesExist(); } @Test public void recognizesReferenceToConstantBeingScopeOfAMethodCall() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassCallingMethodOfStaticallyImportedConstantInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassCallingMethodOfStaticallyImportedConstantInField"); } @Test public void recognizesReferenceToConstantBeingPartialScopeOfAMethodCall() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassCallingMethodOnConstantOfImportedClassInField.java"); triggerFinishAnalysisEvent(); assertDependencyToConstantsExists("de.is24.deadcode4j.analyzer.constants.ClassCallingMethodOnConstantOfImportedClassInField"); } @Test public void recognizesReferenceToNestedConstantBeingPartialScopeOfAMethodCall() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ClassCallingMethodOnConstantOfNestedClassOfImportedClassInField.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.ClassCallingMethodOnConstantOfNestedClassOfImportedClassInField", FQ_CONSTANTS + "$More"); } @Test public void doesNotRecognizeReferenceForInheritedNonConstantField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ReferenceToInheritedNonConstant.java"); } @Test public void recognizesReferenceForInheritedConstantField() { analyzeFile("../../src/test/java/de/is24/deadcode4j/analyzer/constants/ReferenceToInheritedConstant.java"); triggerFinishAnalysisEvent(); assertDependencyExists("de.is24.deadcode4j.analyzer.constants.ReferenceToInheritedConstant", "de.is24.deadcode4j.analyzer.constants.Superclass"); } private void triggerFinishAnalysisEvent() { objectUnderTest.finishAnalysis(analysisContext); } private void assertDependencyExists(String depender, String dependee) { Map<String, ? extends Iterable<String>> codeDependencies = analysisContext.getAnalyzedCode().getCodeDependencies(); assertThat(codeDependencies.keySet(), hasItem(depender)); Iterable<String> allReportedClasses = concat(codeDependencies.values()); assertThat(allReportedClasses, hasItem(dependee)); this.dependers.add(depender); this.dependees.add(dependee); } private void assertDependencyToConstantsExists(String depender) { assertDependencyExists(depender, FQ_CONSTANTS); } }