Skip to content

Impl: test minimum supported Coder version #118

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Dec 9, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Impl: parse the patch number from semver
- update equals&hashCode
- implement comparator
  • Loading branch information
fioan89 committed Dec 8, 2022
commit e3fec1cca4d3115c314dfb81a12da163eebb6b21
23 changes: 19 additions & 4 deletions src/main/kotlin/com/coder/gateway/sdk/CoderSemVer.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package com.coder.gateway.sdk


class CoderSemVer(private val major: Long = 0, private val minor: Long = 0) {
class CoderSemVer(private val major: Long = 0, private val minor: Long = 0, private val patch: Long = 0) : Comparable<CoderSemVer> {

init {
require(major >= 0) { "Coder major version must be a positive number" }
require(minor >= 0) { "Coder minor version must be a positive number" }
require(patch >= 0) { "Coder minor version must be a positive number" }
}

fun isCompatibleWith(other: CoderSemVer): Boolean {
Expand All @@ -17,6 +18,11 @@ class CoderSemVer(private val major: Long = 0, private val minor: Long = 0) {
return this.major <= other.major
}


override fun toString(): String {
return "CoderSemVer(major=$major, minor=$minor)"
}

override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
Expand All @@ -25,20 +31,28 @@ class CoderSemVer(private val major: Long = 0, private val minor: Long = 0) {

if (major != other.major) return false
if (minor != other.minor) return false
if (patch != other.patch) return false

return true
}

override fun hashCode(): Int {
var result = major.hashCode()
result = 31 * result + minor.hashCode()
result = 31 * result + patch.hashCode()
return result
}

override fun toString(): String {
return "CoderSemVer(major=$major, minor=$minor)"
}
override fun compareTo(other: CoderSemVer): Int {
if (major > other.major) return 1
if (major < other.major) return -1
if (minor > other.minor) return 1
if (minor < other.minor) return -1
if (patch > other.patch) return 1
if (patch < other.patch) return -1

return 0
}

companion object {
private val pattern = """^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$""".toRegex()
Expand All @@ -52,6 +66,7 @@ class CoderSemVer(private val major: Long = 0, private val minor: Long = 0) {
return CoderSemVer(
if (matchResult.groupValues[1].isNotEmpty()) matchResult.groupValues[1].toLong() else 0,
if (matchResult.groupValues[2].isNotEmpty()) matchResult.groupValues[2].toLong() else 0,
if (matchResult.groupValues[3].isNotEmpty()) matchResult.groupValues[3].toLong() else 0,
)
}
}
Expand Down
132 changes: 70 additions & 62 deletions src/test/groovy/CoderSemVerTest.groovy
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.coder.gateway.sdk

import spock.lang.Ignore

class CoderSemVerTest extends spock.lang.Specification {

def 'semver versions are valid'() {
Expand Down Expand Up @@ -46,37 +48,37 @@ class CoderSemVerTest extends spock.lang.Specification {

where:
semver || expectedCoderSemVer
'0.0.4' || new CoderSemVer(0L, 0L)
'1.2.3' || new CoderSemVer(1L, 2L)
'10.20.30' || new CoderSemVer(10L, 20L)
'1.1.2-prerelease+meta' || new CoderSemVer(1L, 1L)
'1.1.2+meta' || new CoderSemVer(1L, 1L)
'1.1.2+meta-valid' || new CoderSemVer(1L, 1L)
'1.0.0-alpha' || new CoderSemVer(1L, 0L)
'1.0.0-beta' || new CoderSemVer(1L, 0L)
'1.0.0-alpha.beta' || new CoderSemVer(1L, 0L)
'1.0.0-alpha.beta.1' || new CoderSemVer(1L, 0L)
'1.0.0-alpha.1' || new CoderSemVer(1L, 0L)
'1.0.0-alpha0.valid' || new CoderSemVer(1L, 0L)
'1.0.0-alpha.0valid' || new CoderSemVer(1L, 0L)
'1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay' || new CoderSemVer(1L, 0L)
'1.0.0-rc.1+build.1' || new CoderSemVer(1L, 0L)
'2.0.0-rc.1+build.123' || new CoderSemVer(2L, 0L)
'1.2.3-beta' || new CoderSemVer(1L, 2L)
'10.2.3-DEV-SNAPSHOT' || new CoderSemVer(10L, 2L)
'1.2.3-SNAPSHOT-123' || new CoderSemVer(1L, 2L)
'1.0.0' || new CoderSemVer(1L, 0L)
'2.0.0' || new CoderSemVer(2L, 0L)
'1.1.7' || new CoderSemVer(1L, 1L)
'2.0.0+build.1848' || new CoderSemVer(2L, 0L)
'2.0.1-alpha.1227' || new CoderSemVer(2L, 0L)
'1.0.0-alpha+beta' || new CoderSemVer(1L, 0L)
'1.2.3----RC-SNAPSHOT.12.9.1--.12+788' || new CoderSemVer(1L, 2L)
'1.2.3----R-S.12.9.1--.12+meta' || new CoderSemVer(1L, 2L)
'1.2.3----RC-SNAPSHOT.12.9.1--.12' || new CoderSemVer(1L, 2L)
'1.0.0+0.build.1-rc.10000aaa-kk-0.1' || new CoderSemVer(1L, 0L)
'2147483647.2147483647.2147483647' || new CoderSemVer(2147483647L, 2147483647L)
'1.0.0-0A.is.legal' || new CoderSemVer(1L, 0L)
'0.0.4' || new CoderSemVer(0L, 0L, 4L)
'1.2.3' || new CoderSemVer(1L, 2L, 3L)
'10.20.30' || new CoderSemVer(10L, 20L, 30L)
'1.1.2-prerelease+meta' || new CoderSemVer(1L, 1L, 2L)
'1.1.2+meta' || new CoderSemVer(1L, 1L, 2L)
'1.1.2+meta-valid' || new CoderSemVer(1L, 1L, 2L)
'1.0.0-alpha' || new CoderSemVer(1L, 0L, 0L)
'1.0.0-beta' || new CoderSemVer(1L, 0L, 0L)
'1.0.0-alpha.beta' || new CoderSemVer(1L, 0L, 0L)
'1.0.0-alpha.beta.1' || new CoderSemVer(1L, 0L, 0L)
'1.0.0-alpha.1' || new CoderSemVer(1L, 0L, 0L)
'1.0.0-alpha0.valid' || new CoderSemVer(1L, 0L, 0L)
'1.0.0-alpha.0valid' || new CoderSemVer(1L, 0L, 0L)
'1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay' || new CoderSemVer(1L, 0L, 0L)
'1.0.0-rc.1+build.1' || new CoderSemVer(1L, 0L, 0L)
'2.0.0-rc.1+build.123' || new CoderSemVer(2L, 0L, 0L)
'1.2.3-beta' || new CoderSemVer(1L, 2L, 3L)
'10.2.3-DEV-SNAPSHOT' || new CoderSemVer(10L, 2L, 3L)
'1.2.3-SNAPSHOT-123' || new CoderSemVer(1L, 2L, 3L)
'1.0.0' || new CoderSemVer(1L, 0L, 0L)
'2.0.0' || new CoderSemVer(2L, 0L, 0L)
'1.1.7' || new CoderSemVer(1L, 1L, 7L)
'2.0.0+build.1848' || new CoderSemVer(2L, 0L, 0L)
'2.0.1-alpha.1227' || new CoderSemVer(2L, 0L, 1L)
'1.0.0-alpha+beta' || new CoderSemVer(1L, 0L, 0L)
'1.2.3----RC-SNAPSHOT.12.9.1--.12+788' || new CoderSemVer(1L, 2L, 3L)
'1.2.3----R-S.12.9.1--.12+meta' || new CoderSemVer(1L, 2L, 3L)
'1.2.3----RC-SNAPSHOT.12.9.1--.12' || new CoderSemVer(1L, 2L, 3L)
'1.0.0+0.build.1-rc.10000aaa-kk-0.1' || new CoderSemVer(1L, 0L, 0L)
'2147483647.2147483647.2147483647' || new CoderSemVer(2147483647L, 2147483647L, 2147483647L)
'1.0.0-0A.is.legal' || new CoderSemVer(1L, 0L, 0L)
}

def 'semver like versions that start with a `v` are considered valid'() {
Expand Down Expand Up @@ -123,54 +125,58 @@ class CoderSemVerTest extends spock.lang.Specification {

where:
semver || expectedCoderSemVer
'v0.0.4' || new CoderSemVer(0L, 0L)
'v1.2.3' || new CoderSemVer(1L, 2L)
'v10.20.30' || new CoderSemVer(10L, 20L)
'v1.1.2-prerelease+meta' || new CoderSemVer(1L, 1L)
'v1.1.2+meta' || new CoderSemVer(1L, 1L)
'v1.1.2+meta-valid' || new CoderSemVer(1L, 1L)
'v1.0.0-alpha' || new CoderSemVer(1L, 0L)
'v1.0.0-beta' || new CoderSemVer(1L, 0L)
'v1.0.0-alpha.beta' || new CoderSemVer(1L, 0L)
'v1.0.0-alpha.beta.1' || new CoderSemVer(1L, 0L)
'v1.0.0-alpha.1' || new CoderSemVer(1L, 0L)
'v1.0.0-alpha0.valid' || new CoderSemVer(1L, 0L)
'v1.0.0-alpha.0valid' || new CoderSemVer(1L, 0L)
'v1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay' || new CoderSemVer(1L, 0L)
'v1.0.0-rc.1+build.1' || new CoderSemVer(1L, 0L)
'v2.0.0-rc.1+build.123' || new CoderSemVer(2L, 0L)
'v1.2.3-beta' || new CoderSemVer(1L, 2L)
'v10.2.3-DEV-SNAPSHOT' || new CoderSemVer(10L, 2L)
'v1.2.3-SNAPSHOT-123' || new CoderSemVer(1L, 2L)
'v1.0.0' || new CoderSemVer(1L, 0L)
'v2.0.0' || new CoderSemVer(2L, 0L)
'v1.1.7' || new CoderSemVer(1L, 1L)
'v2.0.0+build.1848' || new CoderSemVer(2L, 0L)
'v2.0.1-alpha.1227' || new CoderSemVer(2L, 0L)
'v1.0.0-alpha+beta' || new CoderSemVer(1L, 0L)
'v1.2.3----RC-SNAPSHOT.12.9.1--.12+788' || new CoderSemVer(1L, 2L)
'v1.2.3----R-S.12.9.1--.12+meta' || new CoderSemVer(1L, 2L)
'v1.2.3----RC-SNAPSHOT.12.9.1--.12' || new CoderSemVer(1L, 2L)
'v1.0.0+0.build.1-rc.10000aaa-kk-0.1' || new CoderSemVer(1L, 0L)
'v2147483647.2147483647.2147483647' || new CoderSemVer(2147483647L, 2147483647L)
'v1.0.0-0A.is.legal' || new CoderSemVer(1L, 0L)
'v0.0.4' || new CoderSemVer(0L, 0L, 4L)
'v1.2.3' || new CoderSemVer(1L, 2L, 3L)
'v10.20.30' || new CoderSemVer(10L, 20L, 30L)
'v1.1.2-prerelease+meta' || new CoderSemVer(1L, 1L, 2L)
'v1.1.2+meta' || new CoderSemVer(1L, 1L, 2L)
'v1.1.2+meta-valid' || new CoderSemVer(1L, 1L, 2L)
'v1.0.0-alpha' || new CoderSemVer(1L, 0L, 0L)
'v1.0.0-beta' || new CoderSemVer(1L, 0L, 0L)
'v1.0.0-alpha.beta' || new CoderSemVer(1L, 0L, 0L)
'v1.0.0-alpha.beta.1' || new CoderSemVer(1L, 0L, 0L)
'v1.0.0-alpha.1' || new CoderSemVer(1L, 0L, 0L)
'v1.0.0-alpha0.valid' || new CoderSemVer(1L, 0L, 0L)
'v1.0.0-alpha.0valid' || new CoderSemVer(1L, 0L, 0L)
'v1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay' || new CoderSemVer(1L, 0L, 0L)
'v1.0.0-rc.1+build.1' || new CoderSemVer(1L, 0L, 0L)
'v2.0.0-rc.1+build.123' || new CoderSemVer(2L, 0L, 0L)
'v1.2.3-beta' || new CoderSemVer(1L, 2L, 3L)
'v10.2.3-DEV-SNAPSHOT' || new CoderSemVer(10L, 2L, 3L)
'v1.2.3-SNAPSHOT-123' || new CoderSemVer(1L, 2L, 3L)
'v1.0.0' || new CoderSemVer(1L, 0L, 0L)
'v2.0.0' || new CoderSemVer(2L, 0L, 0L)
'v1.1.7' || new CoderSemVer(1L, 1L, 7L)
'v2.0.0+build.1848' || new CoderSemVer(2L, 0L, 0L)
'v2.0.1-alpha.1227' || new CoderSemVer(2L, 0L, 1L)
'v1.0.0-alpha+beta' || new CoderSemVer(1L, 0L, 0L)
'v1.2.3----RC-SNAPSHOT.12.9.1--.12+788' || new CoderSemVer(1L, 2L, 3L)
'v1.2.3----R-S.12.9.1--.12+meta' || new CoderSemVer(1L, 2L, 3L)
'v1.2.3----RC-SNAPSHOT.12.9.1--.12' || new CoderSemVer(1L, 2L, 3L)
'v1.0.0+0.build.1-rc.10000aaa-kk-0.1' || new CoderSemVer(1L, 0L, 0L)
'v2147483647.2147483647.2147483647' || new CoderSemVer(2147483647L, 2147483647L, 2147483647L)
'v1.0.0-0A.is.legal' || new CoderSemVer(1L, 0L, 0L)
}

@Ignore
def 'two initial development versions are compatible when first minor is equal to the second minor'() {
expect:
new CoderSemVer(0, 1).isCompatibleWith(new CoderSemVer(0, 1))
}

@Ignore
def 'two initial development versions are not compatible when first minor is less than the second minor'() {
expect:
!new CoderSemVer(0, 1).isCompatibleWith(new CoderSemVer(0, 2))
}

@Ignore
def 'two initial development versions are not compatible when first minor is bigger than the second minor'() {
expect:
!new CoderSemVer(0, 2).isCompatibleWith(new CoderSemVer(0, 1))
}

@Ignore
def 'versions are not compatible when one version is initial phase of development and the other is not, even though the minor is the same'() {
expect:
!new CoderSemVer(0, 2).isCompatibleWith(new CoderSemVer(1, 2))
Expand All @@ -179,6 +185,7 @@ class CoderSemVerTest extends spock.lang.Specification {
!new CoderSemVer(1, 2).isCompatibleWith(new CoderSemVer(0, 2))
}

@Ignore
def 'two versions which are not in development phase are compatible when first major is less or equal to the other, regardless of the minor'() {
expect: 'versions compatible when same major and same minor'
new CoderSemVer(1, 1).isCompatibleWith(new CoderSemVer(1, 1))
Expand All @@ -193,6 +200,7 @@ class CoderSemVerTest extends spock.lang.Specification {
new CoderSemVer(1, 1).isCompatibleWith(new CoderSemVer(2, 2))
}

@Ignore
def 'two versions which are not in development phase are not compatible when first major is greater than the second major, regardless of the minor'() {
expect: 'versions are not compatible when first major is bigger than the second but with same minor'
!new CoderSemVer(2, 1).isCompatibleWith(new CoderSemVer(1, 1))
Expand Down