package de.is24.deadcode4j.analyzer; import org.junit.Test; import java.util.Map; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.is; public final class A_SimpleXmlAnalyzer extends AnAnalyzer<SimpleXmlAnalyzer> { @Override protected SimpleXmlAnalyzer createAnalyzer() { return new SimpleXmlAnalyzer("junit", ".xml", null) { }; } @Test public void usesTheSpecifiedDependerIdToReportDependencies() { objectUnderTest.registerClassElement("elementWithClass"); analyzeFile("de/is24/deadcode4j/analyzer/some.xml"); Map<String, ? extends Iterable<String>> codeDependencies = analysisContext.getAnalyzedCode().getCodeDependencies(); assertThat("Should have analyzed the XML file!", codeDependencies.size(), is(1)); assertThat(codeDependencies.keySet(), contains("junit")); } @Test public void ignoresFilesWithNonMatchingRootElement() { objectUnderTest = new SimpleXmlAnalyzer("junit", ".xml", "acme") { }; objectUnderTest.registerClassElement("elementWithClass"); analyzeFile("de/is24/deadcode4j/analyzer/some.xml"); assertThatNoDependenciesAreReported(); } @Test public void reportsTheClassFoundForTheRegisteredElement() { objectUnderTest.registerClassElement("elementWithClass"); analyzeFile("de/is24/deadcode4j/analyzer/some.xml"); assertThatDependenciesAreReported("de.is24.deadcode4j.ClassInElement"); } @Test public void reportsTheClassFound_ForTheRegisteredElement_HavingASpecificAttributeValue() { objectUnderTest.registerClassElement("restrictedElement").withAttributeValue("locked", "false"); analyzeFile("de/is24/deadcode4j/analyzer/some.xml"); assertThatDependenciesAreReported("de.is24.deadcode4j.UnlockedClassInElement"); } @Test public void reportsTheClassFoundForTheRegisteredAttribute() { objectUnderTest.registerClassAttribute("element", "attributeWithClass"); analyzeFile("de/is24/deadcode4j/analyzer/some.xml"); assertThatDependenciesAreReported("de.is24.deadcode4j.ClassInAttribute"); } @Test public void reportsTheClassFound_ForTheRegisteredAttribute_HavingASpecificAttributeValue() { objectUnderTest.registerClassAttribute("restrictedElement", "attributeWithClass").withAttributeValue("locked", "false"); analyzeFile("de/is24/deadcode4j/analyzer/some.xml"); assertThatDependenciesAreReported("de.is24.deadcode4j.UnlockedClassInAttribute"); } @Test public void reportsTheClassesFound_ForTheRegisteredElementAndForTheRegisteredAttribute_BothHavingASpecificAttributeValue() { objectUnderTest.registerClassElement("restrictedElement").withAttributeValue("locked", "false"); objectUnderTest.registerClassAttribute("restrictedElement", "attributeWithClass").withAttributeValue("locked", "false"); analyzeFile("de/is24/deadcode4j/analyzer/some.xml"); assertThatDependenciesAreReported( "de.is24.deadcode4j.UnlockedClassInAttribute", "de.is24.deadcode4j.UnlockedClassInElement"); } @Test public void reportsMultipleFoundClasses() { objectUnderTest.registerClassElement("anotherElementWithClass"); analyzeFile("de/is24/deadcode4j/analyzer/some.xml"); assertThatDependenciesAreReported( "de.is24.deadcode4j.FirstClassInAnotherElement", "de.is24.deadcode4j.SecondClassInAnotherElement"); } @Test public void reportsClassesForDifferentRegistrations() { objectUnderTest.registerClassElement("elementWithClass"); objectUnderTest.registerClassElement("anotherElementWithClass"); objectUnderTest.registerClassAttribute("element", "attributeWithClass"); analyzeFile("de/is24/deadcode4j/analyzer/some.xml"); assertThatDependenciesAreReported( "de.is24.deadcode4j.ClassInElement", "de.is24.deadcode4j.FirstClassInAnotherElement", "de.is24.deadcode4j.SecondClassInAnotherElement", "de.is24.deadcode4j.ClassInAttribute"); } @Test public void parsesXmlFilesUsingNamespacePrefixes() { objectUnderTest.registerClassElement("elementWithClass"); objectUnderTest.registerClassElement("anotherElementWithClass"); objectUnderTest.registerClassAttribute("element", "attributeWithClass"); analyzeFile("de/is24/deadcode4j/analyzer/prefixed.xml"); assertThatDependenciesAreReported( "de.is24.deadcode4j.ClassInElement", "de.is24.deadcode4j.FirstClassInAnotherElement", "de.is24.deadcode4j.SecondClassInAnotherElement", "de.is24.deadcode4j.ClassInAttribute"); } }