package japicmp.test; import japicmp.cmp.JarArchiveComparator; import japicmp.cmp.JarArchiveComparatorOptions; import japicmp.filter.AnnotationClassFilter; import japicmp.filter.AnnotationFieldFilter; import japicmp.model.JApiChangeStatus; import japicmp.model.JApiClass; import japicmp.model.JApiMethod; import japicmp.test.annotation.filter.AnnotatedClass; import japicmp.test.annotation.filter.ClassWithInnerClass; import japicmp.test.annotation.filter.ClassWithMembersToExclude; import japicmp.test.annotation.filter.ExcludedClass; import japicmp.test.annotation.filter.exclpckg.Excluded; import japicmp.test.annotation.filter.inclpckg.Included; import org.junit.Assert; import org.junit.Test; import java.util.List; import static japicmp.test.util.Helper.*; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; /** * Test to ensure that annotation-based includes and excludes are working. */ public class AnnotationFilterTest { @Test public void testFilterSelection() { JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); options.getFilters().getIncludes().add(new AnnotationClassFilter("@japicmp.test.annotation.filter.PublicAPI")); JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); getJApiClass(jApiClasses, AnnotatedClass.class.getName()); assertThat(jApiClasses.size(), is(3)); } @Test public void detectChangeOnAnnotatedClass() { JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); options.getFilters().getIncludes().add(new AnnotationClassFilter("@japicmp.test.annotation.filter.PublicAPI")); JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); Assert.assertEquals(3, jApiClasses.size()); Assert.assertEquals(JApiChangeStatus.MODIFIED, jApiClasses.get(0).getChangeStatus()); } @Test public void testElementsOnClassAreExcluded() { JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); options.getFilters().getExcludes().add(new AnnotationClassFilter("@japicmp.test.annotation.filter.Exclude")); options.getFilters().getExcludes().add(new AnnotationFieldFilter("@japicmp.test.annotation.filter.Exclude")); JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); JApiClass jApiClass = getJApiClass(jApiClasses, ClassWithMembersToExclude.class.getName()); assertThat(jApiClass.getFields().size(), is(0)); } @Test public void testThatNewInnerClassIsDetected() { JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); options.getFilters().getIncludes().add(new AnnotationClassFilter("@japicmp.test.annotation.filter.PublicAPI")); JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); Assert.assertEquals(3, jApiClasses.size()); JApiClass jApiClass = getJApiClass(jApiClasses, ClassWithInnerClass.class.getName() + "$NewInnerClass"); assertThat(jApiClass.getChangeStatus(), is(JApiChangeStatus.NEW)); } @Test public void testThatNewMethodOfAnnotatedClassIsDetected() { JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); options.getFilters().getIncludes().add(new AnnotationClassFilter("@japicmp.test.annotation.filter.PublicAPI")); JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); Assert.assertEquals(3, jApiClasses.size()); JApiClass jApiClass = getJApiClass(jApiClasses, ClassWithInnerClass.class.getName()); assertThat(jApiClass.getChangeStatus(), is(JApiChangeStatus.MODIFIED)); JApiMethod jApiMethod = getJApiMethod(jApiClass.getMethods(), "newMethod"); assertThat(jApiMethod.getChangeStatus(), is(JApiChangeStatus.NEW)); } @Test public void testPackagesAreExcluded() { JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); options.getFilters().getExcludes().add(new AnnotationClassFilter("@japicmp.test.annotation.filter.Exclude")); JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); boolean exceptionCaught = false; try { getJApiClass(jApiClasses, Excluded.class.getName()); } catch (IllegalArgumentException e) { exceptionCaught = true; } assertThat(exceptionCaught, is(true)); } @Test public void testPackagesAreIncluded() { JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); options.getFilters().getIncludes().add(new AnnotationClassFilter("@japicmp.test.annotation.filter.Include")); JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); assertThat(jApiClasses.size(), is(1)); JApiClass jApiClass = getJApiClass(jApiClasses, Included.class.getName()); assertThat(jApiClass.getChangeStatus(), is(JApiChangeStatus.MODIFIED)); JApiMethod methodAdded = getJApiMethod(jApiClass.getMethods(), "methodAdded"); assertThat(methodAdded.getChangeStatus(), is(JApiChangeStatus.NEW)); } @Test public void testClassExcludedWithInnerAnnotation() { JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); options.getFilters().getExcludes().add(new AnnotationClassFilter("@japicmp.test.annotation.filter.InterfaceStability$Exclude")); JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options); final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar")); boolean exceptionCaught = false; try { getJApiClass(jApiClasses, ExcludedClass.class.getName()); } catch (IllegalArgumentException e) { exceptionCaught = true; } assertThat(exceptionCaught, is(true)); } }