From 5f7593b377bdf4794f15cd8de693826a88f44f09 Mon Sep 17 00:00:00 2001 From: Zafar Khaja Date: Sat, 30 Mar 2013 22:30:25 +0400 Subject: [PATCH] Create Version.Builder class --- .../com/github/zafarkhaja/semver/Version.java | 73 ++++++++++++++----- .../github/zafarkhaja/semver/VersionTest.java | 42 ++++++++++- 2 files changed, 94 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/github/zafarkhaja/semver/Version.java b/src/main/java/com/github/zafarkhaja/semver/Version.java index b5efed6..01dc052 100644 --- a/src/main/java/com/github/zafarkhaja/semver/Version.java +++ b/src/main/java/com/github/zafarkhaja/semver/Version.java @@ -44,19 +44,65 @@ public class Version implements Comparable { static { StringBuilder sb = new StringBuilder(); sb.append("^") - .append(NormalVersion.FORMAT) + .append("(?") + .append(NormalVersion.FORMAT) + .append(")") .append("(?:") .append(PRE_RELEASE_PREFIX) - .append(MetadataVersion.FORMAT) + .append("(?") + .append(MetadataVersion.FORMAT) + .append(")") .append(")?").append("(?:") .append("\\").append(BUILD_PREFIX) - .append(MetadataVersion.FORMAT) + .append("(?") + .append(MetadataVersion.FORMAT) + .append(")") .append(")?") .append("$"); SEMVER_PATTERN = Pattern.compile(sb.toString()); } + public static class Builder { + + private String normal; + private String preRelease; + private String build; + + public Builder(String normal) { + if (normal == null) { + throw new NullPointerException( + "Normal version MUST NOT be NULL" + ); + } + this.normal = normal; + } + + public void setPreReleaseVersion(String preRelease) { + this.preRelease = preRelease; + } + + public void setBuildMetadata(String build) { + this.build = build; + } + + public Version build() { + MetadataVersion preReleaseVersion = null; + if (preRelease != null) { + preReleaseVersion = new MetadataVersion(preRelease); + } + MetadataVersion buildMetadata = null; + if (build != null) { + buildMetadata = new MetadataVersion(build); + } + return new Version( + NormalVersion.valueOf(normal), + preReleaseVersion, + buildMetadata + ); + } + } + Version(NormalVersion normal) { this(normal, null, null); } @@ -81,23 +127,10 @@ public class Version implements Comparable { 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)) - ); - - MetadataVersion preRelease = - (matcher.group(4) != null) ? - new MetadataVersion(matcher.group(4)) : - null; - - MetadataVersion build = - (matcher.group(5) != null) ? - new MetadataVersion(matcher.group(5)) : - null; - - return new Version(normal, preRelease, build); + Builder builder = new Builder(matcher.group("normal")); + builder.setPreReleaseVersion(matcher.group("preRelease")); + builder.setBuildMetadata(matcher.group("build")); + return builder.build(); } public Version incrementMajorVersion() { diff --git a/src/test/java/com/github/zafarkhaja/semver/VersionTest.java b/src/test/java/com/github/zafarkhaja/semver/VersionTest.java index fcf3e6d..57997aa 100644 --- a/src/test/java/com/github/zafarkhaja/semver/VersionTest.java +++ b/src/test/java/com/github/zafarkhaja/semver/VersionTest.java @@ -249,7 +249,6 @@ public class VersionTest { assertEquals("1.0.0-beta.2", v2.toString()); } - @Test public void shouldProvideIncrementBuildMetadataMethod() { Version v1 = Version.valueOf("1.0.0+build.1"); @@ -364,4 +363,45 @@ public class VersionTest { assertEquals(value, v.toString()); } } + + public static class BuilderTest { + + @Test + public void shouldThrowNullPointerExceptionIfNormalVersionIsNull() { + try { + Version.Builder builder = new Version.Builder(null); + } catch (NullPointerException e) { + return; + } + fail("Builder was expected to throw NullPointerException"); + } + + @Test + public void shouldBuildVersionFromNormalVersion() { + Version.Builder builder = new Version.Builder("1.0.0"); + assertEquals(Version.valueOf("1.0.0"), builder.build()); + } + + @Test + public void shouldBuildVersionWithPreReleaseVersion() { + Version.Builder builder = new Version.Builder("1.0.0"); + builder.setPreReleaseVersion("alpha"); + assertEquals(Version.valueOf("1.0.0-alpha"), builder.build()); + } + + @Test + public void shouldBuildVersionWithBuildMetadata() { + Version.Builder builder = new Version.Builder("1.0.0"); + builder.setBuildMetadata("build"); + assertEquals(Version.valueOf("1.0.0+build"), builder.build()); + } + + @Test + public void shouldBuildVersionWithPreReleaseVersionAndBuildMetadata() { + Version.Builder builder = new Version.Builder("1.0.0"); + builder.setPreReleaseVersion("alpha"); + builder.setBuildMetadata("build"); + assertEquals(Version.valueOf("1.0.0-alpha+build"), builder.build()); + } + } }