package japicmp.test.service;
import com.google.common.base.Optional;
import japicmp.cmp.JarArchiveComparator;
import japicmp.cmp.JarArchiveComparatorOptions;
import japicmp.model.JApiChangeStatus;
import japicmp.model.JApiClass;
import japicmp.model.JApiField;
import japicmp.model.JApiSuperclass;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.List;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
import static japicmp.test.service.util.Helper.*;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
public class SuperclassWithSubclassAddsNewStaticFieldTest {
private static List<JApiClass> jApiClasses;
@BeforeClass
public static void beforeClass() {
initLogging();
JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
options.setClassPathMode(JarArchiveComparatorOptions.ClassPathMode.TWO_SEPARATE_CLASSPATHS);
options.setOldClassPath(createClassPath("v1"));
options.setNewClassPath(createClassPath("v2"));
JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-service-impl-v1.jar"), getArchive("japicmp-test-service-impl-v2.jar"));
}
private static void initLogging() {
Logger root = Logger.getLogger("");
for (Handler handler : root.getHandlers()) {
handler.setLevel(Level.FINE);
}
}
/**
* The class SuperclassWithSubclassAddsNewStaticField gets in version v2 a new field of type int. The subclass
* SubclassAddsNewStaticField gets in version v2 a new static(!) field with the same name. This violates the rule
* 13.4.8 of the "Java Language Specification" (https://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html).
*/
@Test
public void testStaticFieldInSubclassBinaryIncompatible() {
JApiClass jApiClass = getJApiClass(jApiClasses, SubclassAddsNewStaticField.class.getName());
assertThat(jApiClass.isBinaryCompatible(), is(false));
JApiSuperclass superclass = jApiClass.getSuperclass();
Optional<JApiClass> superclassJApiClass = superclass.getJApiClass();
assertThat(superclassJApiClass.get().getFields().size(), is(1));
JApiField field = getJApiField(superclassJApiClass.get().getFields(), "field");
assertThat(field.getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
}
}