diff --git a/src/main/java/com/github/zafarkhaja/semver/Version.java b/src/main/java/com/github/zafarkhaja/semver/Version.java index 0ac0066..06a998d 100644 --- a/src/main/java/com/github/zafarkhaja/semver/Version.java +++ b/src/main/java/com/github/zafarkhaja/semver/Version.java @@ -148,17 +148,11 @@ public class Version implements Comparable { @Override public int compareTo(Version other) { int result = compareNormalVersions(other); - if (result == 0 && preReleaseVersion != null) { - result = compareAlphaNumericVersions( - preReleaseVersion, - other.getPreReleaseVersion() - ); + if (result == 0) { + result = comparePreReleaseVersions(other); } - if (result == 0 && buildVersion != null) { - result = compareAlphaNumericVersions( - buildVersion, - other.getBuildVersion() - ); + if (result == 0) { + result = compareBuildVersions(other); } return result; } @@ -178,6 +172,40 @@ public class Version implements Comparable { return (thisOp == otherOp) ? 0 : ((thisOp > otherOp) ? 1 : -1); } + private int comparePreReleaseVersions(Version other) { + int result; + if (preReleaseVersion == null && + other.getPreReleaseVersion() == null) { + result = 0; + } else if (preReleaseVersion == null || + other.getPreReleaseVersion() == null) { + result = preReleaseVersion == null ? 1 : -1; + } else { + result = compareAlphaNumericVersions( + preReleaseVersion, + other.getPreReleaseVersion() + ); + } + return result; + } + + private int compareBuildVersions(Version other) { + int result; + if (buildVersion == null && + other.getBuildVersion()== null) { + result = 0; + } else if (buildVersion == null || + other.getBuildVersion()== null) { + result = buildVersion == null ? -1 : 1; + } else { + result = compareAlphaNumericVersions( + buildVersion, + other.getBuildVersion() + ); + } + return result; + } + private int compareAlphaNumericVersions(String thisOp, String otherOp) { String[] thisIdents = thisOp.split("\\."); String[] otherIdents = otherOp.split("\\."); diff --git a/src/test/java/com/github/zafarkhaja/semver/VersionTest.java b/src/test/java/com/github/zafarkhaja/semver/VersionTest.java index a820883..7e8be8e 100644 --- a/src/test/java/com/github/zafarkhaja/semver/VersionTest.java +++ b/src/test/java/com/github/zafarkhaja/semver/VersionTest.java @@ -137,6 +137,14 @@ public class VersionTest { assertEquals(1, version1.compareTo(version2)); } + @Test public void + preReleaseVersionShouldHaveLowerPrecedenceThanAssociatedNormalVersion() { + Version version1 = new Version("1.3.7"); + Version version2 = new Version("1.3.7-alpha"); + assertEquals(1, version1.compareTo(version2)); + assertEquals(-1, version2.compareTo(version1)); + } + @Test public void shouldCompareBuildVersionsIfNormalAndPreReleaseVersionsAreEqual() { Version version1 = new Version("1.3.7-beta+build.1"); @@ -144,6 +152,14 @@ public class VersionTest { assertEquals(-1, version1.compareTo(version2)); } + @Test public void + buildVersionShouldHaveHigherPrecedenceThanAssociatedNormalVersion() { + Version version1 = new Version("1.3.7"); + Version version2 = new Version("1.3.7+build"); + assertEquals(-1, version1.compareTo(version2)); + assertEquals(1, version2.compareTo(version1)); + } + @Test public void shouldCompareAccordingToIdentifiersCountIfCommonIdentifiersAreEqual() { Version version1 = new Version("1.3.7-beta+build.3");