Make minor improvements

This commit is contained in:
Zafar Khaja 2013-03-03 23:44:34 +04:00
parent 5d0aa683cb
commit 838d40e90e
7 changed files with 124 additions and 120 deletions

View File

@ -4,7 +4,7 @@
<groupId>com.github.zafarkhaja</groupId>
<artifactId>semver</artifactId>
<version>0.2.0-SNAPSHOT</version>
<version>0.2.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>semver</name>
@ -46,7 +46,7 @@
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>

View File

@ -27,21 +27,19 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
*
* @author Zafar Khaja <zafarkhaja@gmail.com>
*/
class AlphaNumericVersion implements Comparable<AlphaNumericVersion> {
private String value;
static final String FORMAT = "([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)";
private static final Pattern PATTERN = Pattern.compile("^" + FORMAT + "$");
private String value;
AlphaNumericVersion(String value) {
if (value == null) {
throw new NullPointerException(
"Alpha-numeric version MUST NOT be NULL"
);
throw new NullPointerException("Alpha-numeric version MUST NOT be NULL");
}
Matcher matcher = PATTERN.matcher(value);
if (!matcher.matches()) {
@ -51,40 +49,40 @@ class AlphaNumericVersion implements Comparable<AlphaNumericVersion> {
}
this.value = matcher.group(0);
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
return true;
}
if (!(other instanceof AlphaNumericVersion)) {
return false;
}
return compareTo((AlphaNumericVersion) other) == 0 ? true : false;
}
@Override
public int hashCode() {
return value.hashCode();
}
@Override
public String toString() {
return value;
}
@Override
public int compareTo(AlphaNumericVersion other) {
String[] thisIds = value.split("\\.");
String[] otherIds = other.value.split("\\.");
int result = compareIdentifierArrays(thisIds, otherIds);
if (result == 0) {
result = thisIds.length - otherIds.length;
}
return result;
}
private int compareIdentifierArrays(String[] ids1, String[] ids2) {
int result = 0;
int length = getLeastCommonArrayLength(ids1, ids2);
@ -96,11 +94,11 @@ class AlphaNumericVersion implements Comparable<AlphaNumericVersion> {
}
return result;
}
private int getLeastCommonArrayLength(String[] arr1, String[] arr2) {
return arr1.length <= arr2.length ? arr1.length : arr2.length;
}
private int compareIdentifiers(String id1, String id2) {
if (isInt(id1) && isInt(id2)) {
return Integer.parseInt(id1) - Integer.parseInt(id2);
@ -108,7 +106,7 @@ class AlphaNumericVersion implements Comparable<AlphaNumericVersion> {
return id1.compareTo(id2);
}
}
private boolean isInt(String str) {
try {
Integer.parseInt(str);

View File

@ -35,10 +35,10 @@ class NormalVersion implements Comparable<NormalVersion> {
private int major;
private int minor;
private int patch;
static final String FORMAT = "(\\d+)\\.(\\d+)\\.(\\d+)";
private static final Pattern PATTERN = Pattern.compile("^" + FORMAT + "$");
NormalVersion(int major, int minor, int patch) {
if (major < 0 || minor < 0 || patch < 0) {
throw new IllegalArgumentException(
@ -49,7 +49,7 @@ class NormalVersion implements Comparable<NormalVersion> {
this.minor = minor;
this.patch = patch;
}
static NormalVersion valueOf(String value) {
Matcher matcher = PATTERN.matcher(value);
if (!matcher.matches()) {
@ -73,13 +73,13 @@ class NormalVersion implements Comparable<NormalVersion> {
int getPatch() {
return patch;
}
void incrementMajor() {
major = major + 1;
minor = 0;
patch = 0;
}
void incrementMinor() {
minor = minor + 1;
patch = 0;
@ -100,7 +100,7 @@ class NormalVersion implements Comparable<NormalVersion> {
}
return result;
}
@Override
public boolean equals(Object other) {
if (this == other) {
@ -120,12 +120,12 @@ class NormalVersion implements Comparable<NormalVersion> {
hash = 31 * hash + patch;
return hash;
}
/**
* Returns the string representation of this normal version.
*
* A normal version number MUST take the form X.Y.Z where X, Y, and Z are
* non-negative integers. X is the major version, Y is the minor version,
*
* A normal version number MUST take the form X.Y.Z where X, Y, and Z are
* non-negative integers. X is the major version, Y is the minor version,
* and Z is the patch version. (SemVer p.2)
*/
@Override

View File

@ -31,19 +31,19 @@ import java.util.regex.Pattern;
* @author Zafar Khaja <zafarkhaja@gmail.com>
*/
public class Version implements Comparable<Version> {
private NormalVersion normal;
private AlphaNumericVersion preRelease;
private AlphaNumericVersion build;
private static final String PRE_RELEASE_PREFIX = "-";
private static final String BUILD_PREFIX = "+";
private static final Pattern SEMVER_PATTERN;
static {
StringBuilder sb = new StringBuilder();
sb.append("^");
sb.append(NormalVersion.FORMAT);
sb.append("(?:");
@ -56,91 +56,89 @@ public class Version implements Comparable<Version> {
sb.append(AlphaNumericVersion.FORMAT);
sb.append(")?");
sb.append("$");
SEMVER_PATTERN = Pattern.compile(sb.toString());
}
Version(
NormalVersion normal,
AlphaNumericVersion preRelease,
NormalVersion normal,
AlphaNumericVersion preRelease,
AlphaNumericVersion build
) {
this.normal = normal;
this.preRelease = preRelease;
this.build = build;
}
public static Version valueOf(String value) {
Matcher matcher = SEMVER_PATTERN.matcher(value);
if (!matcher.matches()) {
throw new IllegalArgumentException(
"Illegal version format"
);
throw new IllegalArgumentException("Illegal version format");
}
NormalVersion normal = new NormalVersion(
Integer.parseInt(matcher.group(1)),
Integer.parseInt(matcher.group(2)),
Integer.parseInt(matcher.group(3))
);
AlphaNumericVersion preRelease =
(matcher.group(4) != null) ?
new AlphaNumericVersion(matcher.group(4)) :
AlphaNumericVersion preRelease =
(matcher.group(4) != null) ?
new AlphaNumericVersion(matcher.group(4)) :
null;
AlphaNumericVersion build =
(matcher.group(5) != null) ?
new AlphaNumericVersion(matcher.group(5)) :
AlphaNumericVersion build =
(matcher.group(5) != null) ?
new AlphaNumericVersion(matcher.group(5)) :
null;
return new Version(normal, preRelease, build);
return new Version(normal, preRelease, build);
}
public int getMajorVersion() {
return normal.getMajor();
}
public int getMinorVersion() {
return normal.getMinor();
}
public int getPatchVersion() {
return normal.getPatch();
}
public String getNormalVersion() {
return normal.toString();
}
public String getPreReleaseVersion() {
return (preRelease != null) ? preRelease.toString() : "";
}
public String getBuildVersion() {
return (build != null) ? build.toString() : "";
}
public boolean greaterThan(Version other) {
return compareTo(other) > 0 ? true : false;
}
public boolean greaterThanOrEqualsTo(Version other) {
return compareTo(other) >= 0 ? true : false;
}
public boolean lessThan(Version other) {
return compareTo(other) < 0 ? true : false;
}
public boolean lessThanOrEqualsTo(Version other) {
return compareTo(other) <= 0 ? true : false;
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
return true;
}
if (!(other instanceof Version)) {
return false;
@ -156,7 +154,7 @@ public class Version implements Comparable<Version> {
hash = 97 * hash + (build != null ? build.hashCode() : 0);
return hash;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(getNormalVersion());
@ -170,7 +168,7 @@ public class Version implements Comparable<Version> {
}
return sb.toString();
}
@Override
public int compareTo(Version other) {
int result = normal.compareTo(other.normal);
@ -182,23 +180,31 @@ public class Version implements Comparable<Version> {
}
return result;
}
private int comparePreReleases(Version other) {
int result = 0;
if (preRelease != null && other.preRelease != null) {
result = preRelease.compareTo(other.preRelease);
} else if (preRelease == null ^ other.preRelease == null) {
result = preRelease == null ? 1 : -1;
/**
* Pre-release versions satisfy but have a lower precedence
* than the associated normal version. (SemVer p.9)
*/
result = (preRelease == null) ? 1 : -1;
}
return result;
}
private int compareBuilds(Version other) {
int result = 0;
if (build != null && other.build != null) {
result = build.compareTo(other.build);
} else if (build == null ^ other.build == null) {
result = build == null ? -1 : 1;
/**
* Build versions satisfy and have a higher precedence
* than the associated normal version. (SemVer p.10)
*/
result = (build == null) ? -1 : 1;
}
return result;
}

View File

@ -34,16 +34,16 @@ import org.junit.runner.RunWith;
*/
@RunWith(Enclosed.class)
public class AlphaNumericVersionTest {
public static class CoreFunctionalityTest {
@Test
public void mustConsistOfDotSeparatedIdentifiersOfAlphaNumericsAndHyphen() {
String[] invalidVersions = {
null,
"",
"123!",
"1a:2b:3c",
"",
"123!",
"1a:2b:3c",
"123,abc,123",
};
for (String ver : invalidVersions) {
@ -88,14 +88,14 @@ public class AlphaNumericVersionTest {
public void shouldOverrideEqualsMethod() {
AlphaNumericVersion v1 = new AlphaNumericVersion("alpha.123");
AlphaNumericVersion v2 = new AlphaNumericVersion("alpha.123");
AlphaNumericVersion v3 = new AlphaNumericVersion("alpha.321");
AlphaNumericVersion v3 = new AlphaNumericVersion("alpha.321");
assertTrue(v1.equals(v2));
assertFalse(v1.equals(v3));
}
}
public static class EqualsMethodTest {
@Test
public void shouldBeReflexive() {
AlphaNumericVersion v = new AlphaNumericVersion("alpha.123");
@ -142,9 +142,9 @@ public class AlphaNumericVersionTest {
assertFalse(v1.equals(v2));
}
}
public static class HashCodeMethodTest {
@Test
public void shouldReturnSameHashCodeIfVersionsAreEqual() {
AlphaNumericVersion v1 = new AlphaNumericVersion("alpha.123");
@ -153,9 +153,9 @@ public class AlphaNumericVersionTest {
assertEquals(v1.hashCode(), v2.hashCode());
}
}
public static class ToStringMethodTest {
@Test
public void shouldReturnStringRepresentation() {
String value = "beta.abc.def";

View File

@ -34,9 +34,9 @@ import org.junit.runner.RunWith;
*/
@RunWith(Enclosed.class)
public class NormalVersionTest {
public static class CoreFunctionalityTest {
@Test
public void mustConsistOfMajorMinorAndPatchVersions() {
NormalVersion v = new NormalVersion(1, 2, 3);
@ -44,13 +44,13 @@ public class NormalVersionTest {
assertEquals(2, v.getMinor());
assertEquals(3, v.getPatch());
}
@Test
public void mustTakeTheFormOfXDotYDotZWhereXyzAreNonNegativeIntegers() {
NormalVersion v = new NormalVersion(1, 2, 3);
assertEquals("1.2.3", v.toString());
}
@Test
public void shouldAcceptOnlyNonNegativeMajorMinorAndPatchVersions() {
int[][] invalidVersions = {{-1, 2, 3}, {1, -2, 3}, {1, 2, -3}};
@ -67,7 +67,7 @@ public class NormalVersionTest {
fail("Major, minor and patch versions MUST be non-negative integers.");
}
}
@Test
public void mustIncreaseEachElementNumericallyByIncrementsOfOne() {
int major = 1, minor = 2, patch = 3;
@ -79,7 +79,7 @@ public class NormalVersionTest {
v.incrementMajor();
assertEquals(major + 1, v.getMajor());
}
@Test
public void mustResetMinorAndPatchToZeroWhenMajorIsIncremented() {
NormalVersion v = new NormalVersion(1, 2, 3);
@ -88,7 +88,7 @@ public class NormalVersionTest {
assertEquals(0, v.getMinor());
assertEquals(0, v.getPatch());
}
@Test
public void mustResetPatchToZeroWhenMinorIsIncremented() {
NormalVersion v = new NormalVersion(1, 2, 3);
@ -97,7 +97,7 @@ public class NormalVersionTest {
assertEquals(3, v.getMinor());
assertEquals(0, v.getPatch());
}
@Test
public void mustCompareMajorMinorAndPatchNumerically() {
NormalVersion v = new NormalVersion(1, 2, 3);
@ -105,7 +105,7 @@ public class NormalVersionTest {
assertTrue(0 == v.compareTo(new NormalVersion(1, 2, 3)));
assertTrue(0 > v.compareTo(new NormalVersion(1, 2, 4)));
}
@Test
public void shouldOverrideEqualsMethod() {
NormalVersion v1 = new NormalVersion(1, 2, 3);
@ -114,7 +114,7 @@ public class NormalVersionTest {
assertTrue(v1.equals(v2));
assertFalse(v1.equals(v3));
}
@Test
public void shouldHaveStaticFactoryMethod() {
NormalVersion v = NormalVersion.valueOf("1.2.3");
@ -123,15 +123,15 @@ public class NormalVersionTest {
assertEquals(3, v.getPatch());
}
}
public static class EqualsMethodTest {
@Test
public void shouldBeReflexive() {
NormalVersion v = new NormalVersion(1, 2, 3);
assertTrue(v.equals(v));
}
@Test
public void shouldBeSymmetric() {
NormalVersion v1 = new NormalVersion(1, 2, 3);
@ -172,9 +172,9 @@ public class NormalVersionTest {
assertFalse(v1.equals(v2));
}
}
public static class HashCodeMethodTest {
@Test
public void shouldReturnSameHashCodeIfVersionsAreEqual() {
NormalVersion v1 = new NormalVersion(1, 2, 3);
@ -183,9 +183,9 @@ public class NormalVersionTest {
assertEquals(v1.hashCode(), v2.hashCode());
}
}
public static class ToStringMethodTest {
@Test
public void shouldReturnStringRepresentation() {
NormalVersion v = new NormalVersion(1, 2, 3);

View File

@ -34,9 +34,9 @@ import org.junit.runner.RunWith;
*/
@RunWith(Enclosed.class)
public class VersionTest {
public static class CoreFunctionalityTest {
@Test
public void mayHavePreReleaseFollowingPatchAppendedWithHyphen() {
Version v = Version.valueOf("1.2.3-alpha");
@ -121,16 +121,16 @@ public class VersionTest {
@Test
public void shouldCorrectlyCompareAllVersionsFromSpecification() {
String[] versions = {
"1.0.0-alpha",
"1.0.0-alpha.1",
"1.0.0-beta.2",
"1.0.0-beta.11",
"1.0.0-rc.1",
"1.0.0-rc.1+build.1",
"1.0.0",
"1.0.0+0.3.7",
"1.3.7+build",
"1.3.7+build.2.b8f12d7",
"1.0.0-alpha",
"1.0.0-alpha.1",
"1.0.0-beta.2",
"1.0.0-beta.11",
"1.0.0-rc.1",
"1.0.0-rc.1+build.1",
"1.0.0",
"1.0.0+0.3.7",
"1.3.7+build",
"1.3.7+build.2.b8f12d7",
"1.3.7+build.11.e0f985a"
};
for (int i = 1; i < versions.length; i++) {
@ -139,7 +139,7 @@ public class VersionTest {
assertTrue(v1.lessThan(v2));
}
}
@Test
public void shouldHaveStaticFactoryMethod() {
Version v = Version.valueOf("1.0.0-rc.1+build.1");
@ -151,9 +151,9 @@ public class VersionTest {
assertEquals("build.1", v.getBuildVersion());
}
}
public static class EqualsMethodTest {
@Test
public void shouldBeReflexive() {
Version v1 = Version.valueOf("2.3.7");
@ -200,9 +200,9 @@ public class VersionTest {
assertFalse(v1.equals(v2));
}
}
public static class HashCodeMethodTest {
@Test
public void shouldReturnSameHashCodeIfVersionsAreEqual() {
Version v1 = Version.valueOf("2.3.7");
@ -211,9 +211,9 @@ public class VersionTest {
assertEquals(v1.hashCode(), v2.hashCode());
}
}
public static class ToStringMethodTest {
@Test
public void shouldReturnStringRepresentation() {
String value = "1.2.3-beta+build";