Skip to content

Commit 339abd8

Browse files
committed
[2122] Improve subject creation tool using the latest selection dialog changes
Bug: #2122 Signed-off-by: Guillaume Coutable <guillaume.coutable@obeo.fr>
1 parent 75b6856 commit 339abd8

7 files changed

Lines changed: 352 additions & 49 deletions

File tree

CHANGELOG.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ As a result, the following GraphQL mutations have been removed `exposeRequiremen
3030

3131
=== Improvements
3232

33+
- https://github.com/eclipse-syson/syson/issues/2122[#2122] [diagrams] Leverage the latest change of the selection dialog to allow creating a subject without specialization.
3334

3435
=== New features
3536

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeAnalysisCreationTests.java

Lines changed: 98 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
package org.eclipse.syson.application.controllers.diagrams.general.view;
1414

1515
import static org.assertj.core.api.Assertions.assertThat;
16+
import static org.assertj.core.api.InstanceOfAssertFactories.type;
1617
import static org.eclipse.sirius.components.diagrams.tests.DiagramEventPayloadConsumer.assertRefreshedDiagramThat;
1718
import static org.junit.jupiter.api.Assertions.assertFalse;
1819

@@ -58,6 +59,7 @@
5859
import org.eclipse.syson.sysml.Element;
5960
import org.eclipse.syson.sysml.PartUsage;
6061
import org.eclipse.syson.sysml.ReferenceUsage;
62+
import org.eclipse.syson.sysml.Specialization;
6163
import org.eclipse.syson.sysml.Subsetting;
6264
import org.eclipse.syson.sysml.SysmlPackage;
6365
import org.eclipse.syson.sysml.Type;
@@ -82,6 +84,7 @@
8284
* @author arichard
8385
*/
8486
@Transactional
87+
@SuppressWarnings("checkstyle:MultipleStringLiterals")
8588
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
8689
public class GVSubNodeAnalysisCreationTests extends AbstractIntegrationTests {
8790

@@ -501,6 +504,18 @@ public void createNewDefinitionSubjectInUseCaseUsage() {
501504
this.createSubjectWithFeatureTypingInCaseUsage(SysmlPackage.eINSTANCE.getUseCaseUsage(), GeneralViewWithTopNodesTestProjectData.SemanticIds.USE_CASE_USAGE_ID, USE_CASE);
502505
}
503506

507+
@GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH })
508+
@Test
509+
public void createNewSubjectWithoutSpecializationInCaseUsage() {
510+
this.createSubjectWithoutSpecializationInCaseUsage(SysmlPackage.eINSTANCE.getCaseUsage(), GeneralViewWithTopNodesTestProjectData.SemanticIds.CASE_USAGE_ID, CASE);
511+
}
512+
513+
@GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH })
514+
@Test
515+
public void createNewSubjectWithoutSpecializationInUseCaseUsage() {
516+
this.createSubjectWithoutSpecializationInCaseUsage(SysmlPackage.eINSTANCE.getUseCaseUsage(), GeneralViewWithTopNodesTestProjectData.SemanticIds.USE_CASE_USAGE_ID, USE_CASE);
517+
}
518+
504519
@GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH })
505520
@Test
506521
public void createNewActorWithSubsettingInCaseUsage() {
@@ -538,11 +553,8 @@ private void createSubjectWithSubsettingInCaseUsage(EClass caseUsageSubclass, St
538553
EClass childEClass = SysmlPackage.eINSTANCE.getReferenceUsage();
539554
String creationToolName = "New Subject";
540555
EReference containmentReference = SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter();
541-
List<ToolVariable> variables = new ArrayList<>();
542-
String existingPartId = "2c5fe5a5-18fe-40f4-ab66-a2d91ab7df6a";
543-
variables.add(new ToolVariable("selectedObject", existingPartId, ToolVariableType.OBJECT_ID));
544556

545-
Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName, variables);
557+
Runnable createNodeRunnable = this.creationTestsService.createNodeWithSelectionDialogWithSingleSelection(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName, GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_USAGE_ID);
546558

547559
Consumer<Object> diagramCheck = assertRefreshedDiagramThat(newDiagram -> {
548560
var initialDiagram = diagram.get();
@@ -566,28 +578,24 @@ private void createSubjectWithSubsettingInCaseUsage(EClass caseUsageSubclass, St
566578
.check(initialDiagram, newDiagram);
567579
});
568580

569-
ISemanticChecker semanticChecker = (editingContext) -> {
570-
Object semanticRootObject = this.objectSearchService.getObject(editingContext, GeneralViewWithTopNodesTestProjectData.SemanticIds.PACKAGE_1_ID).orElse(null);
571-
assertThat(semanticRootObject).isInstanceOf(Element.class);
572-
Element semanticRootElement = (Element) semanticRootObject;
573-
Optional<ReferenceUsage> optParentElement = EMFUtils.allContainedObjectOfType(semanticRootElement, ReferenceUsage.class)
574-
.filter(element -> Objects.equals(element.getName(), "subject"))
575-
.findFirst();
576-
assertThat(optParentElement).isPresent();
577-
var referenceUsage = optParentElement.get();
578-
EList<Subsetting> subjectSubsets = referenceUsage.getOwnedSubsetting();
579-
assertFalse(subjectSubsets.isEmpty());
580-
assertThat(subjectSubsets.get(0).getSubsettedFeature().getName()).isEqualTo("part");
581+
Consumer<Object> additionalCheck = referencedObject -> {
582+
assertThat(referencedObject)
583+
.isInstanceOf(ReferenceUsage.class)
584+
.asInstanceOf(type(ReferenceUsage.class))
585+
.satisfies(referenceUsage -> {
586+
EList<Subsetting> subjectSubsets = referenceUsage.getOwnedSubsetting();
587+
assertThat(subjectSubsets).isNotEmpty();
588+
assertThat(subjectSubsets.get(0).getSubsettedFeature().getName()).isEqualTo("part");
589+
});
581590
};
582-
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass));
583-
Runnable semanticCheck2 = this.semanticCheckerService.checkEditingContext(semanticChecker);
591+
592+
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass, additionalCheck));
584593

585594
StepVerifier.create(flux)
586595
.consumeNextWith(initialDiagramContentConsumer)
587596
.then(createNodeRunnable)
588597
.consumeNextWith(diagramCheck)
589598
.then(semanticCheck)
590-
.then(semanticCheck2)
591599
.thenCancel()
592600
.verify(Duration.ofSeconds(10));
593601
}
@@ -605,11 +613,8 @@ private void createSubjectWithFeatureTypingInCaseUsage(EClass caseUsageSubclass,
605613
EClass childEClass = SysmlPackage.eINSTANCE.getReferenceUsage();
606614
String creationToolName = "New Subject";
607615
EReference containmentReference = SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter();
608-
List<ToolVariable> variables = new ArrayList<>();
609-
String existingPartDefId = GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_DEFINITION_ID;
610-
variables.add(new ToolVariable("selectedObject", existingPartDefId, ToolVariableType.OBJECT_ID));
611616

612-
Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName, variables);
617+
Runnable createNodeRunnable = this.creationTestsService.createNodeWithSelectionDialogWithSingleSelection(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName, GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_DEFINITION_ID);
613618

614619
Consumer<Object> diagramCheck = assertRefreshedDiagramThat(newDiagram -> {
615620
var initialDiagram = diagram.get();
@@ -633,28 +638,83 @@ private void createSubjectWithFeatureTypingInCaseUsage(EClass caseUsageSubclass,
633638
.check(initialDiagram, newDiagram);
634639
});
635640

636-
ISemanticChecker semanticChecker = (editingContext) -> {
637-
Object semanticRootObject = this.objectSearchService.getObject(editingContext, GeneralViewWithTopNodesTestProjectData.SemanticIds.PACKAGE_1_ID).orElse(null);
638-
assertThat(semanticRootObject).isInstanceOf(Element.class);
639-
Element semanticRootElement = (Element) semanticRootObject;
640-
Optional<ReferenceUsage> optParentElement = EMFUtils.allContainedObjectOfType(semanticRootElement, ReferenceUsage.class)
641-
.filter(element -> Objects.equals(element.getName(), "subject"))
642-
.findFirst();
643-
assertThat(optParentElement).isPresent();
644-
var referenceUsage = optParentElement.get();
645-
EList<Type> types = referenceUsage.getType();
646-
assertFalse(types.isEmpty());
647-
assertThat(types.get(0).getName()).isEqualTo("PartDefinition");
641+
Consumer<Object> additionalCheck = referencedObject -> {
642+
assertThat(referencedObject)
643+
.isInstanceOf(ReferenceUsage.class)
644+
.asInstanceOf(type(ReferenceUsage.class))
645+
.satisfies(referenceUsage -> {
646+
EList<Type> types = referenceUsage.getType();
647+
assertThat(types).isNotEmpty();
648+
assertThat(types.get(0).getName()).isEqualTo("PartDefinition");
649+
});
648650
};
649-
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass));
650-
Runnable semanticCheck2 = this.semanticCheckerService.checkEditingContext(semanticChecker);
651+
652+
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass, additionalCheck));
653+
654+
StepVerifier.create(flux)
655+
.consumeNextWith(initialDiagramContentConsumer)
656+
.then(createNodeRunnable)
657+
.consumeNextWith(diagramCheck)
658+
.then(semanticCheck)
659+
.thenCancel()
660+
.verify(Duration.ofSeconds(10));
661+
}
662+
663+
private void createSubjectWithoutSpecializationInCaseUsage(EClass caseUsageSubclass, String targetObjectId, String parentLabel) {
664+
var flux = this.givenSubscriptionToDiagram();
665+
666+
AtomicReference<Diagram> diagram = new AtomicReference<>();
667+
Consumer<Object> initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set);
668+
669+
var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID,
670+
SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID);
671+
var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider);
672+
673+
EClass childEClass = SysmlPackage.eINSTANCE.getReferenceUsage();
674+
String creationToolName = "New Subject";
675+
EReference containmentReference = SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter();
676+
677+
Runnable createNodeRunnable = this.creationTestsService.createNodeWithSelectionDialogWithoutSelectionProvided(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName);
678+
679+
Consumer<Object> diagramCheck = assertRefreshedDiagramThat(newDiagram -> {
680+
var initialDiagram = diagram.get();
681+
int createdNodesExpectedCount = 2;
682+
new CheckDiagramElementCount(this.diagramComparator)
683+
.hasNewNodeCount(createdNodesExpectedCount)
684+
.hasNewEdgeCount(1)
685+
.check(initialDiagram, newDiagram);
686+
// Only the node inside the compartment is visible
687+
// The "sibling" node is hidden
688+
new CheckDiagramElementCount(this.diagramComparator)
689+
.hasNewNodeCount(1)
690+
.hasNewEdgeCount(0)
691+
.check(initialDiagram, newDiagram, true);
692+
String listNodeDescription = this.descriptionNameGenerator.getCompartmentItemName(SysmlPackage.eINSTANCE.getCaseUsage(), containmentReference);
693+
new CheckNodeInCompartment(diagramDescriptionIdProvider, this.diagramComparator)
694+
.withTargetObjectId(targetObjectId)
695+
.withCompartmentName("subject")
696+
.hasNodeDescriptionName(listNodeDescription)
697+
.hasCompartmentCount(0)
698+
.check(initialDiagram, newDiagram);
699+
});
700+
701+
Consumer<Object> additionalCheck = referencedObject -> {
702+
assertThat(referencedObject)
703+
.isInstanceOf(ReferenceUsage.class)
704+
.asInstanceOf(type(ReferenceUsage.class))
705+
.satisfies(referenceUsage -> {
706+
assertThat(referenceUsage.getOwnedSpecialization()).allMatch(Specialization::isIsImplied);
707+
assertThat(referenceUsage.getType()).isEmpty();
708+
});
709+
};
710+
711+
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass, additionalCheck));
651712

652713
StepVerifier.create(flux)
653714
.consumeNextWith(initialDiagramContentConsumer)
654715
.then(createNodeRunnable)
655716
.consumeNextWith(diagramCheck)
656717
.then(semanticCheck)
657-
.then(semanticCheck2)
658718
.thenCancel()
659719
.verify(Duration.ofSeconds(10));
660720
}

0 commit comments

Comments
 (0)