|
21 | 21 | namespace SysML2.NET.Tests.Extend |
22 | 22 | { |
23 | 23 | using System; |
24 | | - |
| 24 | + |
25 | 25 | using NUnit.Framework; |
26 | | - |
| 26 | + |
27 | 27 | using SysML2.NET.Core.POCO.Root.Namespaces; |
| 28 | + using SysML2.NET.Core.POCO.Systems.DefinitionAndUsage; |
28 | 29 |
|
29 | 30 | [TestFixture] |
30 | 31 | public class MembershipExtensionsTestFixture |
31 | 32 | { |
32 | 33 | [Test] |
33 | | - public void ComputeMemberElementId_ThrowsNotSupportedException() |
| 34 | + public void VerifyComputeMemberElementId() |
34 | 35 | { |
35 | | - Assert.That(() => ((IMembership)null).ComputeMemberElementId(), Throws.TypeOf<NotSupportedException>()); |
| 36 | + Assert.That(() => ((IMembership)null).ComputeMemberElementId(), Throws.TypeOf<ArgumentNullException>()); |
| 37 | + |
| 38 | + var membership = new Membership(); |
| 39 | + var element = new Definition { ElementId = "test-element-id-42" }; |
| 40 | + membership.MemberElement = element; |
| 41 | + |
| 42 | + Assert.That(membership.ComputeMemberElementId(), Is.EqualTo("test-element-id-42")); |
| 43 | + } |
| 44 | + |
| 45 | + [Test] |
| 46 | + public void VerifyComputeIsDistinguishableFromOperation() |
| 47 | + { |
| 48 | + // Null guards |
| 49 | + Assert.That(() => ((IMembership)null).ComputeIsDistinguishableFromOperation(new Membership()), Throws.TypeOf<ArgumentNullException>()); |
| 50 | + |
| 51 | + Assert.That(() => new Membership().ComputeIsDistinguishableFromOperation(null), Throws.TypeOf<ArgumentNullException>()); |
| 52 | + |
| 53 | + // Clause C: incompatible metaclasses — types do not conform to each other → true |
| 54 | + var subjectIncompat = new Membership { MemberShortName = "A", MemberName = "A" }; |
| 55 | + subjectIncompat.MemberElement = new Definition(); |
| 56 | + |
| 57 | + var otherIncompat = new Membership { MemberShortName = "A", MemberName = "A" }; |
| 58 | + otherIncompat.MemberElement = new Namespace(); |
| 59 | + |
| 60 | + Assert.That(subjectIncompat.ComputeIsDistinguishableFromOperation(otherIncompat), Is.True); |
| 61 | + |
| 62 | + // Clause C edge case: null MemberElement on subject — no conformance possible → true |
| 63 | + var subjectNullElement = new Membership { MemberShortName = "A", MemberName = "A" }; |
| 64 | + subjectNullElement.MemberElement = null; |
| 65 | + |
| 66 | + var otherWithElement = new Membership { MemberShortName = "A", MemberName = "A" }; |
| 67 | + otherWithElement.MemberElement = new Definition(); |
| 68 | + |
| 69 | + Assert.That(subjectNullElement.ComputeIsDistinguishableFromOperation(otherWithElement), Is.True); |
| 70 | + |
| 71 | + // Clause C edge case: null MemberElement on other — no conformance possible → true |
| 72 | + var subjectWithElement = new Membership { MemberShortName = "A", MemberName = "A" }; |
| 73 | + subjectWithElement.MemberElement = new Definition(); |
| 74 | + |
| 75 | + var otherNullElement = new Membership { MemberShortName = "A", MemberName = "A" }; |
| 76 | + otherNullElement.MemberElement = null; |
| 77 | + |
| 78 | + Assert.That(subjectWithElement.ComputeIsDistinguishableFromOperation(otherNullElement), Is.True); |
| 79 | + |
| 80 | + // Clause B: same metaclass, all four cross-comparisons differ → true |
| 81 | + var subjectClauseB = new Membership { MemberShortName = "A", MemberName = "B" }; |
| 82 | + subjectClauseB.MemberElement = new Definition(); |
| 83 | + |
| 84 | + var otherClauseB = new Membership { MemberShortName = "X", MemberName = "Y" }; |
| 85 | + otherClauseB.MemberElement = new Definition(); |
| 86 | + |
| 87 | + Assert.That(subjectClauseB.ComputeIsDistinguishableFromOperation(otherClauseB), Is.True); |
| 88 | + |
| 89 | + // Clause A: both MemberShortName and MemberName null on subject → true (null name-part wins) |
| 90 | + var subjectClauseA = new Membership { MemberShortName = null, MemberName = null }; |
| 91 | + subjectClauseA.MemberElement = new Definition(); |
| 92 | + |
| 93 | + var otherClauseA = new Membership { MemberShortName = "X", MemberName = "Y" }; |
| 94 | + otherClauseA.MemberElement = new Definition(); |
| 95 | + |
| 96 | + Assert.That(subjectClauseA.ComputeIsDistinguishableFromOperation(otherClauseA), Is.True); |
| 97 | + |
| 98 | + // Indistinguishable: same metaclass + MemberShortName clash → false |
| 99 | + var subjectShortClash = new Membership { MemberShortName = "A", MemberName = "B" }; |
| 100 | + subjectShortClash.MemberElement = new Definition(); |
| 101 | + |
| 102 | + var otherShortClash = new Membership { MemberShortName = "A", MemberName = "Z" }; |
| 103 | + otherShortClash.MemberElement = new Definition(); |
| 104 | + |
| 105 | + Assert.That(subjectShortClash.ComputeIsDistinguishableFromOperation(otherShortClash), Is.False); |
| 106 | + |
| 107 | + // Indistinguishable: subject.MemberShortName matches other.MemberName → false |
| 108 | + var subjectCrossClash = new Membership { MemberShortName = "A", MemberName = "B" }; |
| 109 | + subjectCrossClash.MemberElement = new Definition(); |
| 110 | + |
| 111 | + var otherCrossClash = new Membership { MemberShortName = null, MemberName = "A" }; |
| 112 | + otherCrossClash.MemberElement = new Definition(); |
| 113 | + |
| 114 | + Assert.That(subjectCrossClash.ComputeIsDistinguishableFromOperation(otherCrossClash), Is.False); |
| 115 | + |
| 116 | + // Half-distinguishable: NamePart1 fires but NamePart2 fails (MemberName matches) → false |
| 117 | + var subjectHalf = new Membership { MemberShortName = "A", MemberName = "B" }; |
| 118 | + subjectHalf.MemberElement = new Definition(); |
| 119 | + |
| 120 | + var otherHalf = new Membership { MemberShortName = "X", MemberName = "B" }; |
| 121 | + otherHalf.MemberElement = new Definition(); |
| 122 | + |
| 123 | + Assert.That(subjectHalf.ComputeIsDistinguishableFromOperation(otherHalf), Is.False); |
36 | 124 | } |
37 | | - |
| 125 | + |
38 | 126 | [Test] |
39 | 127 | public void ComputeMembershipOwningNamespace_ThrowsNotSupportedException() |
40 | 128 | { |
|
0 commit comments