Make version classes immutable

This commit is contained in:
Zafar Khaja 2013-03-06 00:46:53 +04:00
parent 00e87f31da
commit c0baccf4ba
5 changed files with 61 additions and 42 deletions

View File

@ -32,7 +32,7 @@ import java.util.regex.Pattern;
*/
class AlphaNumericVersion implements Comparable<AlphaNumericVersion> {
private String value;
private final String value;
static final String FORMAT = "([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)";
private static final Pattern PATTERN = Pattern.compile("^" + FORMAT + "$");

View File

@ -32,9 +32,9 @@ import java.util.regex.Pattern;
*/
class NormalVersion implements Comparable<NormalVersion> {
private int major;
private int minor;
private int patch;
private final int major;
private final int minor;
private final int patch;
static final String FORMAT = "(\\d+)\\.(\\d+)\\.(\\d+)";
private static final Pattern PATTERN = Pattern.compile("^" + FORMAT + "$");
@ -74,19 +74,16 @@ class NormalVersion implements Comparable<NormalVersion> {
return patch;
}
void incrementMajor() {
major = major + 1;
minor = 0;
patch = 0;
NormalVersion incrementMajor() {
return new NormalVersion(major + 1, 0, 0);
}
void incrementMinor() {
minor = minor + 1;
patch = 0;
NormalVersion incrementMinor() {
return new NormalVersion(major, minor + 1, 0);
}
void incrementPatch() {
patch = patch + 1;
NormalVersion incrementPatch() {
return new NormalVersion(major, minor, patch + 1);
}
@Override

View File

@ -32,9 +32,9 @@ import java.util.regex.Pattern;
*/
public class Version implements Comparable<Version> {
private NormalVersion normal;
private AlphaNumericVersion preRelease;
private AlphaNumericVersion build;
private final NormalVersion normal;
private final AlphaNumericVersion preRelease;
private final AlphaNumericVersion build;
private static final String PRE_RELEASE_PREFIX = "-";
private static final String BUILD_PREFIX = "+";
@ -92,16 +92,16 @@ public class Version implements Comparable<Version> {
return new Version(normal, preRelease, build);
}
public void incrementMajorVersion() {
normal.incrementMajor();
public Version incrementMajorVersion() {
return new Version(normal.incrementMajor(), preRelease, build);
}
public void incrementMinorVersion() {
normal.incrementMinor();
public Version incrementMinorVersion() {
return new Version(normal.incrementMinor(), preRelease, build);
}
public void incrementPatchVersion() {
normal.incrementPatch();
public Version incrementPatchVersion() {
return new Version(normal.incrementPatch(), preRelease, build);
}
public int getMajorVersion() {

View File

@ -72,30 +72,30 @@ public class NormalVersionTest {
public void mustIncreaseEachElementNumericallyByIncrementsOfOne() {
int major = 1, minor = 2, patch = 3;
NormalVersion v = new NormalVersion(major, minor, patch);
v.incrementPatch();
assertEquals(patch + 1, v.getPatch());
v.incrementMinor();
assertEquals(minor + 1, v.getMinor());
v.incrementMajor();
assertEquals(major + 1, v.getMajor());
NormalVersion incrementedPatch = v.incrementPatch();
assertEquals(patch + 1, incrementedPatch.getPatch());
NormalVersion incrementedMinor = v.incrementMinor();
assertEquals(minor + 1, incrementedMinor.getMinor());
NormalVersion incrementedMajor = v.incrementMajor();
assertEquals(major + 1, incrementedMajor.getMajor());
}
@Test
public void mustResetMinorAndPatchToZeroWhenMajorIsIncremented() {
NormalVersion v = new NormalVersion(1, 2, 3);
v.incrementMajor();
assertEquals(2, v.getMajor());
assertEquals(0, v.getMinor());
assertEquals(0, v.getPatch());
NormalVersion incremented = v.incrementMajor();
assertEquals(2, incremented.getMajor());
assertEquals(0, incremented.getMinor());
assertEquals(0, incremented.getPatch());
}
@Test
public void mustResetPatchToZeroWhenMinorIsIncremented() {
NormalVersion v = new NormalVersion(1, 2, 3);
v.incrementMinor();
assertEquals(1, v.getMajor());
assertEquals(3, v.getMinor());
assertEquals(0, v.getPatch());
NormalVersion incremented = v.incrementMinor();
assertEquals(1, incremented.getMajor());
assertEquals(3, incremented.getMinor());
assertEquals(0, incremented.getPatch());
}
@Test
@ -122,6 +122,17 @@ public class NormalVersionTest {
assertEquals(2, v.getMinor());
assertEquals(3, v.getPatch());
}
@Test
public void shoudBeImmutable() {
NormalVersion version = new NormalVersion(1, 2, 3);
NormalVersion incementedMajor = version.incrementMajor();
assertNotSame(version, incementedMajor);
NormalVersion incementedMinor = version.incrementMinor();
assertNotSame(version, incementedMinor);
NormalVersion incementedPatch = version.incrementPatch();
assertNotSame(version, incementedPatch);
}
}
public static class EqualsMethodTest {

View File

@ -154,22 +154,33 @@ public class VersionTest {
@Test
public void shouldProvideIncrementMajorVersionMethod() {
Version v = Version.valueOf("1.2.3");
v.incrementMajorVersion();
assertEquals("2.0.0", v.toString());
Version incrementedMajor = v.incrementMajorVersion();
assertEquals("2.0.0", incrementedMajor.toString());
}
@Test
public void shouldProvideIncrementMinorVersionMethod() {
Version v = Version.valueOf("1.2.3");
v.incrementMinorVersion();
assertEquals("1.3.0", v.toString());
Version incrementedMinor = v.incrementMinorVersion();
assertEquals("1.3.0", incrementedMinor.toString());
}
@Test
public void shouldProvideIncrementPatchVersionMethod() {
Version v = Version.valueOf("1.2.3");
v.incrementPatchVersion();
assertEquals("1.2.4", v.toString());
Version incrementedPatch = v.incrementPatchVersion();
assertEquals("1.2.4", incrementedPatch.toString());
}
@Test
public void shouldBeImmutable() {
Version version = Version.valueOf("1.2.3");
Version incementedMajor = version.incrementMajorVersion();
assertNotSame(version, incementedMajor);
Version incementedMinor = version.incrementMinorVersion();
assertNotSame(version, incementedMinor);
Version incementedPatch = version.incrementPatchVersion();
assertNotSame(version, incementedPatch);
}
}