implementation of Assign Attribute methods - worked the very first time around!

This commit is contained in:
Michael Becker 2024-07-28 15:43:44 -04:00
parent d43bb7dac5
commit e69a5abafb
8 changed files with 100 additions and 6 deletions

View File

@ -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
/// <summary>
/// AA - Asssign Attribute Method - 73
/// </summary>
/// <returns></returns>
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

View File

@ -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}");

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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) { }
}

View File

@ -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<string>(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<string>(irTestClassInstance, a_Name);
Assert.That(value, Is.EqualTo(test_value));
}
}