From e69a5abafb942e0bfe4afca878e0b9b924df7cf8 Mon Sep 17 00:00:00 2001 From: Michael Becker Date: Sun, 28 Jul 2024 15:43:44 -0400 Subject: [PATCH] implementation of Assign Attribute methods - worked the very first time around! --- .../src/lib/Mocha.Core/KnownInstanceGuids.cs | 5 +++ .../lib/Mocha.Core/KnownRelationshipGuids.cs | 5 +++ .../AssignAttributeMethodImplementation.cs | 26 ++++++++++++++++ mocha-dotnet/src/lib/Mocha.Core/Oms.cs | 12 +++++-- .../Mini/Modules/MethodsModule.cs | 7 ++++- .../src/lib/Mocha.Core/OmsMethodBuilder.cs | 12 +++++++ .../Oop/Methods/AssignAttributeMethod.cs | 8 +++++ .../tests/Mocha.Core.Tests/MethodTests.cs | 31 +++++++++++++++++-- 8 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 mocha-dotnet/src/lib/Mocha.Core/MethodImplementations/AssignAttributeMethodImplementation.cs create mode 100644 mocha-dotnet/src/lib/Mocha.Core/Oop/Methods/AssignAttributeMethod.cs diff --git a/mocha-dotnet/src/lib/Mocha.Core/KnownInstanceGuids.cs b/mocha-dotnet/src/lib/Mocha.Core/KnownInstanceGuids.cs index 4bdbbe4..5f3b693 100755 --- a/mocha-dotnet/src/lib/Mocha.Core/KnownInstanceGuids.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/KnownInstanceGuids.cs @@ -186,6 +186,11 @@ namespace Mocha.Core public static Guid GetAttributeBySystemRoutineMethod { get; } = new Guid("{9d45eb8c-1fb5-4260-a69c-f99a8f7a70b8}"); // GES - Get Element by System Routine Method - 67 // US - Update by System Routine Method - 68 + /// + /// AA - Asssign Attribute Method - 73 + /// + /// + 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 diff --git a/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs b/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs index e950e53..27acd2d 100755 --- a/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs @@ -134,6 +134,11 @@ namespace Mocha.Core public static Guid Evaluate_Boolean_Expression_Method__has_source_attribute__Method { get; } = new Guid("{45d76d56-01ed-4641-9f68-cfe0c7d0d265}"); public static Guid Evaluate_Boolean_Expression_Method__equal_to_attribute__Method { get; } = new Guid("{0646df91-7e3e-4d59-be71-b978a22ced8e}"); + public static Guid Assign_Attribute_Method__uses__Executable_returning_Attribute { get; } = new Guid("{9313f96e-58af-416f-852e-ef83725057fc}"); + public static Guid Executable_returning_Attribute__used_by__Assign_Attribute_Method { get; } = new Guid("{cd8fd04c-dcdd-4dc8-9d5c-e8f83d080cb8}"); + public static Guid Assign_Attribute_Method__assigns__Attribute { get; } = new Guid("{74061875-8a27-403b-9456-02e52cfd13b2}"); + public static Guid Attribute__assigned_by__Assign_Attribute_Method { get; } = new Guid("{d3b540e8-0f52-4595-bf52-1968637da59a}"); + public static Guid Prompt_Value__has__Prompt { get; } = new Guid("{7CD62362-DDCE-4BFC-87B9-B5499B0BC141}"); public static Guid User__has_display_name__Translatable_Text_Constant { get; } = new Guid("{6C29856C-3B10-4F5B-A291-DD3CA4C04A2F}"); diff --git a/mocha-dotnet/src/lib/Mocha.Core/MethodImplementations/AssignAttributeMethodImplementation.cs b/mocha-dotnet/src/lib/Mocha.Core/MethodImplementations/AssignAttributeMethodImplementation.cs new file mode 100644 index 0000000..a209350 --- /dev/null +++ b/mocha-dotnet/src/lib/Mocha.Core/MethodImplementations/AssignAttributeMethodImplementation.cs @@ -0,0 +1,26 @@ +namespace Mocha.Core.MethodImplementations; + +public class AssignAttributeMethodImplementation : MethodImplementation +{ + public override Guid MethodClassGuid => KnownInstanceGuids.MethodClasses.AssignAttributeMethod; + protected override InstanceHandle ExecuteInternal(Oms oms, OmsContext context, InstanceHandle method) + { + InstanceHandle irForClass = oms.GetRelatedInstance(method, oms.GetInstance(KnownRelationshipGuids.Method__for__Class)); + InstanceHandle irForInstance = (InstanceHandle) context.GetWorkData(irForClass); + + InstanceHandle assignsAttribute = oms.GetRelatedInstance(method, oms.GetInstance(KnownRelationshipGuids.Assign_Attribute_Method__assigns__Attribute)); + + if (assignsAttribute == InstanceHandle.Empty) + { + throw new InvalidOperationException("no assigns Attribute specified for method"); + } + + InstanceHandle assignsFrom = oms.GetRelatedInstance(method, oms.GetInstance(KnownRelationshipGuids.Assign_Attribute_Method__uses__Executable_returning_Attribute)); + InstanceHandle assignsFromValue = oms.Execute(context, assignsFrom); + + // InstanceHandle forInstance = (InstanceHandle) context.GetWorkData(irForClass); + object? value = context.GetWorkData(assignsFromValue); + oms.SetAttributeValue(irForInstance, assignsAttribute, value); + return InstanceHandle.Empty; + } +} \ No newline at end of file diff --git a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs index 6f5c061..034151e 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs @@ -586,9 +586,9 @@ public abstract class Oms implementation.Initialize(this); } - public InstanceHandle Execute(OmsContext context, Method method) + public InstanceHandle Execute(OmsContext context, Method method, InstanceHandle? targetInstance = null) { - return Execute(context, method.Handle); + return Execute(context, method.Handle, targetInstance); } public InstanceHandle Execute(OmsContext context, ReturnInstanceSetMethodBinding methodBinding) { @@ -608,7 +608,7 @@ public abstract class Oms } return defaultValue; } - private InstanceHandle Execute(OmsContext context, InstanceHandle methodOrMethodBinding) + public InstanceHandle Execute(OmsContext context, InstanceHandle methodOrMethodBinding, InstanceHandle? targetInstance = null) { InstanceHandle parentClass = GetParentClass(methodOrMethodBinding); if (IsInstanceOf(methodOrMethodBinding, GetInstance(KnownInstanceGuids.Classes.ReturnAttributeMethodBinding)) @@ -620,6 +620,12 @@ public abstract class Oms { if (methodImplementations.ContainsKey(parentClass)) { + if (targetInstance != null) + { + InstanceHandle hh = targetInstance.GetValueOrDefault(); + InstanceHandle pclassInstance = GetParentClass(hh); + context.SetWorkData(pclassInstance, hh); + } return methodImplementations[parentClass].Execute(this, context, methodOrMethodBinding); } } diff --git a/mocha-dotnet/src/lib/Mocha.Core/OmsImplementations/Mini/Modules/MethodsModule.cs b/mocha-dotnet/src/lib/Mocha.Core/OmsImplementations/Mini/Modules/MethodsModule.cs index f69f72b..62d6ec8 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/OmsImplementations/Mini/Modules/MethodsModule.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/OmsImplementations/Mini/Modules/MethodsModule.cs @@ -14,7 +14,7 @@ public class MethodsModule : MiniOmsModule private InstanceHandle c_Method, c_MethodBinding; private InstanceHandle a_Name, a_Order, a_Verb, a_Static; private InstanceHandle c_ReturnAttributeMethodBinding, c_ReturnInstanceSetMethodBinding; - private InstanceHandle c_BuildAttributeMethod, c_GetAttributeMethod, c_GetSpecifiedInstancesMethod, c_GetAttributeBySystemRoutineMethod; + private InstanceHandle c_BuildAttributeMethod, c_GetAttributeMethod, c_GetSpecifiedInstancesMethod, c_GetAttributeBySystemRoutineMethod, c_AssignAttributeMethod; private InstanceHandle c_AccessModifier, i_AccessModifier_Private, i_AccessModifier_Protected, i_AccessModifier_Public, i_AccessModifier_RootA2; private InstanceHandle c_SystemRoutine, c_SystemAttributeRoutine, c_SystemInstanceSetRoutine; @@ -85,6 +85,11 @@ public class MethodsModule : MiniOmsModule oms.CreateRelationship(c_GetAttributeBySystemRoutineMethod, "uses", c_Instance, KnownRelationshipGuids.Get_Attribute_by_System_Routine_Method__uses__System_Attribute_Routine, false, "used by", KnownRelationshipGuids.System_Attribute_Routine__used_by__Get_Attribute_by_System_Routine_Method); oms.AddSuperClass(c_GetAttributeBySystemRoutineMethod, c_Method); + c_AssignAttributeMethod = oms.CreateClass("AA - Assign Attribute Method", KnownInstanceGuids.MethodClasses.AssignAttributeMethod); + oms.CreateRelationship(c_AssignAttributeMethod, "uses", c_Attribute, KnownRelationshipGuids.Assign_Attribute_Method__uses__Executable_returning_Attribute, true, "used by", KnownRelationshipGuids.Executable_returning_Attribute__used_by__Assign_Attribute_Method); + oms.CreateRelationship(c_AssignAttributeMethod, "assigns", c_Attribute, KnownRelationshipGuids.Assign_Attribute_Method__assigns__Attribute, false, "assigned by", KnownRelationshipGuids.Attribute__assigned_by__Assign_Attribute_Method); + oms.AddSuperClass(c_AssignAttributeMethod, c_Method); + oms.AddAttribute(c_Method, a_Name); oms.AddAttribute(c_Method, a_Verb); oms.AddAttribute(c_Method, a_Static); diff --git a/mocha-dotnet/src/lib/Mocha.Core/OmsMethodBuilder.cs b/mocha-dotnet/src/lib/Mocha.Core/OmsMethodBuilder.cs index 625d9ba..fb107ef 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/OmsMethodBuilder.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/OmsMethodBuilder.cs @@ -86,4 +86,16 @@ public class OmsMethodBuilder Oms.AssignRelationship(method, Oms.GetInstance(KnownRelationshipGuids.Get_Attribute_by_System_Routine_Method__uses__System_Attribute_Routine), usesSystemAttributeRoutine.Handle); return new GetAttributeBySystemRoutineMethod(method); } + + public AssignAttributeMethod CreateAssignAttributeMethod(InstanceHandle forClassInstance, string verb, string name, AccessModifier accessModifier, bool isStatic, ReturnAttributeMethodBinding assignsFromExecutableReturningAttribute, InstanceHandle assignsToAttribute) + { + return CreateAssignAttributeMethod(forClassInstance, verb, name, accessModifier, isStatic, assignsFromExecutableReturningAttribute.Handle, assignsToAttribute); + } + public AssignAttributeMethod CreateAssignAttributeMethod(InstanceHandle forClassInstance, string verb, string name, AccessModifier accessModifier, bool isStatic, InstanceHandle assignsFromExecutableReturningAttribute, InstanceHandle assignsToAttribute) + { + InstanceHandle method = CreateMethodBase(Oms.GetInstance(KnownInstanceGuids.MethodClasses.AssignAttributeMethod), forClassInstance, verb, name, accessModifier, isStatic); + Oms.AssignRelationship(method, Oms.GetInstance(KnownRelationshipGuids.Assign_Attribute_Method__uses__Executable_returning_Attribute), assignsFromExecutableReturningAttribute); + Oms.AssignRelationship(method, Oms.GetInstance(KnownRelationshipGuids.Assign_Attribute_Method__assigns__Attribute), assignsToAttribute); + return new AssignAttributeMethod(method); + } } \ No newline at end of file diff --git a/mocha-dotnet/src/lib/Mocha.Core/Oop/Methods/AssignAttributeMethod.cs b/mocha-dotnet/src/lib/Mocha.Core/Oop/Methods/AssignAttributeMethod.cs new file mode 100644 index 0000000..bdf0832 --- /dev/null +++ b/mocha-dotnet/src/lib/Mocha.Core/Oop/Methods/AssignAttributeMethod.cs @@ -0,0 +1,8 @@ + +namespace Mocha.Core.Oop; + +public class AssignAttributeMethod : Method +{ + public override Guid MethodClassGuid => KnownInstanceGuids.MethodClasses.AssignAttributeMethod; + public AssignAttributeMethod(InstanceHandle handle) : base(handle) { } +} \ No newline at end of file diff --git a/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests.cs b/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests.cs index bd68798..7006355 100644 --- a/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests.cs +++ b/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests.cs @@ -1,4 +1,3 @@ - using System.ComponentModel.DataAnnotations; using Mocha.Core.OmsImplementations.Mini; using Mocha.Core.Oop; @@ -22,7 +21,7 @@ public class MethodTests : OmsTestsBase OmsMethodBuilder builder = new OmsMethodBuilder(Oms); - BuildAttributeMethod ih_BA = builder.CreateBuildAttributeMethod(irTestClass, "build", "Test Attribute", Oms.GetInstance(KnownInstanceGuids.AccessModifiers.Public), true, Oms.GetInstance(KnownAttributeGuids.Text.Name), test_value); + BuildAttributeMethod ih_BA = builder.CreateBuildAttributeMethod(irTestClass, "build", "Test Attribute", AccessModifier.Public, true, Oms.GetInstance(KnownAttributeGuids.Text.Name), test_value); OmsContext context = Oms.CreateContext(); InstanceHandle ih_test = Oms.Execute(context, ih_BA); @@ -152,4 +151,32 @@ public class MethodTests : OmsTestsBase Assert.That((string)value, Is.EqualTo(Oms.RuntimeVersion.ToString())); } + [Test] + public void AssignAttributeMethodTest() + { + InstanceHandle irTestClass = Oms.GetInstance(TEST_CLASS_GUID); + InstanceHandle irTestClassInstance = Oms.CreateInstanceOf(irTestClass); + + InstanceHandle a_Name = Oms.GetInstance(KnownAttributeGuids.Text.Name); + Oms.AddAttribute(irTestClass, a_Name); + + string test_value = "Jackdaws love my big sphinx of quartz."; + + string value = Oms.GetAttributeValue(irTestClassInstance, a_Name); + Assert.That(value, Is.Not.EqualTo(test_value)); + + OmsMethodBuilder builder = new OmsMethodBuilder(Oms); + + BuildAttributeMethod ih_BA = builder.CreateBuildAttributeMethod(irTestClass, "build", "Test Attribute", AccessModifier.Public, true, a_Name, test_value); + ReturnAttributeMethodBinding ramb1 = builder.CreateReturnAttributeMethodBinding(ih_BA); + + AssignAttributeMethod ih_AA = builder.CreateAssignAttributeMethod(irTestClass, "set", "Test Attribute Value to `Jackdaws...`", AccessModifier.Public, true, ramb1, a_Name); + + OmsContext context = Oms.CreateContext(); + Oms.Execute(context, ih_AA, irTestClassInstance); + + value = Oms.GetAttributeValue(irTestClassInstance, a_Name); + Assert.That(value, Is.EqualTo(test_value)); + } + } \ No newline at end of file