diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt index e8ea2291..0e1724d2 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt @@ -92,7 +92,7 @@ class TestNgRunner : GenericTestRunner() { } val v = Versions.toLongVersion("6.10") - val cp = (classpath + dep).map { it.jarFile.get() } + val cp = (classpath + dep).distinct().map { it.jarFile.get() } .joinToString(File.pathSeparator) val passedArgs = listOf( "-classpath", diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Versions.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Versions.kt index f2141e4d..f915723f 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Versions.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Versions.kt @@ -2,10 +2,47 @@ package com.beust.kobalt.misc import com.beust.kobalt.maven.MavenId import com.google.common.base.CharMatcher +import java.lang.Character +import java.lang.IllegalStateException +import java.lang.Integer +import java.lang.Math +import java.lang.NumberFormatException import java.math.BigInteger import java.util.* -public class Versions { +/** + * Allow to compare string versions. + */ +class StringVersion(val version: String) { + val array = version.split('.') + + enum class Compare { LT, EQ, GT } + + fun compareTo(other: String) : Compare { + val s1 = arrayListOf().apply { addAll(version.split('.')) } + val s2 = arrayListOf().apply { addAll(other.split('.')) } + val max = Math.max(s1.size, s2.size) + val shorterList : ArrayList = if (s1.size == max) s2 else s1 + repeat(max - shorterList.size) { + shorterList.add("0") + } + + repeat(max) { index -> + try { + val v1 = Integer.parseInt(s1[index]) + val v2 = Integer.parseInt(s2[index]) + if (v1 < v2) return Compare.LT + else if (v1 > v2) return Compare.GT + } catch(ex: NumberFormatException) { + warn("Couldn't parse version $version or $other") + return Compare.LT + } + } + return Compare.EQ + } +} + +class Versions { companion object { /** * Turn "6.9.4" into 600090004 diff --git a/src/test/kotlin/com/beust/kobalt/internal/VersionTest.kt b/src/test/kotlin/com/beust/kobalt/internal/VersionTest.kt index 7a6e12b5..ab275e7f 100644 --- a/src/test/kotlin/com/beust/kobalt/internal/VersionTest.kt +++ b/src/test/kotlin/com/beust/kobalt/internal/VersionTest.kt @@ -1,10 +1,12 @@ package com.beust.kobalt.internal +import com.beust.kobalt.misc.StringVersion import com.beust.kobalt.misc.Versions import org.assertj.core.api.Assertions.assertThat import org.testng.annotations.DataProvider import org.testng.annotations.Test + /** * Make sure we parse version numbers correctly. */ @@ -22,4 +24,40 @@ class VersionTest { fun versionConversionShouldWork(version: String, expected: Long) { assertThat(Versions.toLongVersion(version)).isEqualTo(expected) } + + @DataProvider + fun versionsEqual() : Array> + = arrayOf( + arrayOf("1", "1"), + arrayOf("1.0", "1"), + arrayOf("1.0.0", "1"), + arrayOf("1.0", "1.0.0") + ) + + @Test(dataProvider = "versionsEqual") + fun versionComparisonsEqual(v1: String, v2: String) { + assertThat(StringVersion(v1).compareTo(v2)).isEqualTo(StringVersion.Compare.EQ) + assertThat(StringVersion(v2).compareTo(v1)).isEqualTo(StringVersion.Compare.EQ) + } + + @DataProvider + fun versionsNotEqual() : Array> + = arrayOf( + arrayOf("1", "1.2.3", StringVersion.Compare.LT), + arrayOf("1.2", "1.2.3", StringVersion.Compare.LT), + arrayOf("1.2.2", "1.2.3", StringVersion.Compare.LT), + arrayOf("1.2.4", "1.2.3", StringVersion.Compare.GT), + arrayOf("1", "1.2.3.4", StringVersion.Compare.LT), + arrayOf("1.2", "1.2.3.4", StringVersion.Compare.LT), + arrayOf("1.2.3", "1.2.3.4", StringVersion.Compare.LT), + arrayOf("1.2.3.3", "1.2.3.4", StringVersion.Compare.LT), + arrayOf("1.2.3.5", "1.2.3.4", StringVersion.Compare.GT) + ) + + @Test(dataProvider = "versionsNotEqual") + fun versionComparisonsNotEqual(v1: String, v2: String, expected: StringVersion.Compare) { + assertThat(StringVersion(v1).compareTo(v2)).isEqualTo(expected) + assertThat(StringVersion(v2).compareTo(v1)).isEqualTo( + if (expected == StringVersion.Compare.LT) StringVersion.Compare.GT else StringVersion.Compare.LT) + } }