Skip to content

Commit 115c0ce

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

File tree

8 files changed

+320
-70
lines changed

8 files changed

+320
-70
lines changed

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/2108[#2108] [diagrams] Leverage the latest change of the selection dialog to allow creating an actor without specializing an existing element.
3334

3435
=== New features
3536

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

Lines changed: 104 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;
@@ -525,6 +527,18 @@ public void createNewActorWithFeatureTypingInUseCaseUsage() {
525527
this.createActorWithFeatureTypingInCaseUsage(SysmlPackage.eINSTANCE.getUseCaseUsage(), GeneralViewWithTopNodesTestProjectData.SemanticIds.USE_CASE_USAGE_ID, USE_CASE);
526528
}
527529

530+
@GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH })
531+
@Test
532+
public void createNewActorWithoutSpecializationInCaseUsage() {
533+
this.createActorWithoutSpecializationInCaseUsage(SysmlPackage.eINSTANCE.getCaseUsage(), GeneralViewWithTopNodesTestProjectData.SemanticIds.CASE_USAGE_ID, CASE);
534+
}
535+
536+
@GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH })
537+
@Test
538+
public void createNewActorWithoutSpecializationInUseCaseUsage() {
539+
this.createActorWithoutSpecializationInCaseUsage(SysmlPackage.eINSTANCE.getUseCaseUsage(), GeneralViewWithTopNodesTestProjectData.SemanticIds.USE_CASE_USAGE_ID, USE_CASE);
540+
}
541+
528542
private void createSubjectWithSubsettingInCaseUsage(EClass caseUsageSubclass, String targetObjectId, String parentLabel) {
529543
var flux = this.givenSubscriptionToDiagram();
530544

@@ -539,7 +553,7 @@ private void createSubjectWithSubsettingInCaseUsage(EClass caseUsageSubclass, St
539553
String creationToolName = "New Subject";
540554
EReference containmentReference = SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter();
541555
List<ToolVariable> variables = new ArrayList<>();
542-
String existingPartId = "2c5fe5a5-18fe-40f4-ab66-a2d91ab7df6a";
556+
String existingPartId = GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_USAGE_ID;
543557
variables.add(new ToolVariable("selectedObject", existingPartId, ToolVariableType.OBJECT_ID));
544558

545559
Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName, variables);
@@ -672,11 +686,9 @@ private void createActorWithSubsettingInCaseUsage(EClass caseUsageSubclass, Stri
672686
EClass childEClass = SysmlPackage.eINSTANCE.getPartUsage();
673687
String creationToolName = "New Actor";
674688
EReference containmentReference = SysmlPackage.eINSTANCE.getCaseUsage_ActorParameter();
675-
List<ToolVariable> variables = new ArrayList<>();
676-
String existingPartId = "2c5fe5a5-18fe-40f4-ab66-a2d91ab7df6a";
677-
variables.add(new ToolVariable("selectedObject", existingPartId, ToolVariableType.OBJECT_ID));
689+
String existingPartId = GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_USAGE_ID;
678690

679-
Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName, variables);
691+
Runnable createNodeRunnable = this.creationTestsService.createNodeWithSelectionDialogWithSingleSelection(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName, existingPartId);
680692

681693
Consumer<Object> diagramCheck = assertRefreshedDiagramThat(newDiagram -> {
682694
var initialDiagram = diagram.get();
@@ -687,28 +699,29 @@ private void createActorWithSubsettingInCaseUsage(EClass caseUsageSubclass, Stri
687699
.check(initialDiagram, newDiagram, true);
688700
});
689701

690-
ISemanticChecker semanticChecker = (editingContext) -> {
691-
Object semanticRootObject = this.objectSearchService.getObject(editingContext, GeneralViewWithTopNodesTestProjectData.SemanticIds.PACKAGE_1_ID).orElse(null);
692-
assertThat(semanticRootObject).isInstanceOf(Element.class);
693-
Element semanticRootElement = (Element) semanticRootObject;
694-
Optional<PartUsage> optActor = EMFUtils.allContainedObjectOfType(semanticRootElement, PartUsage.class)
695-
.filter(element -> Objects.equals(element.getName(), "actor1"))
696-
.findFirst();
697-
assertThat(optActor).isPresent();
698-
var actor = optActor.get();
699-
EList<Subsetting> subjectSubsets = actor.getOwnedSubsetting();
700-
assertFalse(subjectSubsets.isEmpty());
701-
assertThat(subjectSubsets.get(0).getSubsettedFeature().getName()).isEqualTo("part");
702+
Consumer<Object> additionalCheck = referencedObject -> {
703+
assertThat(referencedObject).isInstanceOf(List.class)
704+
.asInstanceOf(type(List.class))
705+
.satisfies(actors -> {
706+
assertThat(actors).size().isEqualTo(1);
707+
assertThat(actors.getFirst())
708+
.isInstanceOf(PartUsage.class)
709+
.asInstanceOf(type(PartUsage.class))
710+
.satisfies(actor -> {
711+
EList<Subsetting> subjectSubsets = actor.getOwnedSubsetting();
712+
assertThat(subjectSubsets).isNotEmpty();
713+
assertThat(subjectSubsets.get(0).getSubsettedFeature().getName()).isEqualTo("part");
714+
});
715+
});
702716
};
703-
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass));
704-
Runnable semanticCheck2 = this.semanticCheckerService.checkEditingContext(semanticChecker);
717+
718+
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass, additionalCheck));
705719

706720
StepVerifier.create(flux)
707721
.consumeNextWith(initialDiagramContentConsumer)
708722
.then(createNodeRunnable)
709723
.consumeNextWith(diagramCheck)
710724
.then(semanticCheck)
711-
.then(semanticCheck2)
712725
.thenCancel()
713726
.verify(Duration.ofSeconds(10));
714727
}
@@ -726,11 +739,9 @@ private void createActorWithFeatureTypingInCaseUsage(EClass caseUsageSubclass, S
726739
EClass childEClass = SysmlPackage.eINSTANCE.getPartUsage();
727740
String creationToolName = "New Actor";
728741
EReference containmentReference = SysmlPackage.eINSTANCE.getCaseUsage_ActorParameter();
729-
List<ToolVariable> variables = new ArrayList<>();
730742
String existingPartDefId = GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_DEFINITION_ID;
731-
variables.add(new ToolVariable("selectedObject", existingPartDefId, ToolVariableType.OBJECT_ID));
732743

733-
Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName, variables);
744+
Runnable createNodeRunnable = this.creationTestsService.createNodeWithSelectionDialogWithSingleSelection(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName, existingPartDefId);
734745

735746
Consumer<Object> diagramCheck = assertRefreshedDiagramThat(newDiagram -> {
736747
var initialDiagram = diagram.get();
@@ -741,28 +752,83 @@ private void createActorWithFeatureTypingInCaseUsage(EClass caseUsageSubclass, S
741752
.check(initialDiagram, newDiagram, true);
742753
});
743754

744-
ISemanticChecker semanticChecker = (editingContext) -> {
745-
Object semanticRootObject = this.objectSearchService.getObject(editingContext, GeneralViewWithTopNodesTestProjectData.SemanticIds.PACKAGE_1_ID).orElse(null);
746-
assertThat(semanticRootObject).isInstanceOf(Element.class);
747-
Element semanticRootElement = (Element) semanticRootObject;
748-
Optional<PartUsage> optActor = EMFUtils.allContainedObjectOfType(semanticRootElement, PartUsage.class)
749-
.filter(element -> Objects.equals(element.getName(), "actor1"))
750-
.findFirst();
751-
assertThat(optActor).isPresent();
752-
var actor = optActor.get();
753-
EList<Type> types = actor.getType();
754-
assertFalse(types.isEmpty());
755-
assertThat(types.get(0).getName()).isEqualTo("PartDefinition");
755+
Consumer<Object> additionalCheck = referencedObject -> {
756+
assertThat(referencedObject).isInstanceOf(List.class)
757+
.asInstanceOf(type(List.class))
758+
.satisfies(actors -> {
759+
assertThat(actors).size().isEqualTo(1);
760+
assertThat(actors.getFirst())
761+
.isInstanceOf(PartUsage.class)
762+
.asInstanceOf(type(PartUsage.class))
763+
.satisfies(actor -> {
764+
EList<Type> types = actor.getType();
765+
assertThat(types).isNotEmpty();
766+
assertThat(types.get(0).getName()).isEqualTo("PartDefinition");
767+
});
768+
});
756769
};
757-
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass));
758-
Runnable semanticCheck2 = this.semanticCheckerService.checkEditingContext(semanticChecker);
770+
771+
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass, additionalCheck));
772+
773+
StepVerifier.create(flux)
774+
.consumeNextWith(initialDiagramContentConsumer)
775+
.then(createNodeRunnable)
776+
.consumeNextWith(diagramCheck)
777+
.then(semanticCheck)
778+
.thenCancel()
779+
.verify(Duration.ofSeconds(10));
780+
}
781+
782+
private void createActorWithoutSpecializationInCaseUsage(EClass caseUsageSubclass, String targetObjectId, String parentLabel) {
783+
var flux = this.givenSubscriptionToDiagram();
784+
785+
AtomicReference<Diagram> diagram = new AtomicReference<>();
786+
Consumer<Object> initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set);
787+
788+
var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID,
789+
SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID);
790+
var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider);
791+
792+
EClass childEClass = SysmlPackage.eINSTANCE.getPartUsage();
793+
String creationToolName = "New Actor";
794+
EReference containmentReference = SysmlPackage.eINSTANCE.getCaseUsage_ActorParameter();
795+
796+
Runnable createNodeRunnable = this.creationTestsService.createNodeWithSelectionDialogWithoutSelectionProvided(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName);
797+
798+
Consumer<Object> diagramCheck = assertRefreshedDiagramThat(newDiagram -> {
799+
var initialDiagram = diagram.get();
800+
int createdNodesExpectedCount = 1;
801+
new CheckDiagramElementCount(this.diagramComparator)
802+
.hasNewNodeCount(createdNodesExpectedCount)
803+
.hasNewEdgeCount(1)
804+
.check(initialDiagram, newDiagram, true);
805+
});
806+
807+
Consumer<Object> additionalCheck = referencedObject -> {
808+
assertThat(referencedObject).isInstanceOf(List.class)
809+
.asInstanceOf(type(List.class))
810+
.satisfies(actors -> {
811+
assertThat(actors).size().isEqualTo(1);
812+
assertThat(actors.getFirst())
813+
.isInstanceOf(PartUsage.class)
814+
.asInstanceOf(type(PartUsage.class))
815+
.satisfies(actor -> {
816+
assertThat(actor.getOwnedSpecialization()).allMatch(Specialization::isIsImplied);
817+
EList<Type> types = actor.getType();
818+
assertThat(types)
819+
.isNotEmpty()
820+
.allMatch(Element::isIsLibraryElement);
821+
});
822+
});
823+
};
824+
825+
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass, additionalCheck));
759826

760827
StepVerifier.create(flux)
761828
.consumeNextWith(initialDiagramContentConsumer)
762829
.then(createNodeRunnable)
763830
.consumeNextWith(diagramCheck)
764831
.then(semanticCheck)
765-
.then(semanticCheck2)
766832
.thenCancel()
767833
.verify(Duration.ofSeconds(10));
768834
}

0 commit comments

Comments
 (0)