Skip to content

Commit 5794eff

Browse files
committed
[2108] WIP Improve actor creation tool
Bug: #2108 Signed-off-by: Guillaume Coutable <guillaume.coutable@obeo.fr>
1 parent 9cd4a60 commit 5794eff

8 files changed

Lines changed: 257 additions & 26 deletions

File tree

CHANGELOG.adoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ As a result, the following GraphQL mutations have been removed `exposeRequiremen
2828

2929
=== Improvements
3030

31+
- 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.
32+
3133
=== New features
3234

3335
- https://github.com/eclipse-syson/syson/issues/1979[#1979] [diagrams] Add tools to create timeslices and snapshots, available on `OccurrenceUsage`, `ItemUsage`, and `PartUsage` graphical nodes.

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

Lines changed: 70 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import org.eclipse.syson.sysml.Element;
5959
import org.eclipse.syson.sysml.PartUsage;
6060
import org.eclipse.syson.sysml.ReferenceUsage;
61+
import org.eclipse.syson.sysml.Specialization;
6162
import org.eclipse.syson.sysml.Subsetting;
6263
import org.eclipse.syson.sysml.SysmlPackage;
6364
import org.eclipse.syson.sysml.Type;
@@ -525,6 +526,18 @@ public void createNewActorWithFeatureTypingInUseCaseUsage() {
525526
this.createActorWithFeatureTypingInCaseUsage(SysmlPackage.eINSTANCE.getUseCaseUsage(), GeneralViewWithTopNodesTestProjectData.SemanticIds.USE_CASE_USAGE_ID, USE_CASE);
526527
}
527528

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

@@ -539,7 +552,7 @@ private void createSubjectWithSubsettingInCaseUsage(EClass caseUsageSubclass, St
539552
String creationToolName = "New Subject";
540553
EReference containmentReference = SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter();
541554
List<ToolVariable> variables = new ArrayList<>();
542-
String existingPartId = "2c5fe5a5-18fe-40f4-ab66-a2d91ab7df6a";
555+
String existingPartId = GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_USAGE_ID;
543556
variables.add(new ToolVariable("selectedObject", existingPartId, ToolVariableType.OBJECT_ID));
544557

545558
Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName, variables);
@@ -672,11 +685,9 @@ private void createActorWithSubsettingInCaseUsage(EClass caseUsageSubclass, Stri
672685
EClass childEClass = SysmlPackage.eINSTANCE.getPartUsage();
673686
String creationToolName = "New Actor";
674687
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));
688+
String existingPartId = GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_USAGE_ID;
678689

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

681692
Consumer<Object> diagramCheck = assertRefreshedDiagramThat(newDiagram -> {
682693
var initialDiagram = diagram.get();
@@ -726,11 +737,9 @@ private void createActorWithFeatureTypingInCaseUsage(EClass caseUsageSubclass, S
726737
EClass childEClass = SysmlPackage.eINSTANCE.getPartUsage();
727738
String creationToolName = "New Actor";
728739
EReference containmentReference = SysmlPackage.eINSTANCE.getCaseUsage_ActorParameter();
729-
List<ToolVariable> variables = new ArrayList<>();
730740
String existingPartDefId = GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_DEFINITION_ID;
731-
variables.add(new ToolVariable("selectedObject", existingPartDefId, ToolVariableType.OBJECT_ID));
732741

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

735744
Consumer<Object> diagramCheck = assertRefreshedDiagramThat(newDiagram -> {
736745
var initialDiagram = diagram.get();
@@ -766,4 +775,57 @@ private void createActorWithFeatureTypingInCaseUsage(EClass caseUsageSubclass, S
766775
.thenCancel()
767776
.verify(Duration.ofSeconds(10));
768777
}
778+
779+
private void createActorWithoutSpecializationInCaseUsage(EClass caseUsageSubclass, String targetObjectId, String parentLabel) {
780+
var flux = this.givenSubscriptionToDiagram();
781+
782+
AtomicReference<Diagram> diagram = new AtomicReference<>();
783+
Consumer<Object> initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set);
784+
785+
var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID,
786+
SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID);
787+
var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider);
788+
789+
EClass childEClass = SysmlPackage.eINSTANCE.getPartUsage();
790+
String creationToolName = "New Actor";
791+
EReference containmentReference = SysmlPackage.eINSTANCE.getCaseUsage_ActorParameter();
792+
793+
Runnable createNodeRunnable = this.creationTestsService.createNodeWithSelectionDialogWithoutSelectionProvided(diagramDescriptionIdProvider, diagram, caseUsageSubclass, targetObjectId, creationToolName);
794+
795+
Consumer<Object> diagramCheck = assertRefreshedDiagramThat(newDiagram -> {
796+
var initialDiagram = diagram.get();
797+
int createdNodesExpectedCount = 1;
798+
new CheckDiagramElementCount(this.diagramComparator)
799+
.hasNewNodeCount(createdNodesExpectedCount)
800+
.hasNewEdgeCount(1)
801+
.check(initialDiagram, newDiagram, true);
802+
});
803+
804+
ISemanticChecker semanticChecker = (editingContext) -> {
805+
Object semanticRootObject = this.objectSearchService.getObject(editingContext, GeneralViewWithTopNodesTestProjectData.SemanticIds.PACKAGE_1_ID).orElse(null);
806+
assertThat(semanticRootObject).isInstanceOf(Element.class);
807+
Element semanticRootElement = (Element) semanticRootObject;
808+
Optional<PartUsage> optActor = EMFUtils.allContainedObjectOfType(semanticRootElement, PartUsage.class)
809+
.filter(element -> Objects.equals(element.getName(), "actor1"))
810+
.findFirst();
811+
assertThat(optActor).isPresent();
812+
var actor = optActor.get();
813+
assertThat(actor.getOwnedSpecialization()).allMatch(Specialization::isIsImplied);
814+
EList<Type> types = actor.getType();
815+
assertThat(types)
816+
.isNotEmpty()
817+
.allMatch(Element::isIsLibraryElement);
818+
};
819+
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass));
820+
Runnable semanticCheck2 = this.semanticCheckerService.checkEditingContext(semanticChecker);
821+
822+
StepVerifier.create(flux)
823+
.consumeNextWith(initialDiagramContentConsumer)
824+
.then(createNodeRunnable)
825+
.consumeNextWith(diagramCheck)
826+
.then(semanticCheck)
827+
.then(semanticCheck2)
828+
.thenCancel()
829+
.verify(Duration.ofSeconds(10));
830+
}
769831
}

0 commit comments

Comments
 (0)