diff --git a/SysML2.NET.Tests/Extend/ElementExtensionsTestFixture.cs b/SysML2.NET.Tests/Extend/ElementExtensionsTestFixture.cs index 11f56051..706a8d2b 100644 --- a/SysML2.NET.Tests/Extend/ElementExtensionsTestFixture.cs +++ b/SysML2.NET.Tests/Extend/ElementExtensionsTestFixture.cs @@ -289,17 +289,17 @@ public void VerifyComputePathOperation() using (Assert.EnterMultipleScope()) { Assert.That(element.ComputePathOperation, Is.EqualTo("name")); - Assert.That(secondElement.ComputePathOperation, Throws.TypeOf()); + Assert.That(secondElement.ComputePathOperation(), Is.EqualTo("/2/1")); } - + namespaceElement.DeclaredName = "namespace"; membership.DeclaredName = "firstMember"; secondMembership.DeclaredName = "secondMember"; - + using (Assert.EnterMultipleScope()) { Assert.That(element.ComputePathOperation, Is.EqualTo("name")); - Assert.That(secondElement.ComputePathOperation, Throws.TypeOf()); + Assert.That(secondElement.ComputePathOperation(), Is.EqualTo("/2/1")); } } diff --git a/SysML2.NET.Tests/Extend/OwningMembershipExtensionsTestFixture.cs b/SysML2.NET.Tests/Extend/OwningMembershipExtensionsTestFixture.cs index ac6ec88d..e50d0069 100644 --- a/SysML2.NET.Tests/Extend/OwningMembershipExtensionsTestFixture.cs +++ b/SysML2.NET.Tests/Extend/OwningMembershipExtensionsTestFixture.cs @@ -57,9 +57,22 @@ public void VerifyComputeOwnedMemberElement() } [Test] - public void ComputeOwnedMemberElementId_ThrowsNotSupportedException() + public void VerifyComputeOwnedMemberElementId() { - Assert.That(() => ((IOwningMembership)null).ComputeOwnedMemberElementId(), Throws.TypeOf()); + Assert.That(() => ((IOwningMembership)null).ComputeOwnedMemberElementId(), Throws.TypeOf()); + + // OwnedRelatedElement.Count != 1 → IncompleteModelException propagated from ComputeOwnedMemberElement + var emptyMembership = new OwningMembership(); + + Assert.That(() => emptyMembership.ComputeOwnedMemberElementId(), Throws.TypeOf()); + + // Populated: one owned element → returns that element's ElementId + var container = new Namespace(); + var membership = new OwningMembership(); + var ownedElement = new Definition { ElementId = "test-element-id-42" }; + container.AssignOwnership(membership, ownedElement); + + Assert.That(membership.ComputeOwnedMemberElementId(), Is.EqualTo(ownedElement.ElementId)); } [Test] @@ -73,5 +86,40 @@ public void ComputeOwnedMemberShortName_ThrowsArgumentNullException() { Assert.That(() => ((IOwningMembership)null).ComputeOwnedMemberShortName(), Throws.TypeOf()); } + + [Test] + public void VerifyComputeRedefinedPathOperation() + { + Assert.That(() => ((IOwningMembership)null).ComputeRedefinedPathOperation(), Throws.TypeOf()); + + // OwnedRelatedElement.Count != 1 → IncompleteModelException propagated from ComputeOwnedMemberElement + var emptyMembership = new OwningMembership(); + + Assert.That(() => emptyMembership.ComputeRedefinedPathOperation(), Throws.TypeOf()); + + // qualifiedName != null → returns qualifiedName + "/owningMembership" + // Wire: owning package → named child namespace → named member definition + var rootPackage = new Namespace(); + var childNamespace = new Namespace { DeclaredName = "Pkg" }; + var childMembership = new OwningMembership(); + rootPackage.AssignOwnership(childMembership, childNamespace); + + var member = new Definition { DeclaredName = "Member" }; + var memberMembership = new OwningMembership(); + childNamespace.AssignOwnership(memberMembership, member); + + Assert.That(memberMembership.ComputeRedefinedPathOperation(), Is.EqualTo("Pkg::Member/owningMembership")); + + // qualifiedName == null → delegates to RelationshipExtensions.ComputeRedefinedPathOperation + // Wire: an OwningMembership with an unnamed owned element (no owning namespace → qualifiedName is null) + var unnamedContainer = new Namespace(); + var unnamedMembership = new OwningMembership(); + var unnamedElement = new Definition(); + unnamedContainer.AssignOwnership(unnamedMembership, unnamedElement); + + var expectedPath = ((IRelationship)unnamedMembership).ComputeRedefinedPathOperation(); + + Assert.That(unnamedMembership.ComputeRedefinedPathOperation(), Is.EqualTo(expectedPath)); + } } } diff --git a/SysML2.NET/Extend/OwningMembershipExtensions.cs b/SysML2.NET/Extend/OwningMembershipExtensions.cs index acba5948..b28d15e7 100644 --- a/SysML2.NET/Extend/OwningMembershipExtensions.cs +++ b/SysML2.NET/Extend/OwningMembershipExtensions.cs @@ -62,10 +62,9 @@ internal static IElement ComputeOwnedMemberElement(this IOwningMembership owning /// /// the computed result /// - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] internal static string ComputeOwnedMemberElementId(this IOwningMembership owningMembershipSubject) { - throw new NotSupportedException("Create a GitHub issue when this method is required"); + return owningMembershipSubject == null ? throw new ArgumentNullException(nameof(owningMembershipSubject)) : owningMembershipSubject.ownedMemberElement.ElementId; } /// @@ -119,10 +118,21 @@ internal static string ComputeOwnedMemberShortName(this IOwningMembership owning /// /// The expected /// - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] internal static string ComputeRedefinedPathOperation(this IOwningMembership owningMembershipSubject) { - throw new NotSupportedException("Create a GitHub issue when this method is required"); + if (owningMembershipSubject == null) + { + throw new ArgumentNullException(nameof(owningMembershipSubject)); + } + + var ownedElement = owningMembershipSubject.ownedMemberElement; + + if (ownedElement.qualifiedName != null) + { + return $"{ownedElement.qualifiedName}/owningMembership"; + } + + return RelationshipExtensions.ComputeRedefinedPathOperation(owningMembershipSubject); } } }