From 74b5a1ac5036c96e6c2aa4bd55fbfe5325ec6a12 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 12 Sep 2019 16:04:22 +0300 Subject: [PATCH] Test for node builder. Fixed bug with node content resolve by name --- .../kotlin/hep/dataforge/data/Data.kt | 13 +++++--- .../kotlin/hep/dataforge/data/DataNode.kt | 26 ++++++++++++--- .../hep/dataforge/data/DataTreeBuilderTest.kt | 32 +++++++++++++++++++ 3 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 dataforge-data/src/commonTest/kotlin/hep/dataforge/data/DataTreeBuilderTest.kt diff --git a/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/Data.kt b/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/Data.kt index fb56ff19..bd93ddfc 100644 --- a/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/Data.kt +++ b/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/Data.kt @@ -1,8 +1,6 @@ package hep.dataforge.data -import hep.dataforge.meta.EmptyMeta -import hep.dataforge.meta.Meta -import hep.dataforge.meta.MetaRepr +import hep.dataforge.meta.* import kotlinx.coroutines.CoroutineScope import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext @@ -11,7 +9,7 @@ import kotlin.reflect.KClass /** * A data element characterized by its meta */ -interface Data : Goal, MetaRepr { +interface Data : Goal, MetaRepr{ /** * Type marker for the data. The type is known before the calculation takes place so it could be checked. */ @@ -21,7 +19,12 @@ interface Data : Goal, MetaRepr { */ val meta: Meta - override fun toMeta(): Meta = meta + override fun toMeta(): Meta = buildMeta { + "type" to (type.simpleName?:"undefined") + if(!meta.isEmpty()) { + "meta" to meta + } + } companion object { const val TYPE = "data" diff --git a/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/DataNode.kt b/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/DataNode.kt index 011bbf79..4cc5aaf0 100644 --- a/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/DataNode.kt +++ b/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/DataNode.kt @@ -1,5 +1,8 @@ package hep.dataforge.data +import hep.dataforge.meta.Meta +import hep.dataforge.meta.MetaRepr +import hep.dataforge.meta.buildMeta import hep.dataforge.names.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job @@ -9,22 +12,26 @@ import kotlin.collections.component2 import kotlin.collections.set import kotlin.reflect.KClass -sealed class DataItem { +sealed class DataItem : MetaRepr { abstract val type: KClass class Node(val value: DataNode) : DataItem() { override val type: KClass get() = value.type + + override fun toMeta(): Meta = value.toMeta() } class Leaf(val value: Data) : DataItem() { override val type: KClass get() = value.type + + override fun toMeta(): Meta = value.toMeta() } } /** * A tree-like data structure grouped into the node. All data inside the node must inherit its type */ -interface DataNode { +interface DataNode: MetaRepr { /** * The minimal common ancestor to all data in the node @@ -33,6 +40,15 @@ interface DataNode { val items: Map> + override fun toMeta(): Meta = buildMeta { + "type" to (type.simpleName?:"undefined") + "items" to { + this@DataNode.items.forEach { + it.key.toString() to it.value.toMeta() + } + } + } + companion object { const val TYPE = "dataNode" @@ -68,7 +84,7 @@ fun DataNode<*>.joinAll(scope: CoroutineScope): Job = scope.launch { operator fun DataNode.get(name: Name): DataItem? = when (name.length) { 0 -> error("Empty name") - 1 -> (items[name.first()] as? DataItem.Leaf) + 1 -> items[name.first()] else -> get(name.first()!!.asName()).node?.get(name.cutFirst()) } @@ -110,7 +126,9 @@ class DataTree internal constructor( override val type: KClass, override val items: Map> ) : DataNode { - //TODO add node-level meta? + override fun toString(): String { + return super.toString() + } } private sealed class DataTreeBuilderItem { diff --git a/dataforge-data/src/commonTest/kotlin/hep/dataforge/data/DataTreeBuilderTest.kt b/dataforge-data/src/commonTest/kotlin/hep/dataforge/data/DataTreeBuilderTest.kt new file mode 100644 index 00000000..a3bb509b --- /dev/null +++ b/dataforge-data/src/commonTest/kotlin/hep/dataforge/data/DataTreeBuilderTest.kt @@ -0,0 +1,32 @@ +package hep.dataforge.data + +import kotlin.test.Test +import kotlin.test.assertTrue + + +internal class DataTreeBuilderTest{ + @Test + fun testDataUpdate(){ + val updateData = DataNode.build(Any::class){ + "update" to { + "a" to Data.static("a") + "b" to Data.static("b") + } + } + + val node = DataNode.build(Any::class){ + "primary" to { + "a" to Data.static("a") + "b" to Data.static("b") + } + "root" to Data.static("root") + update(updateData) + } + + println(node.toMeta()) + + assertTrue { node["update.a"] != null } + assertTrue { node["primary.a"] != null } + + } +} \ No newline at end of file