package japicmp.test.output; import com.google.common.base.Strings; import japicmp.cmp.JApiCmpArchive; import japicmp.cmp.JarArchiveComparator; import japicmp.cmp.JarArchiveComparatorOptions; import japicmp.config.Options; import japicmp.filter.JavadocLikePackageFilter; import japicmp.model.AccessModifier; import japicmp.model.JApiClass; import japicmp.output.semver.SemverOut; import japicmp.test.util.Helper; import org.junit.Test; import java.io.File; import java.util.Collections; import java.util.List; import static org.junit.Assert.assertEquals; public class SemverOutIntegTest { @Test public void testSemver001_implementation_of_method_changes() { String lastPackage = "semver001.a"; String string = getSemverDiff(lastPackage); assertEquals("0.0.1", string); } @Test public void testSemver010_added_deprecated_annotation() { String lastPackage = "semver010.a"; String string = getSemverDiff(lastPackage); assertEquals("0.1.0", string); } @Test public void testSemver010_increase_visibility_of_class_from_default_to_public() { String lastPackage = "semver010.b"; String string = getSemverDiff(lastPackage); assertEquals("0.1.0", string); } @Test public void testSemver100_change_method() { String lastPackage = "semver100.a"; String string = getSemverDiff(lastPackage); assertEquals("1.0.0", string); } @Test public void testSemver100_reduce_class_visibility() { String lastPackage = "semver100.b"; String string = getSemverDiff(lastPackage); assertEquals("1.0.0", string); } @Test public void testSemver100_reduce_method_visibility() { String lastPackage = "semver100.c"; String string = getSemverDiff(lastPackage); assertEquals("1.0.0", string); } @Test public void testSemver100_superclass_with_field() { String lastPackage = "semver100.d"; String string = getSemverDiff(lastPackage); assertEquals("1.0.0", string); } @Test public void testSemver_class_with_private_final_field() { String lastPackage = "semver.finalfield"; String string = getSemverDiff(lastPackage); assertEquals("0.0.1", string); } @Test public void testSemver_class_with_public_final_method() { String lastPackage = "semver.finalpublicmethod"; String string = getSemverDiff(lastPackage); assertEquals("1.0.0", string); } @Test public void testSemver_private_inner_class_changes() { String lastPackage = "semver.privateinnerclass"; String string = getSemverDiff(lastPackage); assertEquals("1.0.0", string); // private inner class becomes package protected -> change is binary incompatible } private String getSemverDiff(String lastPackage) { JApiCmpArchive oldFile = Helper.getArchive("japicmp-test-v1.jar"); JApiCmpArchive newFile = Helper.getArchive("japicmp-test-v2.jar"); return getSemverDiff(lastPackage, oldFile, newFile); } private String getSemverDiff(String lastPackage, JApiCmpArchive oldArchive, JApiCmpArchive newArchive) { AccessModifier accessModifier = AccessModifier.PRIVATE; JarArchiveComparator jarArchiveComparator = newComparator(lastPackage, accessModifier); List<JApiClass> jApiClasses = jarArchiveComparator.compare(oldArchive, newArchive); Options options = Options.newDefault(); options.setNewArchives(Collections.singletonList(newArchive)); options.setOldArchives(Collections.singletonList(oldArchive)); options.setAccessModifier(accessModifier); options.setOutputOnlyModifications(false); return new SemverOut(options, jApiClasses).generate(); } private JarArchiveComparator newComparator(String lastPackage, AccessModifier accessModifier) { JarArchiveComparatorOptions options = new JarArchiveComparatorOptions(); options.setAccessModifier(accessModifier); if (!Strings.isNullOrEmpty(lastPackage)) { String packageName = "japicmp.test." + lastPackage; options.getFilters().getIncludes().add(new JavadocLikePackageFilter(packageName)); } return new JarArchiveComparator(options); } }