diff --git a/plugin/.run/Run Tests.run.xml b/plugin/.run/Run Tests.run.xml
index 85f2bcbd7..a915cbcee 100644
--- a/plugin/.run/Run Tests.run.xml
+++ b/plugin/.run/Run Tests.run.xml
@@ -11,7 +11,7 @@
@@ -22,4 +22,4 @@
false
-
+
\ No newline at end of file
diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts
index 8842b6c57..5eb65cbad 100644
--- a/plugin/build.gradle.kts
+++ b/plugin/build.gradle.kts
@@ -1,4 +1,5 @@
+import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.jetbrains.changelog.Changelog
import org.jetbrains.changelog.markdownToHTML
import task.GenerateEmissionFactorsTask30
@@ -59,6 +60,11 @@ dependencies {
testImplementation("io.mockk:mockk:1.13.4")
testImplementation(kotlin("test-junit"))
+ testRuntimeOnly("org.junit.vintage:junit-vintage-engine")
+
+ val kotestVersion = "5.7.2"
+ testImplementation("io.kotest:kotest-runner-junit5-jvm:$kotestVersion")
+ testImplementation("io.kotest:kotest-property-jvm:$kotestVersion")
}
@@ -110,6 +116,13 @@ tasks {
dependsOn("generateEmissionFactors31")
}
+ test {
+ useJUnitPlatform()
+ testLogging {
+ events = setOf(TestLogEvent.FAILED, TestLogEvent.PASSED, TestLogEvent.SKIPPED)
+ }
+ }
+
patchPluginXml {
version.set(pluginVersion)
sinceBuild.set(properties("pluginSinceBuild"))
@@ -162,7 +175,8 @@ tasks {
// pluginVersion is based on the SemVer (https://semver.org) and supports pre-release labels, like 2.1.7-alpha.3
// Specify pre-release label to publish the plugin in a custom Release Channel automatically. Read more:
// https://plugins.jetbrains.com/docs/intellij/deployment.html#specifying-a-release-channel
- channels.set(listOf(pluginVersion.split('-').getOrElse(1) { "default" }.split('.').first()))
+ val channel = listOf(pluginVersion.split('-').getOrElse(1) { "default" }.split('.').first())
+ channels.set(channel)
}
clean {
diff --git a/plugin/src/test/kotlin/ch/kleis/lcaac/plugin/ui/toolwindow/shared/QuantityRendererTest.kt b/plugin/src/test/kotlin/ch/kleis/lcaac/plugin/ui/toolwindow/shared/QuantityRendererTest.kt
index de29d6179..c418f378c 100644
--- a/plugin/src/test/kotlin/ch/kleis/lcaac/plugin/ui/toolwindow/shared/QuantityRendererTest.kt
+++ b/plugin/src/test/kotlin/ch/kleis/lcaac/plugin/ui/toolwindow/shared/QuantityRendererTest.kt
@@ -1,66 +1,40 @@
package ch.kleis.lcaac.plugin.ui.toolwindow.shared
-import org.junit.Assert
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
+import io.kotest.core.names.DuplicateTestNameMode
+import io.kotest.core.spec.style.DescribeSpec
+import io.kotest.matchers.shouldBe
+import io.kotest.matchers.string.shouldMatch
+import io.kotest.property.assume
+import io.kotest.property.checkAll
+import kotlin.math.abs
-@RunWith(Parameterized::class)
-class QuantityRendererTest(
- private val value: Double,
- private val expected: String,
-) {
- companion object {
- @Parameterized.Parameters
- @JvmStatic
- fun getDisplayedStrings(): Collection> {
- return listOf(
- arrayOf(0.0, "0"),
- arrayOf(0.0001, "1E-4"),
- arrayOf(0.001, "1E-3"),
- arrayOf(0.01, "1E-2"),
- arrayOf(0.1, "1E-1"),
- arrayOf(1.0, "1"),
- arrayOf(10.0, "1E1"),
- arrayOf(100.0, "1E2"),
- arrayOf(1000.0, "1E3"),
-
- arrayOf(0.000999, "9.99E-4"),
- arrayOf(0.00999, "9.99E-3"),
- arrayOf(0.0999, "9.99E-2"),
- arrayOf(0.999, "9.99E-1"),
- arrayOf(9.99, "9.99"),
- arrayOf(99.9, "9.99E1"),
- arrayOf(999.0, "9.99E2"),
-
- arrayOf(0.00123, "1.23E-3"),
- arrayOf(0.0123, "1.23E-2"),
- arrayOf(0.123, "1.23E-1"),
- arrayOf(1.2345, "1.23"),
- arrayOf(12.345, "1.23E1"),
- arrayOf(123.45, "1.23E2"),
- arrayOf(1234.5, "1.23E3"),
- arrayOf(12345.123, "1.23E4"),
-
- arrayOf(-0.0, "0"),
- arrayOf(-0.00123, "-1.23E-3"),
- arrayOf(-0.0123, "-1.23E-2"),
- arrayOf(-0.123, "-1.23E-1"),
- arrayOf(-1.2345, "-1.23"),
- arrayOf(-12.345, "-1.23E1"),
- arrayOf(-123.45, "-1.23E2"),
- arrayOf(-1234.5, "-1.23E3"),
- arrayOf(-12345.123, "-1.23E4"),
- )
+class QuantityRendererTest : DescribeSpec({
+ duplicateTestNameMode = DuplicateTestNameMode.Silent
+ describe("QuantityRenderer") {
+ // Properties
+ it("should use scientific notation with 3 significant digits for values not in [-10;-1[U]1;10]") {
+ val notationRegex = Regex("-?([0-9](\\.[0-9]{1,2})?(E-?[1-9][0-9]*)?|∞)")
+ checkAll { value ->
+ assume(abs(value).let { it >= 10 || it > 1})
+ QuantityRenderer.formatDouble(value) shouldMatch notationRegex
+ }
+ }
+ it("should not display an exponent part for values in [-10;-1[U]1;10]") {
+ val notationRegex = Regex("-?[0-9](\\.[0-9]{1,2})?")
+ checkAll { value ->
+ assume(abs(value).let { it < 10 && it >= 1})
+ QuantityRenderer.formatDouble(value) shouldMatch notationRegex
+ }
}
- }
- @Test
- fun run() {
- // when
- val actual = QuantityRenderer.formatDouble(value)
+ // Non-regression of corner cases found by fuzzing
+ it("should properly encode infinities") {
+ QuantityRenderer.formatDouble(Double.POSITIVE_INFINITY) shouldBe "∞"
+ QuantityRenderer.formatDouble(Double.NEGATIVE_INFINITY) shouldBe "-∞"
+ }
- // then
- Assert.assertEquals(expected, actual)
+ it("should properly deal with -0.0") {
+ QuantityRenderer.formatDouble(-0.0) shouldBe "0"
+ }
}
-}
+})
\ No newline at end of file