Skip to content

Commit

Permalink
Fix StabilityLevel calculation for number-less pre-versions
Browse files Browse the repository at this point in the history
Since last changes in the Version class, versions like
1.7.20-RC and 1.7.20-Beta would be marked as stable instead
of respectively ReleaseCandidate and Beta because the logic
expected a number in all cases.

The number is now optional for all pre-versions, except milestones.

To prevent future recurrence of such regression, this commit
also adds tests that assert the expected stability level of
many known versions from various libraries.

Fixes Splitties#629
  • Loading branch information
LouisCAD committed Oct 1, 2022
1 parent fe37dfa commit cb146dc
Show file tree
Hide file tree
Showing 11 changed files with 473 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ data class Version(val value: String) : Comparable<Version> {
private fun String.findStabilityLevel(fullVersion: Boolean): StabilityLevel? {
fun String.matches(
kind: String,
requireNumber: Boolean = false,
ignoreCase: Boolean = true
) = isStabilityLevelWithNumber(
) = isStabilityLevel(
stabilityLevelMarker = kind,
ignoreCase = ignoreCase,
requireNumber = requireNumber,
isFragment = fullVersion.not(),
version = this
)
Expand All @@ -30,7 +32,7 @@ data class Version(val value: String) : Comparable<Version> {
matches("alpha") -> StabilityLevel.Alpha
matches("beta") -> StabilityLevel.Beta
matches("eap") -> StabilityLevel.EarlyAccessProgram
matches("M") -> StabilityLevel.Milestone
matches("M", requireNumber = true) -> StabilityLevel.Milestone
matches("RC") -> StabilityLevel.ReleaseCandidate
isDefinitelyStable(this) -> StabilityLevel.Stable
else -> null
Expand Down Expand Up @@ -138,9 +140,10 @@ data class Version(val value: String) : Comparable<Version> {
return hasStableKeyword || digitsOnlyBasedVersionNumberRegex.matches(version)
}

private fun isStabilityLevelWithNumber(
private fun isStabilityLevel(
stabilityLevelMarker: String,
ignoreCase: Boolean = true,
requireNumber: Boolean,
isFragment: Boolean,
version: String
): Boolean = when (val indexOfStabilityLevelMarker = version.indexOf(
Expand All @@ -150,7 +153,7 @@ data class Version(val value: String) : Comparable<Version> {
-1 -> false
else -> version.getOrNull(
index = indexOfStabilityLevelMarker + stabilityLevelMarker.length
)?.let { it.isDigit() || it == '-' } ?: isFragment
)?.let { it.isDigit() || it == '-' } ?: isFragment || requireNumber.not()
}

private fun String.isRange(): Boolean {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@ package de.fayard.refreshVersions.core

import de.fayard.refreshVersions.core.internal.RefreshVersionsConfigHolder
import de.fayard.refreshVersions.core.internal.sortWith
import io.kotest.assertions.withClue
import io.kotest.matchers.collections.shouldBeSorted
import io.kotest.matchers.comparables.shouldBeGreaterThan
import io.kotest.matchers.shouldBe
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.DynamicTest
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestFactory
import testutils.junit.dynamicTest
import testutils.junit.mapDynamicTest
import java.io.File

Expand All @@ -33,6 +36,27 @@ class VersionComparatorTest {
Assertions.assertTrue(stable > rc)
}

@TestFactory
fun testStabilityLevel(): List<DynamicTest> {
val targetDir = testResources.resolve(
relative = "versions-stability-level"
)

fun checkVersions(expectedStabilityLevel: StabilityLevel) {
val fileName = "${expectedStabilityLevel.name}.txt"
val versions = readVersionsWithIntactOrder(targetDir.resolve(fileName))
for (version in versions) {
if (version.stabilityLevel == expectedStabilityLevel) continue
withClue("The stability level of version $version is wrong") {
version.stabilityLevel shouldBe expectedStabilityLevel
}
}
}
return StabilityLevel.values().map { stabilityLevel ->
dynamicTest(stabilityLevel.name) { checkVersions(stabilityLevel) }
}
}

@TestFactory
fun `test versions sorting`() = testResources.resolve(
relative = "versions-comparison"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// kotlinx.coroutines
0.19-alpha-4
1.1.0-alpha
1.2.0-alpha
1.2.0-alpha-2
14 changes: 14 additions & 0 deletions plugins/core/src/test/resources/versions-stability-level/Beta.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Kotlin
1.0.0-beta-1038
1.0.0-beta-1103
1.0.0-beta-2417
1.0.0-beta-2422
1.0.0-beta-2423
1.0.0-beta-3593
1.0.0-beta-3594
1.0.0-beta-3595
1.0.0-beta-4583
1.0.0-beta-4584
1.0.0-beta-4589
1.7.0-Beta
1.7.20-Beta
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
0.1.0-dev
0.2.0-dev1
1.0.0-dev-01
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// kotlinx.coroutines
0.24.0-eap13
0.25.0-eap13
0.25.3-eap13
0.26.0-eap13
0.26.1-eap13
0.27.0-eap13
0.30.1-eap13
0.30.2-eap13
1.1.1-eap13
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Kotlin
1.4.20-M1
1.4.20-M2
1.4.30-M1
1.5.0-M1
1.5.0-M2
1.5.20-M1
1.5.30-M1
1.6.0-M1
1.6.20-M1

// org.eclipse.jgit
3.4.0.201405051725-m7
3.6.0.201411121045-m1
4.0.0.201505050340-m2
5.0.0.201805151920-m7
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
1.0.0-preview
2.0.0-preview1
2.0.0-preview2
3.0.0-preview-01
3.0.0-preview-02
3.0.0-preview-03
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Kotlin
1.0.0-rc-1036
1.3.0-rc-190
1.3.0-rc-198
1.4.0-rc
1.4.20-RC
1.4.30-RC
1.5.0-RC
1.5.20-RC
1.5.30-RC
1.6.0-RC
1.6.0-RC2
1.6.10-RC
1.6.20-RC
1.6.20-RC2
1.7.0-RC
1.7.0-RC2
1.7.20-RC

// org.eclipse.jgit
3.4.0.201405211411-rc1
3.4.0.201405281120-rc2
3.4.0.201406041058-rc3
3.5.0.201409071800-rc1
4.0.0.201505260635-rc2
4.0.0.201506020755-rc3
4.4.0.201605250940-rc1
4.8.0.201705170830-rc1
5.0.0.201805221745-rc1
5.0.0.201805301535-rc2
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// refreshVersions
0.51.0-SNAPSHOT
Loading

0 comments on commit cb146dc

Please sign in to comment.