diff --git a/mocha-common b/mocha-common index 569e302..6514615 160000 --- a/mocha-common +++ b/mocha-common @@ -1 +1 @@ -Subproject commit 569e302f3000e236ba562f17bc83d9e70a54fbf5 +Subproject commit 6514615b51e61aa43ef54f6a9bc4da048cc37e4e diff --git a/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs b/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs index ea47be5..a4442da 100755 --- a/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs @@ -435,5 +435,6 @@ namespace Mocha.Core public static Guid Get_Instances_Method__returns__Work_Set { get; } = new Guid("{7d0f93b1-8c93-464e-a44d-d674f910b589}"); public static Guid Get_Instances_Method__selects_instances_of__Class { get; } = new Guid("{c0b85d90-de8c-44c2-9420-c5e724ccdf2c}"); + public static Guid Method_Binding__uses_super__Return_Instance_Set_Method_Binding { get; } = new Guid("{444279f1-3bf9-4d1f-848e-e7bf33fa0fd7}"); } } diff --git a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs index e1edfa4..3ba6991 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs @@ -1080,6 +1080,28 @@ public abstract class Oms context.SetWorkData(assignsToParm, assignsFromWorkData); } retval = ExecuteMethodBinding(context, methodOrMethodBinding); + + InstanceHandle ihSuperRSMB = GetRelatedInstance(methodOrMethodBinding, GetInstance(KnownRelationshipGuids.Method_Binding__uses_super__Return_Instance_Set_Method_Binding)); + if (ihSuperRSMB != InstanceHandle.Empty) + { + if (retval != null) + { + object? insts = context.GetWorkData(retval.Value); + if (insts is IEnumerable ies) + { + InstanceHandle ws2 = Execute(context, ihSuperRSMB); + object? insts2 = context.GetWorkData(ws2); + + if (insts2 is IEnumerable ies2) + { + List list = new List(); + list.AddRange(ies2); + list.AddRange(ies); + context.SetWorkData(retval.Value, (IEnumerable)list); + } + } + } + } } else { diff --git a/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests/MethodBindingTests.cs b/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests/MethodBindingTests.cs index 9a61563..00e11bf 100644 --- a/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests/MethodBindingTests.cs +++ b/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests/MethodBindingTests.cs @@ -101,4 +101,39 @@ public class MethodBindingTests : MethodTestsBase */ Assert.Ignore(); } + + [Test] + public void Method_Binding__uses_super__Return_Instance_Set_Method_Binding() + { + InstanceHandle c_OMS = Oms.GetInstance(KnownInstanceGuids.Classes.OMS); + InstanceHandle i_OMS = Oms.CreateInstanceOf(c_OMS); + InstanceHandle i_OMS2 = Oms.CreateInstanceOf(c_OMS); + + WorkSet ws = Oms.CreateWorkSet("Singleton OMS"); + + Oop.Methods.GetSpecifiedInstancesMethod m1 = Oms.MethodBuilder.CreateGetSpecifiedInstancesMethod(c_OMS, "get", "Singleton", ws, new InstanceHandle[] { i_OMS }); + ReturnInstanceSetMethodBinding rsmb1 = m1.CreateMethodBinding(Oms); + + Oop.Methods.GetSpecifiedInstancesMethod m2 = Oms.MethodBuilder.CreateGetSpecifiedInstancesMethod(c_OMS, "get", "Singleton 2", ws, new InstanceHandle[] { i_OMS2 }); + ReturnInstanceSetMethodBinding rsmb2 = m2.CreateMethodBinding(Oms); + + ReturnInstanceSetMethodBinding rsmb3 = m2.CreateMethodBinding(Oms); + Oms.AssignRelationship(rsmb3.Handle, Oms.GetInstance(KnownRelationshipGuids.Method_Binding__uses_super__Return_Instance_Set_Method_Binding), rsmb1.Handle); + + OmsContext context = Oms.CreateContext(); + InstanceHandle valWS = Oms.Execute(context, rsmb3); + + Assert.That(valWS, Is.Not.EqualTo(InstanceHandle.Empty)); + + object? val = context.GetWorkData(valWS); + + Assert.That(val, Is.InstanceOf>()); + if (val is IEnumerable ie) + { + InstanceHandle[] ihs = ie.ToArray(); + Assert.That(ihs.Length, Is.EqualTo(2)); + Assert.That(ihs[0], Is.EqualTo(i_OMS)); + Assert.That(ihs[1], Is.EqualTo(i_OMS2)); + } + } }