Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 63 additions & 3 deletions SysML2.NET.Tests/Extend/PackageExtensionsTestFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,76 @@ namespace SysML2.NET.Tests.Extend
using System;

using NUnit.Framework;


using SysML2.NET.Core.POCO.Kernel.Associations;
using SysML2.NET.Core.POCO.Kernel.Functions;
using SysML2.NET.Core.POCO.Kernel.Packages;
using SysML2.NET.Core.POCO.Root.Annotations;
using SysML2.NET.Core.POCO.Root.Namespaces;
using SysML2.NET.Extensions;

using Type = SysML2.NET.Core.POCO.Core.Types.Type;

[TestFixture]
public class PackageExtensionsTestFixture
{
[Test]
public void ComputeFilterCondition_ThrowsNotSupportedException()
public void VerifyComputeFilterCondition()
{
Assert.That(() => ((IPackage)null).ComputeFilterCondition(), Throws.TypeOf<ArgumentNullException>());

var package = new Package();

Assert.That(package.ComputeFilterCondition(), Is.Empty);
var membership = new ElementFilterMembership();
var expression = new BooleanExpression();

var annotation = new Annotation();
var comment = new Comment();

package.AssignOwnership(membership, expression);
package.AssignOwnership(annotation, comment);

Assert.That(package.ComputeFilterCondition, Throws.InstanceOf<NotSupportedException>());
}

[Test]
public void VerifyComputeRedefinedImportedMembershipsOperation()
{
Assert.That(() => ((IPackage)null).ComputeFilterCondition(), Throws.TypeOf<NotSupportedException>());
Assert.That(() => ((IPackage)null).ComputeRedefinedImportedMembershipsOperation([]), Throws.TypeOf<ArgumentNullException>());

var package = new Package();

Assert.That(package.ComputeRedefinedImportedMembershipsOperation([]), Is.Empty);

var importMember = new MembershipImport();
var type = new Type();

package.AssignOwnership(importMember, type);
Assert.That(()=> package.ComputeRedefinedImportedMembershipsOperation([]), Throws.InstanceOf<NotSupportedException>());

var membership = new ElementFilterMembership();
var expression = new BooleanExpression();
package.AssignOwnership(membership, expression);
Assert.That(()=> package.ComputeRedefinedImportedMembershipsOperation([]), Throws.InstanceOf<NotSupportedException>());
}

[Test]
public void VerifyComputeIncludeAsMemberOperation()
{
Assert.That(() => ((IPackage)null).ComputeIncludeAsMemberOperation(null), Throws.TypeOf<ArgumentNullException>());

var package = new Package();
Assert.That(package.ComputeIncludeAsMemberOperation(null), Is.False);

var element = new Type();
Assert.That(package.ComputeIncludeAsMemberOperation(element), Is.True);
var membership = new ElementFilterMembership();
var expression = new BooleanExpression();

package.AssignOwnership(membership, expression);

Assert.That(() => package.ComputeIncludeAsMemberOperation(element), Throws.TypeOf<NotSupportedException>());
}
}
}
36 changes: 30 additions & 6 deletions SysML2.NET/Extend/PackageExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ namespace SysML2.NET.Core.POCO.Kernel.Packages
{
using System;
using System.Collections.Generic;
using System.Linq;

using SysML2.NET.Core.POCO.Kernel.Functions;
using SysML2.NET.Core.POCO.Root.Annotations;
Expand All @@ -37,16 +38,16 @@ internal static class PackageExtensions
/// <summary>
/// Computes the derived property.
/// </summary>
/// <remarks>OCL2: filterCondition = ownedMembership-> selectByKind(ElementFilterMembership).condition </remarks>
/// <param name="packageSubject">
/// The subject <see cref="IPackage"/>
/// </param>
/// <returns>
/// the computed result
/// </returns>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal static List<IExpression> ComputeFilterCondition(this IPackage packageSubject)
{
throw new NotSupportedException("Create a GitHub issue when this method is required");
return packageSubject == null ? throw new ArgumentNullException(nameof(packageSubject)) : [..packageSubject.ownedMembership.OfType<IElementFilterMembership>().Select(x => x.condition)];
}

/// <summary>
Expand All @@ -61,10 +62,23 @@ internal static List<IExpression> ComputeFilterCondition(this IPackage packageSu
/// <returns>
/// The expected collection of <see cref="IMembership" />
/// </returns>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal static List<IMembership> ComputeRedefinedImportedMembershipsOperation(this IPackage packageSubject, List<INamespace> excluded)
{
throw new NotSupportedException("Create a GitHub issue when this method is required");
if (packageSubject == null)
{
throw new ArgumentNullException(nameof(packageSubject));
}

var importedMembership= packageSubject.ComputeImportedMembershipsOperation(excluded);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ComputeRedefinedImportedMembershipsOperation returns the list from
ComputeImportedMembershipsOperation directly when there are no filters (line 77), but returns a fresh
.ToList() in the filtered branch (line 80). Callers mutating the return would mutate the underlying namespace
computation in one branch and not the other. Return .ToList() (or a new
List(importedMembership)) in both branches for consistent ownership semantics

var filters = packageSubject.ComputeFilterCondition();

if (filters.Count == 0)
{
return importedMembership;
}

var validImportedMembership = importedMembership.Where(membership => filters.All(x => x.CheckCondition(membership))).ToList();
return validImportedMembership;
}

/// <summary>
Expand All @@ -79,10 +93,20 @@ internal static List<IMembership> ComputeRedefinedImportedMembershipsOperation(t
/// <returns>
/// The expected <see cref="bool" />
/// </returns>
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal static bool ComputeIncludeAsMemberOperation(this IPackage packageSubject, IElement element)
{
throw new NotSupportedException("Create a GitHub issue when this method is required");
if (packageSubject == null)
{
throw new ArgumentNullException(nameof(packageSubject));
}

if (element == null)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this not throw an exception, or does the spec allow this to be null?

{
return false;
}

var filters = packageSubject.ComputeFilterCondition();
return filters.Count == 0 || filters.All(x => x.CheckCondition(element));
}
}
}
Loading