diff --git a/kpi-calculator/core/build.gradle.kts b/kpi-calculator/core/build.gradle.kts index f18ba4f7e24fdc7c3c468adc50a7f4e6232b7f86..aa309758015e5c0f3f21289ba6b79ea6f865075f 100644 --- a/kpi-calculator/core/build.gradle.kts +++ b/kpi-calculator/core/build.gradle.kts @@ -10,6 +10,7 @@ repositories { } dependencies { + implementation(project(":model")) testImplementation(libs.kotlin.test) } diff --git a/kpi-calculator/model/src/main/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/KpiKind.kt b/kpi-calculator/model/src/main/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/KpiId.kt similarity index 96% rename from kpi-calculator/model/src/main/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/KpiKind.kt rename to kpi-calculator/model/src/main/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/KpiId.kt index 6b8eb5fdb927aeee14132a56609dfac745b53b83..b9b60a9f9a2cce5b2f043204f8512261fd1c27bf 100644 --- a/kpi-calculator/model/src/main/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/KpiKind.kt +++ b/kpi-calculator/model/src/main/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/KpiId.kt @@ -1,7 +1,7 @@ package de.fraunhofer.iem.kpiCalculator.model.kpi -enum class KpiKind { +enum class KpiId { // Raw Value KPIs CHECKED_IN_BINARIES, NUMBER_OF_COMMITS, diff --git a/kpi-calculator/model/src/main/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/KpiStrategyId.kt b/kpi-calculator/model/src/main/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/KpiStrategyId.kt new file mode 100644 index 0000000000000000000000000000000000000000..270a4308f574a68f82bf4c408397d76ed1055122 --- /dev/null +++ b/kpi-calculator/model/src/main/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/KpiStrategyId.kt @@ -0,0 +1,8 @@ +package de.fraunhofer.iem.kpiCalculator.model.kpi + +enum class KpiStrategyId { + RAW_VALUE_STRATEGY, + AGGREGATION_STRATEGY, + MAXIMUM_STRATEGY, + RATIO_STRATEGY, +} diff --git a/kpi-calculator/model/src/main/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/hierarchy/KpiHierarchy.kt b/kpi-calculator/model/src/main/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/hierarchy/KpiHierarchy.kt new file mode 100644 index 0000000000000000000000000000000000000000..a7ce187e48f2f3b17215c22fe64a1b9081f32cb8 --- /dev/null +++ b/kpi-calculator/model/src/main/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/hierarchy/KpiHierarchy.kt @@ -0,0 +1,22 @@ +package de.fraunhofer.iem.kpiCalculator.model.kpi.hierarchy + +import de.fraunhofer.iem.kpiCalculator.model.kpi.KpiId +import de.fraunhofer.iem.kpiCalculator.model.kpi.KpiStrategyId +import kotlinx.serialization.Serializable + +val SCHEMA_VERSIONS: Array<String> = arrayOf( + "1.0.0" +).sortedArray() + +@Serializable +data class KpiHierarchy private constructor(val rootNode: KpiNode, val schemaVersion: String) { + companion object { + fun create(rootNode: KpiNode) = KpiHierarchy(rootNode, SCHEMA_VERSIONS.last()) + } +} + +@Serializable +data class KpiNode(val kpiId: KpiId, val strategyType: KpiStrategyId, val children: List<KpiEdge>) + +@Serializable +data class KpiEdge(val target: KpiNode, val weight: Double) diff --git a/kpi-calculator/model/src/test/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/hierarchy/KpiNodeTest.kt b/kpi-calculator/model/src/test/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/hierarchy/KpiNodeTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..c28725144f200d2ec25cc09f54ff52e03ca67fe0 --- /dev/null +++ b/kpi-calculator/model/src/test/kotlin/de/fraunhofer/iem/kpiCalculator/model/kpi/hierarchy/KpiNodeTest.kt @@ -0,0 +1,46 @@ +package de.fraunhofer.iem.kpiCalculator.model.kpi.hierarchy + +import de.fraunhofer.iem.kpiCalculator.model.kpi.KpiId +import de.fraunhofer.iem.kpiCalculator.model.kpi.KpiStrategyId +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertDoesNotThrow +import kotlin.test.assertEquals + +class KpiNodeTest { + @Test + fun constructHierarchy() { + // This test doesn't really test any functionality. It's mainly here as a reminder to fail whenever we change something + // related to our external data model (the KpiHierarchy), as this is what the library users store and use to call the + // library with. + // TLDR; Whenever this test fails we have a breaking change in how we construct our KPI hierarchy meaning we potentially + // break our clients code. + assertDoesNotThrow { + val childNodes = listOf( + KpiEdge( + KpiNode(kpiId = KpiId.SECURITY, KpiStrategyId.AGGREGATION_STRATEGY, listOf()), + weight = 0.3 + ), + KpiEdge( + KpiNode(kpiId = KpiId.PROCESS_COMPLIANCE, KpiStrategyId.AGGREGATION_STRATEGY, listOf()), + weight = 0.3 + ), + KpiEdge( + KpiNode(kpiId = KpiId.INTERNAL_QUALITY, KpiStrategyId.AGGREGATION_STRATEGY, listOf()), + weight = 0.3 + ), + ) + val root = KpiNode(kpiId = KpiId.ROOT, strategyType = KpiStrategyId.AGGREGATION_STRATEGY, childNodes) + val hierarchy = KpiHierarchy.create(root) + + val json = Json { + prettyPrint = true + } + val jsonResult = json.encodeToString(hierarchy) + + println(jsonResult) + assertEquals(hierarchy.schemaVersion, "1.0.0") + } + } +}