Refactor Version.compareTo() method

According to the Specification the pre-release version should
have a lower precedence than the associated normal version and the
build version should have a higher precedence than the associated
normal version.
This commit is contained in:
Zafar Khaja 2012-11-24 21:20:15 +04:00
parent 6bca0180c6
commit e0bca455ae
2 changed files with 54 additions and 10 deletions

View File

@ -148,17 +148,11 @@ public class Version implements Comparable<Version> {
@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<Version> {
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("\\.");

View File

@ -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");