2121
2222package org .omg .sysml .logic ;
2323
24+ import static org .junit .Assert .assertEquals ;
2425import static org .junit .Assert .assertNull ;
26+ import static org .junit .Assert .assertSame ;
27+
28+ import java .util .List ;
2529
2630import org .junit .Test ;
31+ import org .omg .sysml .lang .sysml .AcceptActionUsage ;
2732import org .omg .sysml .lang .sysml .Feature ;
2833import org .omg .sysml .lang .sysml .FeatureDirectionKind ;
2934import org .omg .sysml .lang .sysml .ParameterMembership ;
35+ import org .omg .sysml .lang .sysml .ReferenceUsage ;
3036import org .omg .sysml .lang .sysml .SysMLFactory ;
3137import org .omg .sysml .lang .sysml .SysMLPackage ;
38+ import org .omg .sysml .lang .sysml .TransitionFeatureKind ;
39+ import org .omg .sysml .lang .sysml .TransitionFeatureMembership ;
3240import org .omg .sysml .lang .sysml .TransitionUsage ;
41+ import org .omg .sysml .lang .sysml .Type ;
42+ import org .omg .sysml .util .FeatureUtil ;
43+ import org .omg .sysml .util .TypeUtil ;
3344
3445/**
3546 * Tests transition derived-property computations.
@@ -54,4 +65,44 @@ public void transitionSourceDerivationIsReentrantSafeWithoutSuccession() {
5465 transition .getOwnedRelationship ().add (parameterMembership );
5566 assertNull (transition .getSource ());
5667 }
68+
69+ /**
70+ * A structurally equivalent feature chain already registered as an implicit
71+ * Subsetting must not be duplicated when the transition payload default
72+ * general type is computed.
73+ */
74+ @ Test
75+ public void transitionPayloadDoesNotDuplicateEquivalentImplicitSubsetting () {
76+ SysMLLogicStandaloneSetup .doSetup ();
77+ SysMLPackage .eINSTANCE .eClass ();
78+ SysMLFactory factory = SysMLFactory .eINSTANCE ;
79+ TransitionUsage transition = factory .createTransitionUsage ();
80+ addParameter (transition , factory .createReferenceUsage ());
81+ ReferenceUsage transitionPayload = factory .createReferenceUsage ();
82+ addParameter (transition , transitionPayload );
83+
84+ AcceptActionUsage trigger = factory .createAcceptActionUsage ();
85+ ReferenceUsage triggerPayload = factory .createReferenceUsage ();
86+ addParameter (trigger , triggerPayload );
87+ TransitionFeatureMembership triggerMembership = factory .createTransitionFeatureMembership ();
88+ triggerMembership .setKind (TransitionFeatureKind .TRIGGER );
89+ triggerMembership .getOwnedRelatedElement ().add (trigger );
90+ transition .getOwnedRelationship ().add (triggerMembership );
91+
92+ Feature existingChain = FeatureUtil .chainFeatures (trigger , triggerPayload );
93+ TypeUtil .addImplicitGeneralTypeTo (transitionPayload , SysMLPackage .Literals .SUBSETTING , existingChain );
94+
95+ TypeUtil .getImplicitGeneralTypesFor (transitionPayload );
96+
97+ List <Type > implicitSubsettings = TypeUtil .getImplicitGeneralTypesOnly (transitionPayload , SysMLPackage .Literals .SUBSETTING );
98+ assertEquals (1 , implicitSubsettings .size ());
99+ assertSame (existingChain , implicitSubsettings .get (0 ));
100+ }
101+
102+ private static void addParameter (Type owner , Feature parameter ) {
103+ parameter .setDirection (FeatureDirectionKind .IN );
104+ ParameterMembership membership = SysMLFactory .eINSTANCE .createParameterMembership ();
105+ membership .setOwnedMemberParameter (parameter );
106+ owner .getOwnedRelationship ().add (membership );
107+ }
57108}
0 commit comments