diff --git a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs index d385890..4a16968 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs @@ -1185,14 +1185,44 @@ public abstract class Oms { return Execute(context, methodBinding.GetHandle()); } - public object? ExecuteReturningAttributeValue(OmsContext context, ReturnAttributeMethodBinding methodBinding) + public object? ExecuteReturningAttributeValue(OmsContext context, ReturnAttributeMethodBinding methodBinding, KeyValuePair[]? parms) { + // override any specified parms we have + Dictionary? oldParms = null; + if (parms != null) + { + oldParms = new Dictionary(); + foreach (KeyValuePair kvp in parms) + { + if (context.HasWorkData(kvp.Key)) + { + oldParms[kvp.Key] = context.GetWorkData(kvp.Key); + } + else + { + oldParms[kvp.Key] = null; + } + + context.SetWorkData(kvp.Key, kvp.Value); + } + } + + // call the internal MethodImplementation InstanceHandle workData = Execute(context, methodBinding.GetHandle()); + + // restore the original parms + if (oldParms != null) + { + foreach (KeyValuePair kvp in oldParms) + { + context.SetWorkData(kvp.Key, kvp.Value); + } + } return context.GetWorkData(workData); } - public T ExecuteReturningAttributeValue(OmsContext context, ReturnAttributeMethodBinding methodBinding, T defaultValue = default(T)) + public T ExecuteReturningAttributeValue(OmsContext context, ReturnAttributeMethodBinding methodBinding, T defaultValue = default(T), KeyValuePair[]? parms = null) { - object? value = ExecuteReturningAttributeValue(context, methodBinding); + object? value = ExecuteReturningAttributeValue(context, methodBinding, parms); if (value is T) { return (T)value; diff --git a/mocha-dotnet/src/lib/Mocha.Core/OmsContext.cs b/mocha-dotnet/src/lib/Mocha.Core/OmsContext.cs index 8e2f55b..82ea2aa 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/OmsContext.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/OmsContext.cs @@ -61,6 +61,10 @@ public class OmsContext private Dictionary _WorkData = new Dictionary(); private Dictionary _GlobalData = new Dictionary(); + public bool HasWorkData(IInstanceReference parm) + { + return _WorkData.ContainsKey(parm.GetHandle()); + } public object? GetWorkData(IInstanceReference parm) { if (_WorkData.ContainsKey(parm.GetHandle())) diff --git a/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests/SystemRoutineTests.cs b/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests/SystemRoutineTests.cs index b96e61b..d86112e 100644 --- a/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests/SystemRoutineTests.cs +++ b/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests/SystemRoutineTests.cs @@ -46,6 +46,32 @@ public class SystemRoutineTests : MethodTestsBase Assert.That(value, Is.EqualTo(TEST_SYSTEM_ATTRIBUTE_ROUTINE_VALUE)); } + [Test] + public void PassParmViaSystemRoutineTest() + { + InstanceHandle irTestClass = Oms.GetInstance(TEST_CLASS_GUID); + OmsMethodBuilder methodBuilder = new OmsMethodBuilder(Oms); + OmsSystemRoutineBuilder systemRoutineBuilder = new OmsSystemRoutineBuilder(Oms); + + SystemAttributeRoutine testSystemAttributeRoutine = systemRoutineBuilder.CreateSystemAttributeRoutine(TEST_SYSTEM_ATTRIBUTE_ROUTINE_GUID, delegate (Oms oms, OmsContext context) + { + string value = context.GetWorkData(oms.GetInstance(KnownAttributeGuids.Text.Token)); + return TEST_SYSTEM_ATTRIBUTE_ROUTINE_VALUE + value; + }); + + GetAttributeBySystemRoutineMethod gasMethod = methodBuilder.CreateGetAttributeBySystemRoutineMethod(irTestClass, "get", "Test System Routine Text Attribute", AccessModifier.Public, true, Oms.GetInstance(KnownAttributeGuids.Text.Value), testSystemAttributeRoutine); + ReturnAttributeMethodBinding gasMethodRamb = methodBuilder.CreateReturnAttributeMethodBinding(gasMethod); + + OmsContext context = Oms.CreateContext(); + string value = Oms.ExecuteReturningAttributeValue(context, gasMethodRamb, null, new KeyValuePair[] + { + // !!! WARNING: do not use 'Value' here as it is the return type attribute of the GAS method and WILL be overwritten after execution !!! + new KeyValuePair(Oms.GetInstance(KnownAttributeGuids.Text.Token), "pqdms") + }); + + Assert.That(value, Is.EqualTo(TEST_SYSTEM_ATTRIBUTE_ROUTINE_VALUE + "pqdms")); + } + [Test] public void GetRandomNumberTest() {