1313package org .eclipse .syson .application .controllers .diagrams .general .view ;
1414
1515import static org .assertj .core .api .Assertions .assertThat ;
16+ import static org .assertj .core .api .InstanceOfAssertFactories .type ;
1617import static org .eclipse .sirius .components .diagrams .tests .DiagramEventPayloadConsumer .assertRefreshedDiagramThat ;
1718import static org .junit .jupiter .api .Assertions .assertFalse ;
1819
5859import org .eclipse .syson .sysml .Element ;
5960import org .eclipse .syson .sysml .PartUsage ;
6061import org .eclipse .syson .sysml .ReferenceUsage ;
62+ import org .eclipse .syson .sysml .Specialization ;
6163import org .eclipse .syson .sysml .Subsetting ;
6264import org .eclipse .syson .sysml .SysmlPackage ;
6365import org .eclipse .syson .sysml .Type ;
8284 * @author arichard
8385 */
8486@ Transactional
87+ @ SuppressWarnings ("checkstyle:MultipleStringLiterals" )
8588@ SpringBootTest (webEnvironment = SpringBootTest .WebEnvironment .RANDOM_PORT )
8689public 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