|
1 | 1 | package org.modelix.model.mpsadapters
|
2 | 2 |
|
3 |
| -import org.junit.Ignore |
4 | 3 | import org.modelix.model.api.BuiltinLanguages
|
5 | 4 | import org.modelix.model.api.ConceptReference
|
6 |
| -import org.modelix.model.api.INode |
7 | 5 | import org.modelix.model.api.IReplaceableNode
|
8 | 6 |
|
9 |
| -@Ignore("Replacing a node through MPS-model-adapters is broken. See MODELIX-920") |
10 | 7 | class ReplaceNodeTest : MpsAdaptersTestBase("SimpleProject") {
|
11 | 8 |
|
12 |
| - fun testReplaceNode() { |
13 |
| - readAction { |
14 |
| - assertEquals(1, mpsProject.projectModules.size) |
15 |
| - } |
| 9 | + fun `test replace node`() = runCommandOnEDT { |
| 10 | + val rootNode = getRootUnderTest() |
| 11 | + val nodeToReplace = rootNode.allChildren.first() as IReplaceableNode |
| 12 | + val oldProperties = nodeToReplace.getAllProperties().toSet() |
| 13 | + check(oldProperties.isNotEmpty()) { "Test should replace node with properties." } |
| 14 | + val oldReferences = nodeToReplace.getAllReferenceTargetRefs().toSet() |
| 15 | + check(oldReferences.isNotEmpty()) { "Test should replace node with references." } |
| 16 | + val oldChildren = nodeToReplace.allChildren.toList() |
| 17 | + check(oldChildren.isNotEmpty()) { "Test should replace node with children." } |
| 18 | + val newConcept = ConceptReference("mps:f3061a53-9226-4cc5-a443-f952ceaf5816/1083245097125") |
| 19 | + |
| 20 | + val newNode = nodeToReplace.replaceNode(newConcept) |
16 | 21 |
|
17 |
| - val repositoryNode: INode = MPSRepositoryAsNode(mpsProject.repository) |
| 22 | + assertEquals(oldProperties, newNode.getAllProperties().toSet()) |
| 23 | + assertEquals(oldReferences, newNode.getAllReferenceTargetRefs().toSet()) |
| 24 | + assertEquals(oldChildren, newNode.allChildren.toList()) |
| 25 | + assertEquals(newConcept, newNode.getConceptReference()) |
| 26 | + } |
18 | 27 |
|
19 |
| - runCommandOnEDT { |
20 |
| - val module = repositoryNode.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Repository.modules) |
21 |
| - .single { it.getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name) == "Solution1" } |
22 |
| - val model = module.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Module.models) |
23 |
| - .single { it.getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name) == "Solution1.model1" } |
| 28 | + fun `test fail to replace node without parent`() = runCommandOnEDT { |
| 29 | + val rootNode = getRootUnderTest() |
| 30 | + val oldChildren = rootNode.allChildren.toList() |
| 31 | + check(oldChildren.isNotEmpty()) { "Test should replace node with children." } |
24 | 32 |
|
25 |
| - val rootNode = model.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Model.rootNodes).single() as IReplaceableNode |
| 33 | + val newConcept = ConceptReference(BuiltinLanguages.jetbrains_mps_lang_core.BaseConcept.getUID()) |
26 | 34 |
|
27 |
| - val oldProperties = rootNode.getAllProperties().toSet() |
28 |
| - check(oldProperties.isNotEmpty()) { "Test should replace node with properties." } |
29 |
| - val oldReferences = rootNode.getAllReferenceTargetRefs().toSet() |
30 |
| - check(oldReferences.isNotEmpty()) { "Test should replace node with references." } |
31 |
| - val oldChildren = rootNode.allChildren.toList() |
32 |
| - check(oldChildren.isNotEmpty()) { "Test should replace node with children." } |
| 35 | + val expectedMessage = "Cannot replace node `Class1` because it has no parent." |
| 36 | + assertThrows(IllegalArgumentException::class.java, expectedMessage) { |
| 37 | + rootNode.replaceNode(newConcept) |
| 38 | + } |
| 39 | + // Assert that precondition is check before children are deleted. |
| 40 | + assertEquals(oldChildren, rootNode.allChildren.toList()) |
| 41 | + } |
33 | 42 |
|
34 |
| - val newConcept = ConceptReference("mps:f3061a53-9226-4cc5-a443-f952ceaf5816/1083245097125") |
35 |
| - val newNode = rootNode.replaceNode(newConcept) |
| 43 | + fun `test fail to replace node with null concept`() = runCommandOnEDT { |
| 44 | + val rootNode = getRootUnderTest() |
| 45 | + val nodeToReplace = rootNode.allChildren.first() as IReplaceableNode |
36 | 46 |
|
37 |
| - assertEquals(oldProperties, newNode.getAllProperties().toSet()) |
38 |
| - assertEquals(oldReferences, newNode.getAllReferenceTargetRefs().toSet()) |
39 |
| - assertEquals(oldChildren, newNode.allChildren.toList()) |
40 |
| - assertEquals(newConcept, newNode.getConceptReference()) |
| 47 | + val expectedMessage = "Cannot replace node `method1` with a null concept. Explicitly specify a concept (e.g., `BaseConcept`)." |
| 48 | + assertThrows(IllegalArgumentException::class.java, expectedMessage) { |
| 49 | + nodeToReplace.replaceNode(null) |
41 | 50 | }
|
42 | 51 | }
|
| 52 | + |
| 53 | + fun `test fail to replace node with non mps concept`() = runCommandOnEDT { |
| 54 | + val rootNode = getRootUnderTest() |
| 55 | + val nodeToReplace = rootNode.allChildren.first() as IReplaceableNode |
| 56 | + val newConcept = ConceptReference("notMpsConcept") |
| 57 | + |
| 58 | + val expectedMessage = "Concept UID `notMpsConcept` cannot be parsed as MPS concept." |
| 59 | + assertThrows(IllegalArgumentException::class.java, expectedMessage) { |
| 60 | + nodeToReplace.replaceNode(newConcept) |
| 61 | + } |
| 62 | + } |
| 63 | + |
| 64 | + private fun getRootUnderTest(): IReplaceableNode { |
| 65 | + val repositoryNode = MPSRepositoryAsNode(mpsProject.repository) |
| 66 | + val module = repositoryNode.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Repository.modules) |
| 67 | + .single { it.getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name) == "Solution1" } |
| 68 | + val model = module.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Module.models).single() |
| 69 | + return model.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Model.rootNodes).single() as IReplaceableNode |
| 70 | + } |
43 | 71 | }
|
0 commit comments