Skip to content

Commit fe7f8c8

Browse files
committed
test(model-sync-lib): handle unresolved refs in importer test
1 parent d5c02be commit fe7f8c8

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

model-sync-lib/src/commonTest/kotlin/org/modelix/model/sync/ModelImporterTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,13 @@ class ModelImporterTest {
135135
println("Seed for random change test: $seed")
136136
lateinit var initialState: NodeData
137137
lateinit var specification: NodeData
138-
val numChanges = 200
138+
val numChanges = 50
139139

140140
branch0.runWrite {
141141
val rootNode = branch0.getRootNode()
142142
rootNode.setPropertyValue(NodeData.idPropertyKey, rootNode.reference.serialize())
143143
val grower = RandomModelChangeGenerator(rootNode, Random(seed)).growingOperationsOnly()
144-
for (i in 1..1000) {
144+
for (i in 1..100) {
145145
grower.applyRandomChange()
146146
}
147147
initialState = rootNode.asExported()

model-sync-lib/src/commonTest/kotlin/org/modelix/model/sync/SyncTestUtil.kt

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,26 @@ fun NodeData.toJson() : String {
2828

2929
internal fun assertAllNodesConformToSpec(expectedRoot: NodeData, actualRoot: INode) {
3030
val originalIdToNode = actualRoot.getDescendants(false).associateBy { it.originalId() }
31-
assertNodeConformsToSpec(expectedRoot, actualRoot)
31+
val originalIdToSpec = buildSpecIndex(expectedRoot)
32+
assertNodeConformsToSpec(expectedRoot, actualRoot, originalIdToSpec)
3233
for (expectedChild in expectedRoot.children) {
3334
val actualChild = originalIdToNode[expectedChild.originalId()] ?: fail("expected child has no id")
34-
assertNodeConformsToSpec(expectedChild, actualChild)
35+
assertNodeConformsToSpec(expectedChild, actualChild, originalIdToSpec)
3536
}
3637
}
3738

38-
internal fun assertNodeConformsToSpec(expected: NodeData, actual: INode) {
39+
private fun buildSpecIndex(nodeData: NodeData) : Map<String, NodeData> {
40+
val map = mutableMapOf<String, NodeData>()
41+
nodeData.originalId()?.let { map[it] = nodeData}
42+
nodeData.children.forEach {
43+
map.putAll(buildSpecIndex(it))
44+
}
45+
return map
46+
}
47+
48+
internal fun assertNodeConformsToSpec(expected: NodeData, actual: INode, originalIdToSpec: Map<String, NodeData> = emptyMap()) {
3949
assertNodePropertiesConformToSpec(expected, actual)
40-
assertNodeReferencesConformToSpec(expected, actual)
50+
assertNodeReferencesConformToSpec(expected, actual, originalIdToSpec)
4151
assertNodeChildOrderConformsToSpec(expected, actual)
4252
}
4353

@@ -47,13 +57,28 @@ internal fun assertNodePropertiesConformToSpec(expected: NodeData, actual: INode
4757
assertEquals(expected.id, actualProperties[NodeData.idPropertyKey])
4858
}
4959

50-
internal fun assertNodeReferencesConformToSpec(expected: NodeData, actual: INode) {
51-
val actualReferences = actual.getReferenceRoles().associateWithNotNull {
52-
actual.getReferenceTarget(it)?.let { node ->
53-
node.getPropertyValue(NodeData.idPropertyKey) ?: node.reference.serialize()
60+
internal fun assertNodeReferencesConformToSpec(
61+
expected: NodeData,
62+
actual: INode,
63+
originalIdToSpec: Map<String, NodeData> = emptyMap()
64+
) {
65+
var numUnresolvableRefs = 0
66+
67+
val actualResolvableRefs = actual.getReferenceRoles().associateWithNotNull {
68+
val target = actual.getReferenceTarget(it)
69+
if (target == null) {
70+
numUnresolvableRefs++
71+
return@associateWithNotNull null
5472
}
73+
target.getPropertyValue(NodeData.idPropertyKey) ?: target.reference.serialize()
74+
}
75+
76+
assertEquals(expected.references.size, actualResolvableRefs.size + numUnresolvableRefs)
77+
assert(expected.references.entries.containsAll(actualResolvableRefs.entries))
78+
val unresolved = expected.references.entries.subtract(actualResolvableRefs.entries)
79+
unresolved.forEach {
80+
assert(!originalIdToSpec.containsKey(it.value)) { "node ref with target ${it.value} should have been resolved"}
5581
}
56-
assertEquals(expected.references, actualReferences)
5782
}
5883

5984
internal fun assertNodeChildOrderConformsToSpec(expected: NodeData, actual: INode) {

0 commit comments

Comments
 (0)