Skip to content

Commit 7c53996

Browse files
committed
Add unit test coverage for Version and fix version comparison logic errors
1 parent 8ac4b12 commit 7c53996

File tree

2 files changed

+130
-11
lines changed

2 files changed

+130
-11
lines changed

src/main/java/com/github/khakers/modmailviewer/Version.java

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,32 @@ public String asVersionString() {
4646
return string.toString();
4747
}
4848

49+
/**
50+
* Compares this version to the given version.
51+
* Versions that are the same return false.
52+
*
53+
* @param version the version to compare to
54+
* @return true if this version is newer than the given version
55+
*/
56+
public boolean isNewerThan(Version version) {
57+
return this.compareTo(version) > 0;
58+
}
59+
60+
/**
61+
* Compares this version to the given version.
62+
* Versions that are the same return false.
63+
*
64+
* @param version the version to compare to
65+
* @return true if this version is older than the given version
66+
*/
67+
public boolean isOlderThan(Version version) {
68+
return this.compareTo(version) < 0;
69+
}
70+
71+
public boolean isStable() {
72+
return this.prerelease == null;
73+
}
74+
4975
@Override
5076
public boolean equals(Object o) {
5177
if (this == o) return true;
@@ -65,13 +91,16 @@ public String toString() {
6591
"major=" + major +
6692
", minor=" + minor +
6793
", patch=" + patch +
68-
", versionString='" + prerelease + '\'' +
94+
", prerelease='" + prerelease + '\'' +
95+
", versionString='" + asVersionString() + '\'' +
6996
", metaData='" + metaData + '\'' +
7097
'}';
7198
}
7299

73100
/**
74-
* Does not calculate PRE-RELEASE versions
101+
* Calcualtes the difference between two versions.
102+
*
103+
* PRERELEASE versions are compared lexicographically.
75104
* <p>
76105
* Compares this object with the specified object for order. Returns a
77106
* negative integer, zero, or a positive integer as this object is less
@@ -110,26 +139,35 @@ public int compareTo(@NotNull Version version) {
110139
if (this.equals(version))
111140
return 0;
112141

113-
if (version.major > this.major)
142+
if (this.major > version.major)
114143
return 1;
115-
else if (version.major < this.major) {
144+
else if (this.major < version.major) {
116145
return -1;
117146
}
118147

119-
if (version.minor > this.minor)
148+
if (this.minor > version.minor)
120149
return 1;
121-
else if (version.minor < this.minor) {
150+
else if (this.minor < version.minor) {
122151
return -1;
123152
}
124153

125-
if (version.patch > this.patch)
154+
if (this.patch > version.patch)
126155
return 1;
127-
else if (version.patch < this.patch) {
156+
else if (this.patch < version.patch) {
128157
return -1;
129158
}
130159

131-
if (version.prerelease != null && this.prerelease != null) {
132-
return version.prerelease.compareTo(this.prerelease);
160+
// A prerelease version is always less than a stable version of the same major.minor.patch
161+
if (this.isStable() && !version.isStable()) {
162+
return 1;
163+
} else if (!this.isStable()&& version.isStable()) {
164+
return -1;
165+
}
166+
167+
168+
if (this.prerelease != null && version.prerelease != null) {
169+
// return reverse comparison because prerelease versions are compared lexicographically
170+
return -version.prerelease.compareTo(this.prerelease);
133171
}
134172

135173
return 0;

src/test/java/com/github/khakers/modmailviewer/VersionTest.java

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.khakers.modmailviewer;
22

33
import org.junit.jupiter.api.Assertions;
4+
import org.junit.jupiter.api.Test;
45
import org.junit.jupiter.params.ParameterizedTest;
56
import org.junit.jupiter.params.provider.CsvFileSource;
67

@@ -13,7 +14,87 @@ void version_ShouldParseAllValidSemver(String input){
1314
}
1415
@ParameterizedTest()
1516
@CsvFileSource(resources = "/invalidSemver.csv")
16-
void version_ShouldNotParseInvalidSemver(String input){
17+
void version_ShouldNotParseInvalidSemver(String input) {
1718
Assertions.assertThrows(IllegalStateException.class, () -> new Version(input));
1819
}
20+
21+
//Test release comparisons
22+
@Test
23+
void version_NewerMajorReleaseIsNewer() {
24+
var oldVersion = new Version("1.0.0");
25+
var newerVersion = new Version("2.0.0");
26+
Assertions.assertTrue(newerVersion.isNewerThan(oldVersion));
27+
}
28+
29+
@Test
30+
void version_OlderMajorReleaseIsOlder() {
31+
var oldVersion = new Version("1.0.0");
32+
var newerVersion = new Version("2.0.0");
33+
Assertions.assertTrue(oldVersion.isOlderThan(newerVersion));
34+
}
35+
36+
@Test
37+
void version_NewerMinorReleaseIsNewer() {
38+
var oldVersion = new Version("1.0.0");
39+
var newerVersion = new Version("1.1.0");
40+
Assertions.assertTrue(newerVersion.isNewerThan(oldVersion));
41+
}
42+
43+
@Test
44+
void version_OlderMinorReleaseIsOlder() {
45+
var oldVersion = new Version("1.0.0");
46+
var newerVersion = new Version("1.1.0");
47+
Assertions.assertTrue(oldVersion.isOlderThan(newerVersion));
48+
}
49+
50+
@Test
51+
void version_NewerPatchReleaseIsNewer() {
52+
var oldVersion = new Version("1.0.0");
53+
var newerVersion = new Version("1.0.1");
54+
Assertions.assertTrue(newerVersion.isNewerThan(oldVersion));
55+
}
56+
57+
@Test
58+
void version_OlderPatchReleaseIsOlder() {
59+
var oldVersion = new Version("1.0.0");
60+
var newerVersion = new Version("1.0.1");
61+
Assertions.assertTrue(oldVersion.isOlderThan(newerVersion));
62+
}
63+
64+
@Test
65+
void version_NewerPrereleaseIsNewer() {
66+
var olderPrerelease = new Version("1.0.0-alpha.1");
67+
var newerPrerelease = new Version("1.0.0-alpha.2");
68+
// newer version should be greater than old version
69+
Assertions.assertTrue(newerPrerelease.isNewerThan(olderPrerelease), "Newer pre-release version should be greater than older prerelease version");
70+
}
71+
@Test
72+
void version_OlderPrereleaseIsOlder() {
73+
var oldVersion = new Version("1.0.0-alpha.1");
74+
var newerVersion = new Version("1.0.0-alpha.2");
75+
// newer version should be greater than old version
76+
Assertions.assertTrue(oldVersion.isOlderThan(newerVersion), "Newer pre-release version should be greater than older prerelease version");
77+
}
78+
@Test
79+
void version_IdenticalPrereleaseVersionsAreSame() {
80+
var version = new Version("1.0.0-alpha.1");
81+
var version1 = new Version("1.0.0-alpha.1");
82+
Assertions.assertFalse(version.isOlderThan(version1));
83+
Assertions.assertFalse(version.isNewerThan(version1));
84+
}
85+
@Test
86+
void version_StableGreaterThanPrerelease() {
87+
var stable = new Version("1.0.0");
88+
var prerelease = new Version("1.0.0-alpha");
89+
// stable should be greater than prerelease
90+
Assertions.assertTrue(stable.isNewerThan(prerelease), "Stable should be newer than pre-release of the same version");
91+
}
92+
93+
@Test
94+
void version_PrereleaseLessThanStable() {
95+
var stable = new Version("1.0.0");
96+
var prerelease = new Version("1.0.0-alpha");
97+
// prerelease should be less than stable
98+
Assertions.assertTrue(prerelease.isOlderThan(stable), "Pre-release should be older than stable of the same version");
99+
}
19100
}

0 commit comments

Comments
 (0)