Skip to content

Commit 403e8cd

Browse files
Fix #161
1 parent e2ae3eb commit 403e8cd

2 files changed

Lines changed: 80 additions & 14 deletions

File tree

Lines changed: 65 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,93 @@
1-
// -------------------------------------------------------------------------------------------------
1+
// -------------------------------------------------------------------------------------------------
22
// <copyright file="ParameterMembershipExtensionsTestFixture.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.Features;
29+
using SysML2.NET.Core.POCO.Core.Types;
2730
using SysML2.NET.Core.POCO.Kernel.Behaviors;
31+
using SysML2.NET.Core.POCO.Root.Elements;
32+
using SysML2.NET.Core.POCO.Root.Namespaces;
33+
using SysML2.NET.Exceptions;
34+
using SysML2.NET.Extensions;
35+
36+
using Type = SysML2.NET.Core.POCO.Core.Types.Type;
2837

2938
[TestFixture]
3039
public class ParameterMembershipExtensionsTestFixture
3140
{
3241
[Test]
33-
public void ComputeOwnedMemberParameter_ThrowsNotSupportedException()
42+
public void VerifyComputeOwnedMemberParameter()
3443
{
35-
Assert.That(() => ((IParameterMembership)null).ComputeOwnedMemberParameter(), Throws.TypeOf<NotSupportedException>());
44+
Assert.That(() => ((IParameterMembership)null).ComputeOwnedMemberParameter(), Throws.TypeOf<ArgumentNullException>());
45+
46+
var parameterMembership = new ParameterMembership();
47+
48+
Assert.That(() => parameterMembership.ComputeOwnedMemberParameter(), Throws.TypeOf<IncompleteModelException>());
49+
50+
var owningType = new Type();
51+
var feature = new Feature();
52+
53+
owningType.AssignOwnership(parameterMembership, feature);
54+
55+
Assert.That(parameterMembership.ComputeOwnedMemberParameter(), Is.SameAs(feature));
56+
57+
// Wiring two features to verify the multiple-element guard:
58+
// First remove the existing wiring so we can create a fresh membership with two elements.
59+
var twoElementMembership = new ParameterMembership();
60+
var secondFeature = new Feature();
61+
62+
((IContainedRelationship)twoElementMembership).OwnedRelatedElement.Add(feature);
63+
((IContainedRelationship)twoElementMembership).OwnedRelatedElement.Add(secondFeature);
64+
65+
Assert.That(() => twoElementMembership.ComputeOwnedMemberParameter(), Throws.TypeOf<IncompleteModelException>());
66+
67+
// NOTE: wiring a non-IFeature element as the sole OwnedRelatedElement is not possible via the
68+
// public AssignOwnership API (IParameterMembership requires an IFeature target).
69+
// To cover the as-cast-returns-null path we directly populate OwnedRelatedElement with a
70+
// plain Namespace (which is not an IFeature).
71+
var nonFeatureMembership = new ParameterMembership();
72+
var nonFeatureElement = new Namespace();
73+
74+
((IContainedRelationship)nonFeatureMembership).OwnedRelatedElement.Add(nonFeatureElement);
75+
76+
Assert.That(nonFeatureMembership.ComputeOwnedMemberParameter(), Is.Null);
77+
}
78+
79+
[Test]
80+
public void VerifyComputeParameterDirectionOperation()
81+
{
82+
Assert.That(() => ((IParameterMembership)null).ComputeParameterDirectionOperation(), Throws.TypeOf<ArgumentNullException>());
83+
84+
var parameterMembership = new ParameterMembership();
85+
var owningType = new Type();
86+
var feature = new Feature();
87+
88+
owningType.AssignOwnership(parameterMembership, feature);
89+
90+
Assert.That(parameterMembership.ComputeParameterDirectionOperation(), Is.EqualTo(FeatureDirectionKind.In));
3691
}
3792
}
3893
}

SysML2.NET/Extend/ParameterMembershipExtensions.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ namespace SysML2.NET.Core.POCO.Kernel.Behaviors
3030
using SysML2.NET.Core.POCO.Root.Annotations;
3131
using SysML2.NET.Core.POCO.Root.Elements;
3232
using SysML2.NET.Core.POCO.Root.Namespaces;
33+
using SysML2.NET.Exceptions;
3334

3435
/// <summary>
3536
/// The <see cref="ParameterMembershipExtensions"/> class provides extensions methods for
@@ -46,10 +47,16 @@ internal static class ParameterMembershipExtensions
4647
/// <returns>
4748
/// the computed result
4849
/// </returns>
49-
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
5050
internal static IFeature ComputeOwnedMemberParameter(this IParameterMembership parameterMembershipSubject)
5151
{
52-
throw new NotSupportedException("Create a GitHub issue when this method is required");
52+
if (parameterMembershipSubject == null)
53+
{
54+
throw new ArgumentNullException(nameof(parameterMembershipSubject));
55+
}
56+
57+
return parameterMembershipSubject.OwnedRelatedElement.Count != 1
58+
? throw new IncompleteModelException($"{nameof(parameterMembershipSubject)} must have exactly one related element")
59+
: parameterMembershipSubject.OwnedRelatedElement[0] as IFeature;
5360
}
5461

5562
/// <summary>
@@ -67,10 +74,14 @@ internal static IFeature ComputeOwnedMemberParameter(this IParameterMembership p
6774
/// <returns>
6875
/// The expected <see cref="FeatureDirectionKind" />
6976
/// </returns>
70-
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
7177
internal static FeatureDirectionKind ComputeParameterDirectionOperation(this IParameterMembership parameterMembershipSubject)
7278
{
73-
throw new NotSupportedException("Create a GitHub issue when this method is required");
79+
if (parameterMembershipSubject == null)
80+
{
81+
throw new ArgumentNullException(nameof(parameterMembershipSubject));
82+
}
83+
84+
return FeatureDirectionKind.In;
7485
}
7586
}
7687
}

0 commit comments

Comments
 (0)