package org.revapi.basic; import java.io.IOException; import java.io.InputStream; import java.util.Collections; import javax.annotation.Nonnull; import org.junit.Assert; import org.junit.Test; import org.revapi.API; import org.revapi.AnalysisContext; import org.revapi.Archive; import org.revapi.CompatibilityType; import org.revapi.Difference; import org.revapi.DifferenceSeverity; import org.revapi.DifferenceTransform; import org.revapi.Element; /** * @author Lukas Krejci * @since 0.4.5 */ public class SemverIgnoreTransformTest { private static final Difference NON_BREAKING = new Difference("nonBreaking", "nonBrekaing", "blah", CompatibilityType.OTHER, DifferenceSeverity.NON_BREAKING, Collections.emptyMap()); private static final Difference POTENTIALLY_BREAKING = new Difference("potentiallyBreaking", "potentiallyBreaking", "blah", CompatibilityType.OTHER, DifferenceSeverity.POTENTIALLY_BREAKING, Collections.emptyMap()); private static final Difference BREAKING = new Difference("breaking", "breaking", "blah", CompatibilityType.OTHER, DifferenceSeverity.BREAKING, Collections.emptyMap()); @Test public void testDisabledByDefault() { DifferenceTransform<?> tr = getTestTransform("0.0.0", "0.0.1", "{}"); Assert.assertSame(NON_BREAKING, tr.transform(null, null, NON_BREAKING)); Assert.assertSame(POTENTIALLY_BREAKING, tr.transform(null, null, POTENTIALLY_BREAKING)); Assert.assertSame(BREAKING, tr.transform(null, null, BREAKING)); } @Test public void testDefaultSeverities() { String config = "{\"revapi\": {\"semver\": {\"ignore\": {\"enabled\": true}}}}"; DifferenceTransform<?> tr = getTestTransform("0.0.0", "0.0.1", config); Assert.assertNull(tr.transform(null, null, NON_BREAKING)); Assert.assertTrue(isBreaking(tr.transform(null, null, POTENTIALLY_BREAKING))); Assert.assertTrue(isBreaking(tr.transform(null, null, BREAKING))); tr = getTestTransform("0.0.0", "0.1.0", config); Assert.assertNull(tr.transform(null, null, NON_BREAKING)); Assert.assertNull(tr.transform(null, null, POTENTIALLY_BREAKING)); Assert.assertNull(tr.transform(null, null, BREAKING)); tr = getTestTransform("0.0.0", "1.0.0", config); Assert.assertNull(tr.transform(null, null, NON_BREAKING)); Assert.assertNull(tr.transform(null, null, POTENTIALLY_BREAKING)); Assert.assertNull(tr.transform(null, null, BREAKING)); tr = getTestTransform("1.0.0", "1.0.1", config); Assert.assertTrue(isBreaking(tr.transform(null, null, NON_BREAKING))); Assert.assertTrue(isBreaking(tr.transform(null, null, POTENTIALLY_BREAKING))); Assert.assertTrue(isBreaking(tr.transform(null, null, BREAKING))); tr = getTestTransform("1.0.0", "1.1.0", config); Assert.assertNull(tr.transform(null, null, NON_BREAKING)); Assert.assertTrue(isBreaking(tr.transform(null, null, POTENTIALLY_BREAKING))); Assert.assertTrue(isBreaking(tr.transform(null, null, BREAKING))); tr = getTestTransform("1.0.0", "2.0.0", config); Assert.assertNull(tr.transform(null, null, NON_BREAKING)); Assert.assertNull(tr.transform(null, null, POTENTIALLY_BREAKING)); Assert.assertNull(tr.transform(null, null, BREAKING)); } @Test public void testSeverityOverrides() { String config = "{\"revapi\": {\"semver\": {\"ignore\": {\"enabled\": true," + "\"versionIncreaseAllows\":{\"major\":\"potentiallyBreaking\",\"minor\":\"nonBreaking\",\"patch\": \"none\"}}}}}"; DifferenceTransform<?> tr = getTestTransform("0.0.0", "0.0.1", config); Assert.assertTrue(isBreaking(tr.transform(null, null, NON_BREAKING))); Assert.assertTrue(isBreaking(tr.transform(null, null, POTENTIALLY_BREAKING))); Assert.assertTrue(isBreaking(tr.transform(null, null, BREAKING))); tr = getTestTransform("0.0.0", "0.1.0", config); Assert.assertNull(tr.transform(null, null, NON_BREAKING)); Assert.assertTrue(isBreaking(tr.transform(null, null, POTENTIALLY_BREAKING))); Assert.assertTrue(isBreaking(tr.transform(null, null, BREAKING))); tr = getTestTransform("0.0.0", "1.0.0", config); Assert.assertNull(tr.transform(null, null, NON_BREAKING)); Assert.assertNull(tr.transform(null, null, POTENTIALLY_BREAKING)); Assert.assertTrue(isBreaking(tr.transform(null, null, BREAKING))); tr = getTestTransform("1.0.0", "1.0.1", config); Assert.assertTrue(isBreaking(tr.transform(null, null, NON_BREAKING))); Assert.assertTrue(isBreaking(tr.transform(null, null, POTENTIALLY_BREAKING))); Assert.assertTrue(isBreaking(tr.transform(null, null, BREAKING))); tr = getTestTransform("1.0.0", "1.1.0", config); Assert.assertNull(tr.transform(null, null, NON_BREAKING)); Assert.assertTrue(isBreaking(tr.transform(null, null, POTENTIALLY_BREAKING))); Assert.assertTrue(isBreaking(tr.transform(null, null, BREAKING))); tr = getTestTransform("1.0.0", "2.0.0", config); Assert.assertNull(tr.transform(null, null, NON_BREAKING)); Assert.assertNull(tr.transform(null, null, POTENTIALLY_BREAKING)); Assert.assertTrue(isBreaking(tr.transform(null, null, BREAKING))); } @Test public void testPassthrough() { String config = "{\"revapi\": {\"semver\": {\"ignore\": {\"enabled\": true, \"passThroughDifferences\": [\"potentiallyBreaking\"]}}}}"; DifferenceTransform<?> tr = getTestTransform("1.0.0", "2.0.0", config); Assert.assertNull(tr.transform(null, null, NON_BREAKING)); Assert.assertSame(POTENTIALLY_BREAKING, tr.transform(null, null, POTENTIALLY_BREAKING)); Assert.assertNull(tr.transform(null, null, BREAKING)); } private boolean isBreaking(Difference difference) { return difference.classification.values().stream().anyMatch(ds -> ds == DifferenceSeverity.BREAKING); } private DifferenceTransform<Element> getTestTransform(String oldVersion, String newVersion, String configuration) { AnalysisContext ctx = AnalysisContext.builder() .withConfigurationFromJSON(configuration) .withOldAPI(API.of(new Ar(oldVersion)).build()) .withNewAPI(API.of(new Ar(newVersion)).build()) .build(); SemverIgnoreTransform tr = new SemverIgnoreTransform(); tr.initialize(ctx); return tr; } private static final class Ar implements Archive.Versioned { private final String version; private Ar(String version) { this.version = version; } @Nonnull @Override public String getVersion() { return version; } @Nonnull @Override public String getName() { return null; } @Nonnull @Override public InputStream openStream() throws IOException { return null; } } }