From d555ac984f515056a5d2f09bdab526dbd73321db Mon Sep 17 00:00:00 2001 From: Michael Becker Date: Wed, 22 Oct 2025 14:37:48 -0400 Subject: [PATCH] move parameter assignment logic into separate function --- mocha-dotnet/src/lib/Mocha.Core/Oms.cs | 78 +++++++++++++++++--------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs index 2657f8c..e196e45 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs @@ -1305,32 +1305,7 @@ public abstract class Oms */ { IEnumerable parameterAssignments = GetRelatedInstances(methodOrMethodBinding, GetInstance(KnownRelationshipGuids.Method_Binding__has__Parameter_Assignment)); - foreach (InstanceHandle parm in parameterAssignments) - { - InstanceHandle assignsToParm = GetRelatedInstance(parm, GetInstance(KnownRelationshipGuids.Parameter_Assignment__assigns_to__Work_Data)); - - IInstanceReference assignsFromWorkData = GetRelatedInstance(parm, GetInstance(KnownRelationshipGuids.Parameter_Assignment__assigns_from__Executable_returning_Work_Data)); - if (assignsFromWorkData == null) - { - Console.Error.WriteLine("oms: error: assigns from work data not set for parameter assignment '{0}'", parm.GlobalIdentifier); - continue; - } - - if (IsInstanceOf(assignsFromWorkData, GetInstance(KnownInstanceGuids.Classes.Class))) - { - assignsFromWorkData = context.GetWorkData(assignsFromWorkData); - } - - if (IsInstanceOf(assignsFromWorkData, GetInstance(KnownInstanceGuids.Classes.WorkSet))) - { - bool evaluateWorkSet = GetAttributeValue(parm, GetInstance(KnownAttributeGuids.Boolean.EvaluateWorkSet)); - if (evaluateWorkSet) - { - assignsFromWorkData = context.GetWorkData(assignsFromWorkData); - } - } - context.SetWorkData(assignsToParm, assignsFromWorkData); - } + AssignParameters(context, parameterAssignments); InstanceHandle relatedMethod = GetRelatedInstance(methodOrMethodBinding, GetInstance(KnownRelationshipGuids.Method_Binding__executes__Method)); InstanceHandle relatedMethod_for_Class = GetRelatedInstance(relatedMethod, GetInstance(KnownRelationshipGuids.Method__for__Class)); @@ -1451,6 +1426,57 @@ public abstract class Oms } } + private void AssignParameters(OmsContext context, IEnumerable parameterAssignments) + { + foreach (InstanceHandle parm in parameterAssignments) + { + InstanceHandle assignsToParm = GetRelatedInstance(parm, GetInstance(KnownRelationshipGuids.Parameter_Assignment__assigns_to__Work_Data)); + IInstanceReference assignsFromWorkData = GetRelatedInstance(parm, GetInstance(KnownRelationshipGuids.Parameter_Assignment__assigns_from__Executable_returning_Work_Data)); + + if (assignsFromWorkData == null) + { + Console.Error.WriteLine("oms: error: assigns from work data not set for parameter assignment '{0}'", parm.GlobalIdentifier); + continue; + } + + // there are several possibilities: + + // `assigns to Parm` is a Class which is an Attribute. `assigns from Work Data` is an Attribute. + // in this case, we should set the work data to the value of the work data pointed to by `assigns from` + // `Token` := `User Name` -> `Token` = "testinguser" + // + // `assigns to Parm` is a Class. `assigns from Work Data` is a Class which is NOT an Attribute. + // just use the ref as-is + // `System User` := `User` -> `System User` = `User` + // + // `Worker who can Resign` := `Current Signed In Worker` -> `Worker who can Resign` = `Steve` + + + if (IsInstanceOf(assignsToParm, GetInstance(KnownInstanceGuids.Classes.Attribute)) && IsInstanceOf(assignsFromWorkData, GetInstance(KnownInstanceGuids.Classes.Attribute))) + { + // if `assigns to Parm` is a Class which inherits from Attribute, and `assigns from Work Data` is an Attribute, then assign the underlying work data + context.SetWorkData(assignsToParm, context.GetWorkData(assignsFromWorkData)); + } + else + { + if (IsInstanceOf(assignsFromWorkData, GetInstance(KnownInstanceGuids.Classes.Class))) + { + assignsFromWorkData = context.GetWorkData(assignsFromWorkData); + } + + if (IsInstanceOf(assignsFromWorkData, GetInstance(KnownInstanceGuids.Classes.WorkSet))) + { + bool evaluateWorkSet = GetAttributeValue(parm, GetInstance(KnownAttributeGuids.Boolean.EvaluateWorkSet)); + if (evaluateWorkSet) + { + assignsFromWorkData = context.GetWorkData(assignsFromWorkData); + } + } + context.SetWorkData(assignsToParm, assignsFromWorkData); + } + } + } + private InstanceHandle ExecuteMethodBinding(OmsContext context, InstanceHandle methodBinding, IInstanceReference? targetInstance = null) { InstanceHandle method = GetRelatedInstance(methodBinding, GetInstance(KnownRelationshipGuids.Method_Binding__executes__Method));