[jsemver] 41/95: Create MetadataVersion.NULL object, refactor
Alexandre Viau
reazem-guest at moszumanska.debian.org
Mon Feb 16 14:58:28 UTC 2015
This is an automated email from the git hooks/post-receive script.
reazem-guest pushed a commit to branch master
in repository jsemver.
commit fac6ece28c6589e37f86e702e86a020e363def5b
Author: Zafar Khaja <zafarkhaja at gmail.com>
Date: Mon Nov 4 18:50:01 2013 +0400
Create MetadataVersion.NULL object, refactor
---
.../github/zafarkhaja/semver/MetadataVersion.java | 60 +++++++++++++--
.../java/com/github/zafarkhaja/semver/Version.java | 90 +++++++---------------
.../github/zafarkhaja/semver/VersionParser.java | 10 ++-
.../zafarkhaja/semver/MetadataVersionTest.java | 56 ++++++++++++++
.../zafarkhaja/semver/VersionParserTest.java | 12 +++
5 files changed, 159 insertions(+), 69 deletions(-)
diff --git a/src/main/java/com/github/zafarkhaja/semver/MetadataVersion.java b/src/main/java/com/github/zafarkhaja/semver/MetadataVersion.java
index 83b46ab..ce615c9 100644
--- a/src/main/java/com/github/zafarkhaja/semver/MetadataVersion.java
+++ b/src/main/java/com/github/zafarkhaja/semver/MetadataVersion.java
@@ -31,6 +31,47 @@ import java.util.Arrays;
*/
class MetadataVersion implements Comparable<MetadataVersion> {
+ static final MetadataVersion NULL = new NullMetadataVersion();
+
+ private static class NullMetadataVersion extends MetadataVersion {
+
+ public NullMetadataVersion() {
+ super(null);
+ }
+
+ @Override
+ MetadataVersion increment() {
+ throw new NullPointerException("Metadata version is NULL");
+ }
+
+ @Override
+ public String toString() {
+ return "";
+ }
+
+ @Override
+ public int hashCode() {
+ return 0;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return other instanceof NullMetadataVersion;
+ }
+
+ @Override
+ public int compareTo(MetadataVersion other) {
+ if (!equals(other)) {
+ /**
+ * Pre-release versions have a lower precedence than
+ * the associated normal version. (SemVer p.9)
+ */
+ return 1;
+ }
+ return 0;
+ }
+ }
+
private final String[] idents;
MetadataVersion(String[] identifiers) {
@@ -69,14 +110,21 @@ class MetadataVersion implements Comparable<MetadataVersion> {
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
- for (String id : idents) {
- sb.append(id).append(".");
+ for (String ident : idents) {
+ sb.append(ident).append(".");
}
return sb.deleteCharAt(sb.lastIndexOf(".")).toString();
}
@Override
public int compareTo(MetadataVersion other) {
+ if (other == MetadataVersion.NULL) {
+ /**
+ * Pre-release versions have a lower precedence than
+ * the associated normal version. (SemVer p.9)
+ */
+ return -1;
+ }
int result = compareIdentifierArrays(other.idents);
if (result == 0) {
result = idents.length - other.idents.length;
@@ -100,11 +148,11 @@ class MetadataVersion implements Comparable<MetadataVersion> {
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);
+ private int compareIdentifiers(String ident1, String ident2) {
+ if (isInt(ident1) && isInt(ident2)) {
+ return Integer.parseInt(ident1) - Integer.parseInt(ident2);
} else {
- return id1.compareTo(id2);
+ return ident1.compareTo(ident2);
}
}
diff --git a/src/main/java/com/github/zafarkhaja/semver/Version.java b/src/main/java/com/github/zafarkhaja/semver/Version.java
index 2970399..40e1839 100644
--- a/src/main/java/com/github/zafarkhaja/semver/Version.java
+++ b/src/main/java/com/github/zafarkhaja/semver/Version.java
@@ -44,36 +44,28 @@ public class Version implements Comparable<Version> {
private String preRelease;
private String build;
- public Builder(String normalVersion) {
- if (normalVersion == null) {
+ public Builder(String normal) {
+ if (normal == null) {
throw new NullPointerException(
"Normal version MUST NOT be NULL"
);
}
- normal = normalVersion;
+ this.normal = normal;
}
- public void setPreReleaseVersion(String preReleaseVersion) {
- preRelease = preReleaseVersion;
+ public void setPreReleaseVersion(String preRelease) {
+ this.preRelease = preRelease;
}
- public void setBuildMetadata(String buildMetadata) {
- build = buildMetadata;
+ public void setBuildMetadata(String build) {
+ this.build = build;
}
public Version build() {
- MetadataVersion preReleaseVersion = null;
- if (preRelease != null) {
- preReleaseVersion = VersionParser.parsePreRelease(preRelease);
- }
- MetadataVersion buildMetadata = null;
- if (build != null) {
- buildMetadata = VersionParser.parseBuild(build);
- }
return new Version(
VersionParser.parseVersionCore(normal),
- preReleaseVersion,
- buildMetadata
+ VersionParser.parsePreRelease(preRelease),
+ VersionParser.parseBuild(build)
);
}
}
@@ -86,32 +78,28 @@ public class Version implements Comparable<Version> {
public int compare(Version v1, Version v2) {
int result = v1.compareTo(v2);
if (result == 0) {
- result = compareBuilds(v1, v2);
- }
- return result;
- }
-
- private int compareBuilds(Version v1, Version v2) {
- int result = 0;
- if (v1.build != null && v2.build != null) {
result = v1.build.compareTo(v2.build);
- } else if (v1.build == null ^ v2.build == null) {
- /**
- * Build versions should have a higher precedence
- * than the associated normal version.
- */
- result = (v1.build == null) ? -1 : 1;
+ if (v1.build == MetadataVersion.NULL ||
+ v2.build == MetadataVersion.NULL
+ ) {
+ /**
+ * Build metadata should have a higher precedence
+ * than the associated normal version which is the
+ * opposite compared to pre-release versions.
+ */
+ result = -1 * result;
+ }
}
return result;
}
}
Version(NormalVersion normal) {
- this(normal, null, null);
+ this(normal, MetadataVersion.NULL, MetadataVersion.NULL);
}
Version(NormalVersion normal, MetadataVersion preRelease) {
- this(normal, preRelease, null);
+ this(normal, preRelease, MetadataVersion.NULL);
}
Version(
@@ -162,16 +150,10 @@ public class Version implements Comparable<Version> {
}
public Version incrementPreReleaseVersion() {
- if (preRelease == null) {
- throw new NullPointerException("Pre-release version is NULL");
- }
return new Version(normal, preRelease.increment());
}
public Version incrementBuildMetadata() {
- if (build == null) {
- throw new NullPointerException("Build metadata is NULL");
- }
return new Version(normal, preRelease, build.increment());
}
@@ -207,11 +189,11 @@ public class Version implements Comparable<Version> {
}
public String getPreReleaseVersion() {
- return (preRelease != null) ? preRelease.toString() : "";
+ return preRelease.toString();
}
public String getBuildMetadata() {
- return (build != null) ? build.toString() : "";
+ return build.toString();
}
public boolean greaterThan(Version other) {
@@ -244,19 +226,19 @@ public class Version implements Comparable<Version> {
@Override
public int hashCode() {
int hash = 5;
- hash = 97 * hash + (normal != null ? normal.hashCode() : 0);
- hash = 97 * hash + (preRelease != null ? preRelease.hashCode() : 0);
- hash = 97 * hash + (build != null ? build.hashCode() : 0);
+ hash = 97 * hash + normal.hashCode();
+ hash = 97 * hash + preRelease.hashCode();
+ hash = 97 * hash + build.hashCode();
return hash;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(getNormalVersion());
- if (preRelease != null) {
+ if (!getPreReleaseVersion().isEmpty()) {
sb.append(PRE_RELEASE_PREFIX).append(getPreReleaseVersion());
}
- if (build != null) {
+ if (!getBuildMetadata().isEmpty()) {
sb.append(BUILD_PREFIX).append(getBuildMetadata());
}
return sb.toString();
@@ -266,7 +248,7 @@ public class Version implements Comparable<Version> {
public int compareTo(Version other) {
int result = normal.compareTo(other.normal);
if (result == 0) {
- result = comparePreReleases(other);
+ result = preRelease.compareTo(other.preRelease);
}
return result;
}
@@ -274,18 +256,4 @@ public class Version implements Comparable<Version> {
public int compareWithBuildsTo(Version other) {
return BUILD_AWARE_ORDER.compare(this, other);
}
-
- 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) {
- /**
- * Pre-release versions have a lower precedence than
- * the associated normal version. (SemVer p.9)
- */
- result = (preRelease == null) ? 1 : -1;
- }
- return result;
- }
}
diff --git a/src/main/java/com/github/zafarkhaja/semver/VersionParser.java b/src/main/java/com/github/zafarkhaja/semver/VersionParser.java
index 516cee4..ef28f61 100644
--- a/src/main/java/com/github/zafarkhaja/semver/VersionParser.java
+++ b/src/main/java/com/github/zafarkhaja/semver/VersionParser.java
@@ -173,19 +173,25 @@ class VersionParser implements Parser<Version> {
}
static MetadataVersion parsePreRelease(String preRelease) {
+ if (preRelease == null) {
+ return MetadataVersion.NULL;
+ }
VersionParser parser = new VersionParser(preRelease);
return parser.parsePreRelease();
}
static MetadataVersion parseBuild(String build) {
+ if (build == null) {
+ return MetadataVersion.NULL;
+ }
VersionParser parser = new VersionParser(build);
return parser.parseBuild();
}
private Version parseValidSemVer() {
NormalVersion normalVersion = parseVersionCore();
- MetadataVersion preReleaseVersion = null;
- MetadataVersion buildMetadata = null;
+ MetadataVersion preReleaseVersion = MetadataVersion.NULL;
+ MetadataVersion buildMetadata = MetadataVersion.NULL;
if (chars.positiveLookahead(HYPHEN)) {
chars.consume();
preReleaseVersion = parsePreRelease();
diff --git a/src/test/java/com/github/zafarkhaja/semver/MetadataVersionTest.java b/src/test/java/com/github/zafarkhaja/semver/MetadataVersionTest.java
index a679f76..4f5c994 100644
--- a/src/test/java/com/github/zafarkhaja/semver/MetadataVersionTest.java
+++ b/src/test/java/com/github/zafarkhaja/semver/MetadataVersionTest.java
@@ -82,6 +82,13 @@ public class MetadataVersionTest {
}
@Test
+ public void shouldReturnNegativeWhenComparedToNullMetadataVersion() {
+ MetadataVersion v1 = new MetadataVersion(new String[] {});
+ MetadataVersion v2 = MetadataVersion.NULL;
+ assertTrue(0 > v1.compareTo(v2));
+ }
+
+ @Test
public void shouldOverrideEqualsMethod() {
MetadataVersion v1 = new MetadataVersion(
new String[] {"alpha", "123"}
@@ -124,6 +131,55 @@ public class MetadataVersionTest {
}
}
+ public static class NullMetadataVersionTest {
+
+ @Test
+ public void shouldReturnEmptyStringOnToString() {
+ MetadataVersion v = MetadataVersion.NULL;
+ assertTrue(v.toString().isEmpty());
+ }
+
+ @Test
+ public void shouldReturnZeroOnHashCode() {
+ MetadataVersion v = MetadataVersion.NULL;
+ assertEquals(0, v.hashCode());
+ }
+
+ @Test
+ public void shouldBeEqualOnlyToItsType() {
+ MetadataVersion v1 = MetadataVersion.NULL;
+ MetadataVersion v2 = MetadataVersion.NULL;
+ MetadataVersion v3 = new MetadataVersion(new String[] {});
+ assertTrue(v1.equals(v2));
+ assertTrue(v2.equals(v1));
+ assertFalse(v1.equals(v3));
+ }
+
+ @Test
+ public void shouldReturnPositiveWhenComparedToNonNullMetadataVersion() {
+ MetadataVersion v1 = MetadataVersion.NULL;
+ MetadataVersion v2 = new MetadataVersion(new String[] {});
+ assertTrue(0 < v1.compareTo(v2));
+ }
+
+ @Test
+ public void shouldReturnZeroWhenComparedToNullMetadataVersion() {
+ MetadataVersion v1 = MetadataVersion.NULL;
+ MetadataVersion v2 = MetadataVersion.NULL;
+ assertTrue(0 == v1.compareTo(v2));
+ }
+
+ @Test
+ public void shouldThrowNullPointerExceptionIfIncremented() {
+ try {
+ MetadataVersion.NULL.increment();
+ } catch (NullPointerException e) {
+ return;
+ }
+ fail("Should throw NullPointerException when incremented");
+ }
+ }
+
public static class EqualsMethodTest {
@Test
diff --git a/src/test/java/com/github/zafarkhaja/semver/VersionParserTest.java b/src/test/java/com/github/zafarkhaja/semver/VersionParserTest.java
index 6831c7a..ac2b895 100644
--- a/src/test/java/com/github/zafarkhaja/semver/VersionParserTest.java
+++ b/src/test/java/com/github/zafarkhaja/semver/VersionParserTest.java
@@ -55,6 +55,12 @@ public class VersionParserTest {
}
@Test
+ public void shouldReturnNullMetadataVersionIfPreReleaseIsNull() {
+ MetadataVersion preRelease = VersionParser.parsePreRelease(null);
+ assertEquals(MetadataVersion.NULL, preRelease);
+ }
+
+ @Test
public void shouldNotAllowDigitsInPreReleaseVersion() {
try {
VersionParser.parsePreRelease("alpha.01");
@@ -81,6 +87,12 @@ public class VersionParserTest {
}
@Test
+ public void shouldReturnNullMetadataVersionIfBuildIsNull() {
+ MetadataVersion build = VersionParser.parseBuild(null);
+ assertEquals(MetadataVersion.NULL, build);
+ }
+
+ @Test
public void shouldAllowDigitsInBuildMetadata() {
try {
VersionParser.parseBuild("build.01");
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jsemver.git
More information about the pkg-java-commits
mailing list