diff --git a/mocha-dotnet/src/lib/Mocha.Core/KnownInstanceGuids.cs b/mocha-dotnet/src/lib/Mocha.Core/KnownInstanceGuids.cs index ffedeeb..cec89b3 100755 --- a/mocha-dotnet/src/lib/Mocha.Core/KnownInstanceGuids.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/KnownInstanceGuids.cs @@ -179,7 +179,7 @@ namespace Mocha.Core public static Guid CommonBoolean { get; } = new Guid("{5b025da3-b7bd-45a9-b084-48c4a922bf72}"); public static Guid CommonNumeric { get; } = new Guid("{553c196e-0439-4be9-b8fb-4dee6f0530fd}"); public static Guid CommonDate { get; } = new Guid("{cb077f5b-f58d-4f6a-aa01-659bea754b6e}"); // {d6c033a0-b781-46d4-9515-64183f2902f5} - + public static Guid CommonInstanceSet { get; } = new Guid("{3382da21-4fc5-45dc-bbd1-f7ba3ece1a1b}"); public static Guid BooleanOperator { get; } = new Guid("{fb85933c-e2ad-4b1c-ac2a-f92c9cc57e1c}"); @@ -209,10 +209,10 @@ namespace Mocha.Core public static class GetRelationship { public static Guid Instance__get__Parent_Class { get; } = new Guid("{bac8c59f-8994-41e8-b0c0-659ec8efc4e2}"); - + public static Guid Instance__get__Parent_Class__for__Method_Binding__HACK { get; set; } - // public static Guid Method__get__Parent_Class__HACK { get; } = new Guid("{89034a1c-50e5-47a1-abb8-076ece5343a8}"); - } + // public static Guid Method__get__Parent_Class__HACK { get; } = new Guid("{89034a1c-50e5-47a1-abb8-076ece5343a8}"); + } public static class ConditionalSelectAttribute { // public static Guid Method__get__Abbreviation { get; } = new Guid("{f0c64709-385d-481b-8f58-83e507fb261c}"); @@ -231,6 +231,7 @@ namespace Mocha.Core { public static Guid BuildDynamicInstanceOp { get; } = new Guid("{622edf0d-5e3d-49fd-9764-33aa304addf4}"); public static Guid FilterByTypeOp { get; } = new Guid("{8344a933-bb49-4d1c-b92a-a044fc9b9611}"); + public static Guid CombineSetsOp { get; } = new Guid("{a98844a5-ede8-4b4d-a94e-5f6f15db75c0}"); } [ExportEntities(Prefix = "IDC_", Suffix = null)] @@ -242,13 +243,13 @@ namespace Mocha.Core /// public static Guid ProcessUpdatesMethod { get; } = new Guid("{f042c68d-8187-4dd6-93fa-7119bb949a16}"); public static Guid GetAttributeMethod { get; } = new Guid("{c3ecf8c9-597f-417b-ad65-fae0401719c6}"); // 12 - // Perform System Routine Method - 13 + // Perform System Routine Method - 13 public static Guid GetReferencedAttributeMethod { get; } = new Guid("{9205c54e-921a-484c-9be2-3d3deb877474}"); // 18 public static Guid SelectFromInstanceSetMethod { get; } = new Guid("{130637B4-17A7-4394-8F4D-E83A79114E6C}"); // 19 public static Guid EvaluateBooleanExpressionMethod { get; } = new Guid("{e1529108-2f84-4a4c-89b3-a647bc3e41d7}"); // 24 - // AR - Assign Relationship Method - 25 + // AR - Assign Relationship Method - 25 public static Guid GetReferencedInstanceSetMethod { get; } = new Guid("{bcfd0d64-3eba-4a97-9622-f3a960877d24}"); // 26 - // BEM - Build Element Method - 29 + // BEM - Build Element Method - 29 public static Guid BuildAttributeMethod { get; } = new Guid("{e5879955-0093-48c8-8042-813168578af2}"); // 30 /// /// CN - Calculate Numeric Method @@ -294,17 +295,17 @@ namespace Mocha.Core public static Guid AssignAttributeMethod { get; } = new Guid("{3312A789-3B7A-4478-B329-4FF781504F9C}"); // CS - Compare Instance Sets Method - 91 public static Guid CalculateDateMethod { get; } = new Guid("{1e58e284-56eb-42b4-88b9-e0a691559fa6}"); // 92 - // EC - Evaluate Conditions Method - 94 - // SIM - Spawn Internal Message Method - 169 - // BWSR - Build Web Service Response Method - 171 - // GRE - Get Referenced Element Method - 197 + // EC - Evaluate Conditions Method - 94 + // SIM - Spawn Internal Message Method - 169 + // BWSR - Build Web Service Response Method - 171 + // GRE - Get Referenced Element Method - 197 public static Guid GetRelationshipMethod { get; } = new Guid("{d53c9232-89ef-4cca-8520-261da6787450}"); // 207 - // IWS - Invoke Web Service Method - 208 + // IWS - Invoke Web Service Method - 208 public static Guid InstanceOpMethod { get; } = new Guid("{4c814982-938f-4116-bdc1-827bae6a5f71}"); public static Guid ConditionalSelectAttributeMethod { get; } = new Guid("{d534a369-321e-4c32-bd7f-8ff2017f191e}"); // 13038 - // SSC - Conditional Select from Instance Set Method - 13039 + // SSC - Conditional Select from Instance Set Method - 13039 public static Guid ConditionalSelectFromInstanceSetMethod { get; } = new Guid("{ffea8e52-06e5-4e95-8c40-da3ba54ce95f}"); // 13039 - } + } public static class SystemAttributeRoutines { public static Guid GetRuntimeVersion { get; } = new Guid("{dc4e6c8d-936d-457f-90e9-af47e229b80c}"); @@ -314,7 +315,7 @@ namespace Mocha.Core public static Guid GetIPAddress { get; } = new Guid("{45411e57-ef6e-44f5-8801-603e567d73d4}"); public static Guid UpdateMochafile { get; } = new Guid("{9c3ae605-b8a0-4e68-9225-96674a9fb34e}"); public static Guid GetGlobalIdentifier { get; } = new Guid("{1a7ebec3-dc02-4c9b-a5df-0c72646453c9}"); - } + } public static class SystemInstanceSetRoutines { // public static Guid SystemInstanceSetRoutine { get; } = new Guid("{d17a6d27-da03-4b5d-9256-f67f978f403d}"); @@ -498,14 +499,14 @@ namespace Mocha.Core } public static class Languages { - public static Guid English { get; } = new Guid ("{68BB6038-A4B5-4EE1-AAE9-326494942062}"); - public static Guid Spanish { get; } = new Guid ("{6dc357cb-37c3-43ed-ae13-6259fb109213}"); - public static Guid French { get; } = new Guid ("{6bf0cf09-87c9-4e21-b360-7eb5a1c279de}"); - public static Guid German { get; } = new Guid ("{c7c1d740-0d3c-493f-ab0b-fe1b42546d0a}"); - public static Guid Italian { get; } = new Guid ("{cf165170-0680-4a41-8f88-88f34b2b1986}"); - public static Guid Chinese { get; } = new Guid ("{6f908a9b-7464-4a16-aed9-7eccb8d39032}"); - public static Guid Japanese { get; } = new Guid ("{1e16de9d-0e49-4a79-b690-4905c46a94cc}"); - public static Guid Korean { get; } = new Guid ("{d03a795e-906b-49ee-87ea-c1bef4b8ee9a}"); + public static Guid English { get; } = new Guid("{68BB6038-A4B5-4EE1-AAE9-326494942062}"); + public static Guid Spanish { get; } = new Guid("{6dc357cb-37c3-43ed-ae13-6259fb109213}"); + public static Guid French { get; } = new Guid("{6bf0cf09-87c9-4e21-b360-7eb5a1c279de}"); + public static Guid German { get; } = new Guid("{c7c1d740-0d3c-493f-ab0b-fe1b42546d0a}"); + public static Guid Italian { get; } = new Guid("{cf165170-0680-4a41-8f88-88f34b2b1986}"); + public static Guid Chinese { get; } = new Guid("{6f908a9b-7464-4a16-aed9-7eccb8d39032}"); + public static Guid Japanese { get; } = new Guid("{1e16de9d-0e49-4a79-b690-4905c46a94cc}"); + public static Guid Korean { get; } = new Guid("{d03a795e-906b-49ee-87ea-c1bef4b8ee9a}"); } public static class GroupLayoutOptions { @@ -532,6 +533,15 @@ namespace Mocha.Core public static Guid ParentClass { get; } = new Guid("{98da8ac1-1fea-4cb4-a278-0c5460e625fd}"); public static Guid DestinationClassForRelationship { get; } = new Guid("{cc6bf015-ea36-4cc5-8855-5047095affee}"); public static Guid Set { get; } = new Guid("{40565aa8-892b-4a36-9a8e-54d55d1c6efe}"); + public static Guid SetA { get; } = new Guid("{6a41b0e4-6089-45f6-8996-901e66d36f53}"); + public static Guid SetB { get; } = new Guid("{4c7f240f-dd51-451d-afe9-73ba42971214}"); + } + public static class SetFunctions + { + public static Guid Union { get; } = new Guid("{62f000a2-9b51-44ba-89dc-1d4735eb0015}"); + public static Guid Intersection { get; } = new Guid("{3445c281-271d-405f-ba7d-65ea1fdff0f0}"); + public static Guid Complement { get; } = new Guid("{fa69b904-315b-4bb1-80a6-c71708fbfde5}"); + public static Guid Difference { get; } = new Guid("{ec67f62d-387c-4179-9b03-0d9b70195688}"); } } } diff --git a/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs b/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs index feef2c3..72f446e 100755 --- a/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs @@ -440,7 +440,7 @@ namespace Mocha.Core public static Guid PUM_Process__invokes__Execute_Update_Method_Binding { get; } = new Guid("{d3e83c17-fd38-46a0-a055-66281eabe9b0}"); public static Guid BEM_Process__uses_loop__Executable_returning_Instance_Set { get; } = new Guid("{0fb2b538-eacb-418a-b7d8-43a584b85952}"); - + 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}"); @@ -462,5 +462,7 @@ namespace Mocha.Core public static Guid Build_Dynamic_Instance_Op__assigns_instance_data_from__Parameter_Assignment { get; } = new Guid("{f5b1f747-fae3-4318-958b-a64f7cdd8b42}"); public static Guid Filter_By_Type_Op__uses__Class { get; } = new Guid("{2f5fddc8-5ab0-4c59-8a83-536a2ce0a30c}"); + + public static Guid Combine_Sets_Op__uses__Set_Function { get; } = new Guid("{b20e54d4-2535-44c0-8c99-0411f27a69df}"); } } diff --git a/mocha-dotnet/src/lib/Mocha.Core/MethodImplementations/InstanceOpMethodImplementation.cs b/mocha-dotnet/src/lib/Mocha.Core/MethodImplementations/InstanceOpMethodImplementation.cs index f4307db..0d76acc 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/MethodImplementations/InstanceOpMethodImplementation.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/MethodImplementations/InstanceOpMethodImplementation.cs @@ -69,6 +69,33 @@ public class InstanceOpMethodImplementation : MethodImplementation context.SetWorkData(workSet, list); } + else if (oms.IsInstanceOf(op, oms.GetInstance(KnownInstanceGuids.InstanceOpClasses.CombineSetsOp))) + { + InstanceHandle setFunction = oms.GetRelatedInstance(op, oms.GetInstance(KnownRelationshipGuids.Combine_Sets_Op__uses__Set_Function)); + InstanceHandle ihSetA = oms.GetInstance(KnownInstanceGuids.WorkSets.SetA); + InstanceHandle ihSetB = oms.GetInstance(KnownInstanceGuids.WorkSets.SetB); + + object? oSetA = oms.Evaluate(context, context.GetWorkData(ihSetA), InstanceHandle.Empty); + object? oSetB = oms.Evaluate(context, context.GetWorkData(ihSetB), InstanceHandle.Empty); + if (oSetA is IEnumerable setA && oSetB is IEnumerable setB) + { + if (setFunction == oms.GetInstance(KnownInstanceGuids.SetFunctions.Union)) + { + IEnumerable ih = setA.Union(setB); + context.SetWorkData(workSet, ih); + } + else if (setFunction == oms.GetInstance(KnownInstanceGuids.SetFunctions.Intersection)) + { + IEnumerable ih = setA.Intersect(setB); + context.SetWorkData(workSet, ih); + } + else if (setFunction == oms.GetInstance(KnownInstanceGuids.SetFunctions.Difference)) + { + IEnumerable ih = setA.Except(setB); + context.SetWorkData(workSet, ih); + } + } + } return workSet; } } diff --git a/mocha-dotnet/src/lib/Mocha.Core/OmsInstanceOpBuilder.cs b/mocha-dotnet/src/lib/Mocha.Core/OmsInstanceOpBuilder.cs index 85ed18b..ccb908b 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/OmsInstanceOpBuilder.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/OmsInstanceOpBuilder.cs @@ -35,4 +35,11 @@ public class OmsInstanceOpBuilder Oms.AssignRelationship(iop, Oms.GetInstance(KnownRelationshipGuids.Filter_By_Type_Op__uses__Class), usesClass.GetHandle()); return new FilterByTypeOp(iop); } + + public CombineSetsOp CreateCombineSetsOp(IInstanceReference setFunction) + { + InstanceHandle iop = Oms.CreateInstanceOf(Oms.GetInstance(KnownInstanceGuids.InstanceOpClasses.CombineSetsOp)); + Oms.AssignRelationship(iop, Oms.GetInstance(KnownRelationshipGuids.Combine_Sets_Op__uses__Set_Function), setFunction.GetHandle()); + return new CombineSetsOp(iop); + } } \ No newline at end of file diff --git a/mocha-dotnet/src/lib/Mocha.Core/Oop/InstanceOps/CombineSetsOp.cs b/mocha-dotnet/src/lib/Mocha.Core/Oop/InstanceOps/CombineSetsOp.cs new file mode 100644 index 0000000..fa2c4c1 --- /dev/null +++ b/mocha-dotnet/src/lib/Mocha.Core/Oop/InstanceOps/CombineSetsOp.cs @@ -0,0 +1,8 @@ +namespace Mocha.Core.Oop.InstanceOps; + +public class CombineSetsOp : InstanceOp +{ + + public CombineSetsOp(InstanceHandle handle) : base(handle) { } + +} \ No newline at end of file diff --git a/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests/InstanceOpMethodTests.cs b/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests/InstanceOpMethodTests.cs index 3159b52..a8c0754 100644 --- a/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests/InstanceOpMethodTests.cs +++ b/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests/InstanceOpMethodTests.cs @@ -111,6 +111,242 @@ namespace Mocha.Core.Tests.MethodTests Assert.That(data.Count(), Is.EqualTo(2)); Assert.That(data.Contains(ihDate1) && data.Contains(ihDate2)); } + + [Test] + public void CombineSetsOp_Intersection() + { + InstanceHandle ihSetA = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA); + InstanceHandle ihSetB = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB); + + InstanceHandle c_TestClass = Oms.GetInstance(TEST_CLASS_GUID); + InstanceHandle iA1 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iA2 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iA3 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iA4 = Oms.CreateInstanceOf(c_TestClass); + + InstanceHandle iB1 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iB2 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iB3 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iB4 = Oms.CreateInstanceOf(c_TestClass); + + InstanceHandle[] irSetA = new InstanceHandle[] + { + iA1, + iA2, + iA3, + iA4, + iB4 + }; + InstanceHandle[] irSetB = new InstanceHandle[] + { + iA2, + iB1, + iB2, + iB3, + iB4 + }; + + OmsContext context = Oms.CreateContext(); + context.SetWorkData(Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA), irSetA); + context.SetWorkData(Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB), irSetB); + + WorkSet workSet = Oms.CreateWorkSet("Test Work Set for Combine Sets"); + + InstanceOp combineSetsOp = ((new OmsInstanceOpBuilder(Oms)).CreateCombineSetsOp(Oms.GetInstance(KnownInstanceGuids.SetFunctions.Intersection))); + InstanceOpMethod iop = Oms.MethodBuilder.CreateInstanceOpMethod(c_TestClass, "combine", "Set A and Set B", AccessModifier.Public, true, workSet, combineSetsOp); + + InstanceHandle workSet2 = Oms.Execute(context, iop); + IEnumerable irSetC = context.GetWorkData>(workSet); + + Assert.That(irSetC.Count(), Is.EqualTo(2)); + Assert.That(irSetC.Contains(iA2) && irSetC.Contains(iB4)); + } + + + [Test] + public void CombineSetsOp_Union() + { + InstanceHandle ihSetA = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA); + InstanceHandle ihSetB = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB); + + InstanceHandle c_TestClass = Oms.GetInstance(TEST_CLASS_GUID); + InstanceHandle iA1 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iA2 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iA3 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iA4 = Oms.CreateInstanceOf(c_TestClass); + + InstanceHandle iB1 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iB2 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iB3 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iB4 = Oms.CreateInstanceOf(c_TestClass); + + InstanceHandle[] irSetA = new InstanceHandle[] + { + iA1, + iA2, + iA3, + iA4, + iB4 + }; + InstanceHandle[] irSetB = new InstanceHandle[] + { + iA2, + iB1, + iB2, + iB3, + iB4 + }; + + OmsContext context = Oms.CreateContext(); + context.SetWorkData(Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA), irSetA); + context.SetWorkData(Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB), irSetB); + + WorkSet workSet = Oms.CreateWorkSet("Test Work Set for Combine Sets"); + + InstanceOp combineSetsOp = ((new OmsInstanceOpBuilder(Oms)).CreateCombineSetsOp(Oms.GetInstance(KnownInstanceGuids.SetFunctions.Union))); + InstanceOpMethod iop = Oms.MethodBuilder.CreateInstanceOpMethod(c_TestClass, "combine", "Set A and Set B", AccessModifier.Public, true, workSet, combineSetsOp); + + InstanceHandle workSet2 = Oms.Execute(context, iop); + IEnumerable irSetC = context.GetWorkData>(workSet); + + Assert.That(irSetC.Count(), Is.EqualTo(8)); + Assert.That(irSetC.Contains(iA2) && irSetC.Contains(iB4)); + } + + + [Test] + public void CombineSetsOp_Difference() + { + InstanceHandle ihSetA = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA); + InstanceHandle ihSetB = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB); + + InstanceHandle c_TestClass = Oms.GetInstance(TEST_CLASS_GUID); + InstanceHandle iA1 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iA2 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iA3 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iA4 = Oms.CreateInstanceOf(c_TestClass); + + InstanceHandle iB1 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iB2 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iB3 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle iB4 = Oms.CreateInstanceOf(c_TestClass); + + InstanceHandle[] irSetA = new InstanceHandle[] + { + iA1, + iA2, + iA3, + iA4, + iB4 + }; + InstanceHandle[] irSetB = new InstanceHandle[] + { + iA2, + iB1, + iB2, + iB3, + iB4 + }; + + OmsContext context = Oms.CreateContext(); + context.SetWorkData(Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA), irSetA); + context.SetWorkData(Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB), irSetB); + + WorkSet workSet = Oms.CreateWorkSet("Test Work Set for Combine Sets"); + + InstanceOp combineSetsOp = ((new OmsInstanceOpBuilder(Oms)).CreateCombineSetsOp(Oms.GetInstance(KnownInstanceGuids.SetFunctions.Difference))); + InstanceOpMethod iop = Oms.MethodBuilder.CreateInstanceOpMethod(c_TestClass, "combine", "Set A and Set B", AccessModifier.Public, true, workSet, combineSetsOp); + + InstanceHandle workSet2 = Oms.Execute(context, iop); + IEnumerable irSetC = context.GetWorkData>(workSet); + + Assert.That(irSetC.Count(), Is.EqualTo(3)); + Assert.That(irSetC.Contains(iA1) && irSetC.Contains(iA3) && irSetC.Contains(iA4)); + } + + + [Test] + public void CombineSetsOp_Union_using_Executables() + { + InstanceHandle ihSetA = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA); + InstanceHandle ihSetB = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB); + + InstanceHandle c_TestClass = Oms.GetInstance(TEST_CLASS_GUID); + + InstanceHandle i_TestClass1 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle i_TestClass2 = Oms.CreateInstanceOf(c_TestClass); + + InstanceHandle i_TestClass3 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle i_TestClass4 = Oms.CreateInstanceOf(c_TestClass); + + WorkSet wsTmp = Oms.CreateWorkSet("Temporary Work Set"); + GetSpecifiedInstancesMethod m1 = Oms.MethodBuilder.CreateGetSpecifiedInstancesMethod(c_TestClass, "get", "Set A Instances", wsTmp, new InstanceHandle[] { i_TestClass1, i_TestClass2 }); + ReturnInstanceSetMethodBinding rsmb1 = m1.CreateMethodBinding(Oms); + + GetSpecifiedInstancesMethod m2 = Oms.MethodBuilder.CreateGetSpecifiedInstancesMethod(c_TestClass, "get", "Set B Instances", wsTmp, new InstanceHandle[] { i_TestClass3, i_TestClass4 }); + ReturnInstanceSetMethodBinding rsmb2 = m2.CreateMethodBinding(Oms); + + OmsContext context = Oms.CreateContext(); + + WorkSet workSet = Oms.CreateWorkSet("Test Work Set for Combine Sets"); + + InstanceOp combineSetsOp = ((new OmsInstanceOpBuilder(Oms)).CreateCombineSetsOp(Oms.GetInstance(KnownInstanceGuids.SetFunctions.Union))); + InstanceOpMethod iop = Oms.MethodBuilder.CreateInstanceOpMethod(c_TestClass, "combine", "Set A and Set B", AccessModifier.Public, true, workSet, combineSetsOp); + MethodBinding mb = iop.CreateMethodBinding(Oms, new KeyValuePair[] + { + new KeyValuePair(ihSetA, rsmb1), + new KeyValuePair(ihSetB, rsmb2) + }); + + InstanceHandle workSet2 = Oms.Execute(context, mb); + IEnumerable irSetC = context.GetWorkData>(workSet); + + Assert.That(irSetC.Count(), Is.EqualTo(4)); + Assert.That(irSetC.Contains(i_TestClass1) && irSetC.Contains(i_TestClass2) && irSetC.Contains(i_TestClass3) && irSetC.Contains(i_TestClass4)); + } + + + + [Test] + public void CombineSetsOp_Difference_using_Executables() + { + InstanceHandle ihSetA = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA); + InstanceHandle ihSetB = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB); + + InstanceHandle c_TestClass = Oms.GetInstance(TEST_CLASS_GUID); + + InstanceHandle i_TestClass1 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle i_TestClass2 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle i_TestClass3 = Oms.CreateInstanceOf(c_TestClass); + InstanceHandle i_TestClass4 = Oms.CreateInstanceOf(c_TestClass); + + WorkSet wsTmp = Oms.CreateWorkSet("Temporary Work Set"); + GetSpecifiedInstancesMethod m1 = Oms.MethodBuilder.CreateGetSpecifiedInstancesMethod(c_TestClass, "get", "Set A Instances", wsTmp, new InstanceHandle[] { i_TestClass1, i_TestClass2, i_TestClass3 }); + ReturnInstanceSetMethodBinding rsmb1 = m1.CreateMethodBinding(Oms); + + GetSpecifiedInstancesMethod m2 = Oms.MethodBuilder.CreateGetSpecifiedInstancesMethod(c_TestClass, "get", "Set B Instances", wsTmp, new InstanceHandle[] { i_TestClass3 }); + ReturnInstanceSetMethodBinding rsmb2 = m2.CreateMethodBinding(Oms); + + OmsContext context = Oms.CreateContext(); + + WorkSet workSet = Oms.CreateWorkSet("Test Work Set for Combine Sets"); + + InstanceOp combineSetsOp = ((new OmsInstanceOpBuilder(Oms)).CreateCombineSetsOp(Oms.GetInstance(KnownInstanceGuids.SetFunctions.Difference))); + InstanceOpMethod iop = Oms.MethodBuilder.CreateInstanceOpMethod(c_TestClass, "combine", "Set A and Set B", AccessModifier.Public, true, workSet, combineSetsOp); + MethodBinding mb = iop.CreateMethodBinding(Oms, new KeyValuePair[] + { + new KeyValuePair(ihSetA, rsmb1), + new KeyValuePair(ihSetB, rsmb2) + }); + + InstanceHandle workSet2 = Oms.Execute(context, mb); + IEnumerable irSetC = context.GetWorkData>(workSet); + + Assert.That(irSetC.Count(), Is.EqualTo(2)); + Assert.That(irSetC.Contains(i_TestClass1) && irSetC.Contains(i_TestClass2)); + } + + } } \ No newline at end of file