package japicmp.test;
import japicmp.cmp.JarArchiveComparator;
import japicmp.cmp.JarArchiveComparatorOptions;
import japicmp.model.AccessModifier;
import japicmp.model.JApiChangeStatus;
import japicmp.model.JApiClass;
import japicmp.model.JApiMethod;
import org.junit.BeforeClass;
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;
public class AccessModifierLevelTest {
private static List<JApiClass> jApiClasses;
@BeforeClass
public static void beforeClass() {
JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
options.setAccessModifier(AccessModifier.PUBLIC);
JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
}
@Test
public void testThatChangesBelowPublicDoNotChangeStatus() {
JApiClass jApiClass = getJApiClass(jApiClasses, AccessModifierLevel.AccessModifierChangesBelowPublic.class.getName());
assertThat(jApiClass.getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
assertThat(jApiClass.getMethods().size(), is(0));
assertThat(jApiClass.getFields().size(), is(0));
}
@Test
public void testChangesFromPrivateToPublic() {
JApiClass jApiClass = getJApiClass(jApiClasses, AccessModifierLevel.AccessModifierChangesFromPrivateToPublic.class.getName());
assertThat(jApiClass.getChangeStatus(), is(JApiChangeStatus.MODIFIED));
JApiMethod jApiMethod = getJApiMethod(jApiClass.getMethods(), "methodFromPrivateToPublic");
assertThat(jApiMethod.getChangeStatus(), is(JApiChangeStatus.MODIFIED));
assertThat(jApiMethod.getAccessModifier().getOldModifier().get(), is(AccessModifier.PRIVATE));
assertThat(jApiMethod.getAccessModifier().getNewModifier().get(), is(AccessModifier.PUBLIC));
}
@Test
public void testChangesFromPublicToPrivate() {
JApiClass jApiClass = getJApiClass(jApiClasses, AccessModifierLevel.AccessModifierChangesFromPublicToPrivate.class.getName());
assertThat(jApiClass.getChangeStatus(), is(JApiChangeStatus.MODIFIED));
JApiMethod jApiMethod = getJApiMethod(jApiClass.getMethods(), "methodFromPublicToPrivate");
assertThat(jApiMethod.getChangeStatus(), is(JApiChangeStatus.MODIFIED));
assertThat(jApiMethod.getAccessModifier().getOldModifier().get(), is(AccessModifier.PUBLIC));
assertThat(jApiMethod.getAccessModifier().getNewModifier().get(), is(AccessModifier.PRIVATE));
}
@Test
public void testPrivateFieldsDoNotAppearForPackageProtectedFilter() {
JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
options.setAccessModifier(AccessModifier.PACKAGE_PROTECTED);
JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
final JApiClass jApiClass = getJApiClass(jApiClasses, AccessModifierLevel.AccessModifierNotChangesForPrivate.class.getName());
assertThat(jApiClass.getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
assertThat(getJApiField(jApiClass.getFields(), "fieldRemainsPackageProtected").getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
assertThat(getJApiField(jApiClass.getFields(), "fieldRemainsProtected").getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
assertThat(getJApiField(jApiClass.getFields(), "fieldRemainsPublic").getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
assertThatExceptionIsThrown(new SimpleExceptionVerifier() {
@Override
public void execute() {
getJApiField(jApiClass.getFields(), "fieldRemainsPrivate");
}
}, IllegalArgumentException.class);
}
@Test
public void testPackageProtectedFieldsDoNotAppearForProtectedFilter() {
JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
options.setAccessModifier(AccessModifier.PROTECTED);
JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
final JApiClass jApiClass = getJApiClass(jApiClasses, AccessModifierLevel.AccessModifierNotChangesForPrivate.class.getName());
assertThat(jApiClass.getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
assertThat(getJApiField(jApiClass.getFields(), "fieldRemainsProtected").getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
assertThat(getJApiField(jApiClass.getFields(), "fieldRemainsPublic").getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
assertThatExceptionIsThrown(new SimpleExceptionVerifier() {
@Override
public void execute() {
getJApiField(jApiClass.getFields(), "fieldRemainsPrivate");
}
}, IllegalArgumentException.class);
assertThatExceptionIsThrown(new SimpleExceptionVerifier() {
@Override
public void execute() {
getJApiField(jApiClass.getFields(), "fieldRemainsPackageProtected");
}
}, IllegalArgumentException.class);
}
@Test
public void testProtectedFieldsDoNotAppearForPublicFilter() {
JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
options.setAccessModifier(AccessModifier.PUBLIC);
JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
final JApiClass jApiClass = getJApiClass(jApiClasses, AccessModifierLevel.AccessModifierNotChangesForPrivate.class.getName());
assertThat(jApiClass.getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
assertThat(getJApiField(jApiClass.getFields(), "fieldRemainsPublic").getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
assertThatExceptionIsThrown(new SimpleExceptionVerifier() {
@Override
public void execute() {
getJApiField(jApiClass.getFields(), "fieldRemainsPrivate");
}
}, IllegalArgumentException.class);
assertThatExceptionIsThrown(new SimpleExceptionVerifier() {
@Override
public void execute() {
getJApiField(jApiClass.getFields(), "fieldRemainsProtected");
}
}, IllegalArgumentException.class);
assertThatExceptionIsThrown(new SimpleExceptionVerifier() {
@Override
public void execute() {
getJApiField(jApiClass.getFields(), "fieldRemainsPackageProtected");
}
}, IllegalArgumentException.class);
}
}