diff --git a/src/main/kotlin/com/coder/gateway/CoderSupportedVersions.kt b/src/main/kotlin/com/coder/gateway/CoderSupportedVersions.kt index 5fa4c928..43464325 100644 --- a/src/main/kotlin/com/coder/gateway/CoderSupportedVersions.kt +++ b/src/main/kotlin/com/coder/gateway/CoderSupportedVersions.kt @@ -9,9 +9,10 @@ import org.jetbrains.annotations.PropertyKey private const val BUNDLE = "version.CoderSupportedVersions" object CoderSupportedVersions : DynamicBundle(BUNDLE) { - val lastTestedVersion = CoderSemVer.parse(message("lastTestedCoderVersion")) + val minCompatibleCoderVersion = CoderSemVer.parse(message("minCompatibleCoderVersion")) + val maxCompatibleCoderVersion = CoderSemVer.parse(message("maxCompatibleCoderVersion")) - @Suppress("SpreadOperator") @JvmStatic + @Suppress("SpreadOperator") private fun message(@PropertyKey(resourceBundle = BUNDLE) key: String, vararg params: Any) = getMessage(key, *params) -} \ No newline at end of file +} diff --git a/src/main/kotlin/com/coder/gateway/sdk/CoderSemVer.kt b/src/main/kotlin/com/coder/gateway/sdk/CoderSemVer.kt index a7e64acc..1df22547 100644 --- a/src/main/kotlin/com/coder/gateway/sdk/CoderSemVer.kt +++ b/src/main/kotlin/com/coder/gateway/sdk/CoderSemVer.kt @@ -1,20 +1,19 @@ 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 { 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 { - // in the initial development phase minor changes when there are API incompatibilities - if (this.major == 0L) { - if (other.major > 0) return false - return this.minor == other.minor - } - return this.major <= other.major + fun isInClosedRange(start: CoderSemVer, endInclusive: CoderSemVer) = this in start..endInclusive + + + override fun toString(): String { + return "CoderSemVer(major=$major, minor=$minor)" } override fun equals(other: Any?): Boolean { @@ -25,6 +24,7 @@ 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 } @@ -32,13 +32,20 @@ class CoderSemVer(private val major: Long = 0, private val minor: Long = 0) { 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() @@ -52,6 +59,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, ) } } diff --git a/src/main/kotlin/com/coder/gateway/views/steps/CoderWorkspacesStepView.kt b/src/main/kotlin/com/coder/gateway/views/steps/CoderWorkspacesStepView.kt index fd6a5874..167f8f06 100644 --- a/src/main/kotlin/com/coder/gateway/views/steps/CoderWorkspacesStepView.kt +++ b/src/main/kotlin/com/coder/gateway/views/steps/CoderWorkspacesStepView.kt @@ -325,9 +325,7 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) : } } else { val coderVersion = CoderSemVer.parse(coderClient.buildVersion) - val testedCoderVersion = CoderSupportedVersions.lastTestedVersion - - if (!testedCoderVersion.isCompatibleWith(coderVersion)) { + if (!coderVersion.isInClosedRange(CoderSupportedVersions.minCompatibleCoderVersion, CoderSupportedVersions.maxCompatibleCoderVersion)) { notificationBanner.apply { component.isVisible = true showWarning(CoderGatewayBundle.message("gateway.connector.view.coder.workspaces.unsupported.coder.version", coderClient.buildVersion)) diff --git a/src/main/resources/version/CoderSupportedVersions.properties b/src/main/resources/version/CoderSupportedVersions.properties index 9c25eeda..12ba1ee3 100644 --- a/src/main/resources/version/CoderSupportedVersions.properties +++ b/src/main/resources/version/CoderSupportedVersions.properties @@ -1 +1,2 @@ -lastTestedCoderVersion=0.13.0 +minCompatibleCoderVersion=0.12.9 +maxCompatibleCoderVersion=0.13.1 diff --git a/src/test/groovy/CoderSemVerTest.groovy b/src/test/groovy/CoderSemVerTest.groovy index 1cf62366..e20dbec1 100644 --- a/src/test/groovy/CoderSemVerTest.groovy +++ b/src/test/groovy/CoderSemVerTest.groovy @@ -1,8 +1,11 @@ package com.coder.gateway.sdk +import spock.lang.Unroll + +@Unroll class CoderSemVerTest extends spock.lang.Specification { - def 'semver versions are valid'() { + def "#semver is valid"() { expect: CoderSemVer.isValidVersion(semver) @@ -40,46 +43,46 @@ class CoderSemVerTest extends spock.lang.Specification { '1.0.0-0A.is.legal'] } - def 'semver versions are parsed and correct major and minor values are extracted'() { + def "#semver version is parsed and correct major, minor and patch values are extracted"() { expect: CoderSemVer.parse(semver) == expectedCoderSemVer 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'() { + def "#semver is considered valid even when it starts with `v`"() { expect: CoderSemVer.isValidVersion(semver) @@ -117,90 +120,162 @@ class CoderSemVerTest extends spock.lang.Specification { 'v1.0.0-0A.is.legal'] } - def 'semver like versions that start with a `v` are parsed and correct major and minor values are extracted'() { + def "#semver is parsed and correct major, minor and patch values are extracted even though the version starts with a `v`"() { expect: CoderSemVer.parse(semver) == expectedCoderSemVer 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) } - def 'two initial development versions are compatible when first minor is equal to the second minor'() { + def "#firstVersion is > than #secondVersion"() { expect: - new CoderSemVer(0, 1).isCompatibleWith(new CoderSemVer(0, 1)) + firstVersion <=> secondVersion == 1 + + where: + firstVersion | secondVersion + new CoderSemVer(1, 0, 0) | new CoderSemVer(0, 0, 0) + new CoderSemVer(1, 0, 0) | new CoderSemVer(0, 0, 1) + new CoderSemVer(1, 0, 0) | new CoderSemVer(0, 1, 0) + new CoderSemVer(1, 0, 0) | new CoderSemVer(0, 1, 1) + + new CoderSemVer(2, 0, 0) | new CoderSemVer(1, 0, 0) + new CoderSemVer(2, 0, 0) | new CoderSemVer(1, 3, 0) + new CoderSemVer(2, 0, 0) | new CoderSemVer(1, 0, 3) + new CoderSemVer(2, 0, 0) | new CoderSemVer(1, 3, 3) + + + new CoderSemVer(0, 1, 0) | new CoderSemVer(0, 0, 1) + new CoderSemVer(0, 2, 0) | new CoderSemVer(0, 1, 0) + new CoderSemVer(0, 2, 0) | new CoderSemVer(0, 1, 2) + + new CoderSemVer(0, 0, 2) | new CoderSemVer(0, 0, 1) } - def 'two initial development versions are not compatible when first minor is less than the second minor'() { + def "#firstVersion is == #secondVersion"() { expect: - !new CoderSemVer(0, 1).isCompatibleWith(new CoderSemVer(0, 2)) + firstVersion <=> secondVersion == 0 + + where: + firstVersion | secondVersion + new CoderSemVer(0, 0, 0) | new CoderSemVer(0, 0, 0) + new CoderSemVer(1, 0, 0) | new CoderSemVer(1, 0, 0) + new CoderSemVer(1, 1, 0) | new CoderSemVer(1, 1, 0) + new CoderSemVer(1, 1, 1) | new CoderSemVer(1, 1, 1) + new CoderSemVer(0, 1, 0) | new CoderSemVer(0, 1, 0) + new CoderSemVer(0, 1, 1) | new CoderSemVer(0, 1, 1) + new CoderSemVer(0, 0, 1) | new CoderSemVer(0, 0, 1) + } - def 'two initial development versions are not compatible when first minor is bigger than the second minor'() { + def "#firstVersion is < than #secondVersion"() { expect: - !new CoderSemVer(0, 2).isCompatibleWith(new CoderSemVer(0, 1)) + firstVersion <=> secondVersion == -1 + + where: + firstVersion | secondVersion + new CoderSemVer(0, 0, 0) | new CoderSemVer(1, 0, 0) + new CoderSemVer(0, 0, 1) | new CoderSemVer(1, 0, 0) + new CoderSemVer(0, 1, 0) | new CoderSemVer(1, 0, 0) + new CoderSemVer(0, 1, 1) | new CoderSemVer(1, 0, 0) + + new CoderSemVer(1, 0, 0) | new CoderSemVer(2, 0, 0) + new CoderSemVer(1, 3, 0) | new CoderSemVer(2, 0, 0) + new CoderSemVer(1, 0, 3) | new CoderSemVer(2, 0, 0) + new CoderSemVer(1, 3, 3) | new CoderSemVer(2, 0, 0) + + + new CoderSemVer(0, 0, 1) | new CoderSemVer(0, 1, 0) + new CoderSemVer(0, 1, 0) | new CoderSemVer(0, 2, 0) + new CoderSemVer(0, 1, 2) | new CoderSemVer(0, 2, 0) + + new CoderSemVer(0, 0, 1) | new CoderSemVer(0, 0, 2) } - 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'() { + def 'in closed range comparison returns true when the version is equal to the left side of the range'() { expect: - !new CoderSemVer(0, 2).isCompatibleWith(new CoderSemVer(1, 2)) + new CoderSemVer(1, 2, 3).isInClosedRange(new CoderSemVer(1, 2, 3), new CoderSemVer(7, 8, 9)) + } - and: - !new CoderSemVer(1, 2).isCompatibleWith(new CoderSemVer(0, 2)) + def 'in closed range comparison returns true when the version is equal to the right side of the range'() { + expect: + new CoderSemVer(7, 8, 9).isInClosedRange(new CoderSemVer(1, 2, 3), new CoderSemVer(7, 8, 9)) } - 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)) + def "in closed range comparison returns false when #buildVersion is lower than the left side of the range"() { + expect: + buildVersion.isInClosedRange(new CoderSemVer(1, 2, 3), new CoderSemVer(7, 8, 9)) == false - and: 'they are also compatible when major is the same but minor is different' - new CoderSemVer(1, 1).isCompatibleWith(new CoderSemVer(1, 2)) + where: + buildVersion << [ + new CoderSemVer(0, 0, 0), + new CoderSemVer(0, 0, 1), + new CoderSemVer(0, 1, 0), + new CoderSemVer(1, 0, 0), + new CoderSemVer(0, 1, 1), + new CoderSemVer(1, 1, 1), + new CoderSemVer(1, 2, 1), + new CoderSemVer(0, 2, 3), + ] + } - and: 'they are also compatible when first major is less than the second major but with same minor' - new CoderSemVer(1, 1).isCompatibleWith(new CoderSemVer(2, 1)) + def "in closed range comparison returns false when #buildVersion is higher than the right side of the range"() { + expect: + buildVersion.isInClosedRange(new CoderSemVer(1, 2, 3), new CoderSemVer(7, 8, 9)) == false - and: 'they are also compatible when first major is less than the second major and also with a different minor' - new CoderSemVer(1, 1).isCompatibleWith(new CoderSemVer(2, 2)) + where: + buildVersion << [ + new CoderSemVer(7, 8, 10), + new CoderSemVer(7, 9, 0), + new CoderSemVer(8, 0, 0), + new CoderSemVer(8, 8, 9), + ] } - 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)) + def "in closed range comparison returns true when #buildVersion is higher than the left side of the range but lower then the right side"() { + expect: + buildVersion.isInClosedRange(new CoderSemVer(1, 2, 3), new CoderSemVer(7, 8, 9)) == true - and: 'they are also not compatible when minor first minor is less than the second minor' - !new CoderSemVer(2, 1).isCompatibleWith(new CoderSemVer(1, 2)) + where: + buildVersion << [ + new CoderSemVer(1, 2, 4), + new CoderSemVer(1, 3, 0), + new CoderSemVer(2, 0, 0), + new CoderSemVer(7, 8, 8), + new CoderSemVer(7, 7, 10), + new CoderSemVer(6, 9, 10), - and: 'also also not compatible when minor first minor is bigger than the second minor' - !new CoderSemVer(2, 3).isCompatibleWith(new CoderSemVer(1, 2)) + ] } }