Skip to content

Commit c31eca4

Browse files
Fix #244 (#245)
1 parent 879fe30 commit c31eca4

3 files changed

Lines changed: 326 additions & 70 deletions

File tree

SysML2.NET.Tests/Extend/AcceptActionUsageExtensionsTestFixture.cs

Lines changed: 84 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,13 @@ namespace SysML2.NET.Tests.Extend
2424

2525
using NUnit.Framework;
2626

27+
using SysML2.NET.Core.Core.Types;
28+
using SysML2.NET.Core.POCO.Core.Features;
2729
using SysML2.NET.Core.POCO.Core.Types;
30+
using SysML2.NET.Core.POCO.Kernel.Expressions;
31+
using SysML2.NET.Core.POCO.Kernel.FeatureValues;
2832
using SysML2.NET.Core.POCO.Systems.Actions;
33+
using SysML2.NET.Core.POCO.Systems.DefinitionAndUsage;
2934
using SysML2.NET.Core.POCO.Systems.States;
3035
using SysML2.NET.Extensions;
3136

@@ -37,10 +42,40 @@ public void VerifyComputePayloadArgument()
3742
{
3843
Assert.That(() => ((IAcceptActionUsage)null).ComputePayloadArgument(), Throws.TypeOf<ArgumentNullException>());
3944

40-
var accept = new AcceptActionUsage();
45+
// Branch 1 — bare AcceptActionUsage with no input parameters: argument(1) is null.
46+
var emptyAccept = new AcceptActionUsage();
47+
48+
Assert.That(emptyAccept.ComputePayloadArgument(), Is.Null);
49+
50+
// Branch 2 — one input parameter, no FeatureValue membership: argument(1) is null.
51+
var bareParameterAccept = new AcceptActionUsage();
52+
var bareParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
53+
bareParameterAccept.AssignOwnership(new FeatureMembership(), bareParameter);
54+
55+
Assert.That(bareParameterAccept.ComputePayloadArgument(), Is.Null);
56+
57+
// Branch 3 — one input parameter owning a FeatureValue whose value is a LiteralInteger: argument(1) returns that expression.
58+
var populatedAccept = new AcceptActionUsage();
59+
var populatedParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
60+
populatedAccept.AssignOwnership(new FeatureMembership(), populatedParameter);
61+
62+
var payloadExpression = new LiteralInteger();
63+
populatedParameter.AssignOwnership(new FeatureValue(), payloadExpression);
4164

42-
// For Later: populated case depends on ActionUsageExtensions.ComputeArgumentOperation at SysML2.NET/Extend/ActionUsageExtensions.cs:157, which is still a stub.
43-
Assert.That(() => accept.ComputePayloadArgument(), Throws.TypeOf<NotSupportedException>());
65+
Assert.That(populatedAccept.ComputePayloadArgument(), Is.SameAs(payloadExpression));
66+
67+
// Branch 4 — two input parameters, only the second has a FeatureValue: argument(1) must still be null.
68+
var twoParameterAccept = new AcceptActionUsage();
69+
var firstParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
70+
twoParameterAccept.AssignOwnership(new FeatureMembership(), firstParameter);
71+
72+
var secondParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
73+
twoParameterAccept.AssignOwnership(new FeatureMembership(), secondParameter);
74+
75+
var secondExpression = new LiteralInteger();
76+
secondParameter.AssignOwnership(new FeatureValue(), secondExpression);
77+
78+
Assert.That(twoParameterAccept.ComputePayloadArgument(), Is.Null);
4479
}
4580

4681
[Test]
@@ -59,10 +94,53 @@ public void VerifyComputeReceiverArgument()
5994
{
6095
Assert.That(() => ((IAcceptActionUsage)null).ComputeReceiverArgument(), Throws.TypeOf<ArgumentNullException>());
6196

62-
var accept = new AcceptActionUsage();
97+
// Branch 1 — bare AcceptActionUsage with no input parameters: argument(2) is null.
98+
var emptyAccept = new AcceptActionUsage();
99+
100+
Assert.That(emptyAccept.ComputeReceiverArgument(), Is.Null);
101+
102+
// Branch 2 — one input parameter only: argument(2) is out-of-range and returns null.
103+
var singleParameterAccept = new AcceptActionUsage();
104+
var loneParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
105+
singleParameterAccept.AssignOwnership(new FeatureMembership(), loneParameter);
106+
107+
Assert.That(singleParameterAccept.ComputeReceiverArgument(), Is.Null);
108+
109+
// Branch 3 — two input parameters, neither has a FeatureValue: argument(2) is null.
110+
var bareTwoParameterAccept = new AcceptActionUsage();
111+
var bareFirstParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
112+
bareTwoParameterAccept.AssignOwnership(new FeatureMembership(), bareFirstParameter);
113+
114+
var bareSecondParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
115+
bareTwoParameterAccept.AssignOwnership(new FeatureMembership(), bareSecondParameter);
116+
117+
Assert.That(bareTwoParameterAccept.ComputeReceiverArgument(), Is.Null);
118+
119+
// Branch 4 — two input parameters, only the SECOND has a FeatureValue with a non-null IExpression: argument(2) returns that expression.
120+
var populatedAccept = new AcceptActionUsage();
121+
var populatedFirstParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
122+
populatedAccept.AssignOwnership(new FeatureMembership(), populatedFirstParameter);
123+
124+
var populatedSecondParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
125+
populatedAccept.AssignOwnership(new FeatureMembership(), populatedSecondParameter);
126+
127+
var receiverExpression = new LiteralInteger();
128+
populatedSecondParameter.AssignOwnership(new FeatureValue(), receiverExpression);
129+
130+
Assert.That(populatedAccept.ComputeReceiverArgument(), Is.SameAs(receiverExpression));
131+
132+
// Branch 5 — two input parameters, only the FIRST has a FeatureValue: argument(2) must still be null.
133+
var firstOnlyAccept = new AcceptActionUsage();
134+
var firstOnlyFirstParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
135+
firstOnlyAccept.AssignOwnership(new FeatureMembership(), firstOnlyFirstParameter);
136+
137+
var firstOnlySecondParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
138+
firstOnlyAccept.AssignOwnership(new FeatureMembership(), firstOnlySecondParameter);
139+
140+
var firstExpression = new LiteralInteger();
141+
firstOnlyFirstParameter.AssignOwnership(new FeatureValue(), firstExpression);
63142

64-
// For Later: populated case depends on ActionUsageExtensions.ComputeArgumentOperation at SysML2.NET/Extend/ActionUsageExtensions.cs:157, which is still a stub.
65-
Assert.That(() => accept.ComputeReceiverArgument(), Throws.TypeOf<NotSupportedException>());
143+
Assert.That(firstOnlyAccept.ComputeReceiverArgument(), Is.Null);
66144
}
67145

68146
[Test]
Lines changed: 195 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,224 @@
11
// -------------------------------------------------------------------------------------------------
22
// <copyright file="ActionUsageExtensionsTestFixture.cs" company="Starion Group S.A.">
3-
//
3+
//
44
// Copyright 2022-2026 Starion Group S.A.
5-
//
5+
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
88
// You may obtain a copy of the License at
9-
//
9+
//
1010
// http://www.apache.org/licenses/LICENSE-2.0
11-
//
11+
//
1212
// Unless required by applicable law or agreed to in writing, software
1313
// distributed under the License is distributed on an "AS IS" BASIS,
1414
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1515
// See the License for the specific language governing permissions and
1616
// limitations under the License.
17-
//
17+
//
1818
// </copyright>
1919
// ------------------------------------------------------------------------------------------------
2020

2121
namespace SysML2.NET.Tests.Extend
2222
{
2323
using System;
24-
24+
2525
using NUnit.Framework;
26-
26+
27+
using SysML2.NET.Core.Core.Types;
28+
using SysML2.NET.Core.POCO.Core.Classifiers;
29+
using SysML2.NET.Core.POCO.Core.Features;
30+
using SysML2.NET.Core.POCO.Core.Types;
31+
using SysML2.NET.Core.POCO.Kernel.Expressions;
32+
using SysML2.NET.Core.POCO.Kernel.FeatureValues;
2733
using SysML2.NET.Core.POCO.Systems.Actions;
34+
using SysML2.NET.Core.POCO.Systems.DefinitionAndUsage;
35+
using SysML2.NET.Core.POCO.Systems.Parts;
36+
using SysML2.NET.Core.POCO.Systems.States;
37+
using SysML2.NET.Core.Systems.States;
38+
using SysML2.NET.Extensions;
2839

2940
[TestFixture]
3041
public class ActionUsageExtensionsTestFixture
3142
{
3243
[Test]
33-
public void ComputeActionDefinition_ThrowsNotSupportedException()
44+
public void VerifyComputeActionDefinition()
45+
{
46+
Assert.That(() => ((IActionUsage)null).ComputeActionDefinition(), Throws.TypeOf<ArgumentNullException>());
47+
48+
var emptyActionUsage = new ActionUsage();
49+
50+
Assert.That(emptyActionUsage.ComputeActionDefinition(), Has.Count.EqualTo(0));
51+
52+
var actionUsage = new ActionUsage();
53+
54+
var firstActionDefinition = new ActionDefinition();
55+
actionUsage.AssignOwnership(new FeatureTyping { Type = firstActionDefinition });
56+
57+
var secondActionDefinition = new ActionDefinition();
58+
actionUsage.AssignOwnership(new FeatureTyping { Type = secondActionDefinition });
59+
60+
// A FeatureTyping whose Type is a plain Classifier (NOT an IBehavior) must be filtered out by OfType<IBehavior>().
61+
var classifier = new Classifier();
62+
actionUsage.AssignOwnership(new FeatureTyping { Type = classifier });
63+
64+
using (Assert.EnterMultipleScope())
65+
{
66+
Assert.That(actionUsage.ComputeActionDefinition(), Has.Count.EqualTo(2));
67+
Assert.That(actionUsage.ComputeActionDefinition(), Does.Contain(firstActionDefinition));
68+
Assert.That(actionUsage.ComputeActionDefinition(), Does.Contain(secondActionDefinition));
69+
Assert.That(actionUsage.ComputeActionDefinition(), Does.Not.Contain(classifier));
70+
}
71+
}
72+
73+
[Test]
74+
public void VerifyComputeInputParametersOperation()
75+
{
76+
Assert.That(() => ((IActionUsage)null).ComputeInputParametersOperation(), Throws.TypeOf<ArgumentNullException>());
77+
78+
var emptyActionUsage = new ActionUsage();
79+
80+
Assert.That(emptyActionUsage.ComputeInputParametersOperation(), Has.Count.EqualTo(0));
81+
82+
var actionUsage = new ActionUsage();
83+
84+
var firstParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
85+
var firstMembership = new FeatureMembership();
86+
actionUsage.AssignOwnership(firstMembership, firstParameter);
87+
88+
var secondParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
89+
var secondMembership = new FeatureMembership();
90+
actionUsage.AssignOwnership(secondMembership, secondParameter);
91+
92+
// For later: inherited-vs-owned branch requires a Specialization wiring; covered indirectly.
93+
using (Assert.EnterMultipleScope())
94+
{
95+
Assert.That(actionUsage.ComputeInputParametersOperation(), Has.Count.EqualTo(2));
96+
Assert.That(actionUsage.ComputeInputParametersOperation(), Does.Contain(firstParameter));
97+
Assert.That(actionUsage.ComputeInputParametersOperation(), Does.Contain(secondParameter));
98+
}
99+
}
100+
101+
[Test]
102+
public void VerifyComputeInputParameterOperation()
103+
{
104+
Assert.That(() => ((IActionUsage)null).ComputeInputParameterOperation(1), Throws.TypeOf<ArgumentNullException>());
105+
106+
var emptyActionUsage = new ActionUsage();
107+
108+
Assert.That(emptyActionUsage.ComputeInputParameterOperation(1), Is.Null);
109+
110+
var actionUsage = new ActionUsage();
111+
112+
var firstParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
113+
var firstMembership = new FeatureMembership();
114+
actionUsage.AssignOwnership(firstMembership, firstParameter);
115+
116+
var secondParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
117+
var secondMembership = new FeatureMembership();
118+
actionUsage.AssignOwnership(secondMembership, secondParameter);
119+
120+
using (Assert.EnterMultipleScope())
121+
{
122+
Assert.That(actionUsage.ComputeInputParameterOperation(0), Is.Null);
123+
Assert.That(actionUsage.ComputeInputParameterOperation(-1), Is.Null);
124+
Assert.That(actionUsage.ComputeInputParameterOperation(1), Is.SameAs(firstParameter));
125+
Assert.That(actionUsage.ComputeInputParameterOperation(2), Is.SameAs(secondParameter));
126+
Assert.That(actionUsage.ComputeInputParameterOperation(3), Is.Null);
127+
}
128+
129+
var singleParameterActionUsage = new ActionUsage();
130+
var lonelyParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
131+
var lonelyMembership = new FeatureMembership();
132+
singleParameterActionUsage.AssignOwnership(lonelyMembership, lonelyParameter);
133+
134+
using (Assert.EnterMultipleScope())
135+
{
136+
Assert.That(singleParameterActionUsage.ComputeInputParameterOperation(1), Is.SameAs(lonelyParameter));
137+
Assert.That(singleParameterActionUsage.ComputeInputParameterOperation(2), Is.Null);
138+
}
139+
}
140+
141+
[Test]
142+
public void VerifyComputeArgumentOperation()
34143
{
35-
Assert.That(() => ((IActionUsage)null).ComputeActionDefinition(), Throws.TypeOf<NotSupportedException>());
144+
Assert.That(() => ((IActionUsage)null).ComputeArgumentOperation(1), Throws.TypeOf<ArgumentNullException>());
145+
146+
var emptyActionUsage = new ActionUsage();
147+
148+
Assert.That(emptyActionUsage.ComputeArgumentOperation(1), Is.Null);
149+
150+
// ActionUsage with one input parameter that has no FeatureValue membership.
151+
var bareParameterActionUsage = new ActionUsage();
152+
var bareParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
153+
var bareMembership = new FeatureMembership();
154+
bareParameterActionUsage.AssignOwnership(bareMembership, bareParameter);
155+
156+
using (Assert.EnterMultipleScope())
157+
{
158+
Assert.That(bareParameterActionUsage.ComputeArgumentOperation(0), Is.Null);
159+
Assert.That(bareParameterActionUsage.ComputeArgumentOperation(-1), Is.Null);
160+
Assert.That(bareParameterActionUsage.ComputeArgumentOperation(1), Is.Null);
161+
}
162+
163+
// ActionUsage with one input parameter owning a FeatureValue with a non-null IExpression value.
164+
var actionUsage = new ActionUsage();
165+
var inputParameter = new ReferenceUsage { Direction = FeatureDirectionKind.In };
166+
var inputMembership = new FeatureMembership();
167+
actionUsage.AssignOwnership(inputMembership, inputParameter);
168+
169+
var expression = new LiteralInteger();
170+
var featureValue = new FeatureValue();
171+
inputParameter.AssignOwnership(featureValue, expression);
172+
173+
using (Assert.EnterMultipleScope())
174+
{
175+
Assert.That(actionUsage.ComputeArgumentOperation(1), Is.SameAs(expression));
176+
Assert.That(actionUsage.ComputeArgumentOperation(2), Is.Null);
177+
}
178+
}
179+
180+
[Test]
181+
public void VerifyComputeIsSubactionUsageOperation()
182+
{
183+
Assert.That(() => ((IActionUsage)null).ComputeIsSubactionUsageOperation(), Throws.TypeOf<ArgumentNullException>());
184+
185+
// Branch 1: IsComposite = false -> false.
186+
var nonCompositeActionUsage = new ActionUsage { IsComposite = false };
187+
188+
Assert.That(nonCompositeActionUsage.ComputeIsSubactionUsageOperation(), Is.False);
189+
190+
// Branch 2: composite, no owner -> false (owningType is null).
191+
var orphanCompositeActionUsage = new ActionUsage { IsComposite = true };
192+
193+
Assert.That(orphanCompositeActionUsage.ComputeIsSubactionUsageOperation(), Is.False);
194+
195+
// Branch 3: composite, owningType is a PartDefinition (not ActionDef/ActionUsage) -> false.
196+
var partDefinitionOwner = new PartDefinition();
197+
var partOwnedActionUsage = new ActionUsage { IsComposite = true };
198+
partDefinitionOwner.AssignOwnership(new FeatureMembership(), partOwnedActionUsage);
199+
200+
Assert.That(partOwnedActionUsage.ComputeIsSubactionUsageOperation(), Is.False);
201+
202+
// Branch 4: composite, owned by ActionDefinition via plain FeatureMembership -> true.
203+
var actionDefinitionOwner = new ActionDefinition();
204+
var actionDefOwnedActionUsage = new ActionUsage { IsComposite = true };
205+
actionDefinitionOwner.AssignOwnership(new FeatureMembership(), actionDefOwnedActionUsage);
206+
207+
Assert.That(actionDefOwnedActionUsage.ComputeIsSubactionUsageOperation(), Is.True);
208+
209+
// Branch 5: composite, owned by ActionUsage parent via StateSubactionMembership { Kind = Do } -> true.
210+
var actionUsageParent = new ActionUsage();
211+
var doSubaction = new ActionUsage { IsComposite = true };
212+
actionUsageParent.AssignOwnership(new StateSubactionMembership { Kind = StateSubactionKind.Do }, doSubaction);
213+
214+
Assert.That(doSubaction.ComputeIsSubactionUsageOperation(), Is.True);
215+
216+
// Branch 6: composite, owned by ActionDefinition via StateSubactionMembership { Kind = Entry } -> false.
217+
var entryOwner = new ActionDefinition();
218+
var entrySubaction = new ActionUsage { IsComposite = true };
219+
entryOwner.AssignOwnership(new StateSubactionMembership { Kind = StateSubactionKind.Entry }, entrySubaction);
220+
221+
Assert.That(entrySubaction.ComputeIsSubactionUsageOperation(), Is.False);
36222
}
37223
}
38224
}

0 commit comments

Comments
 (0)