diff --git a/mocha-dotnet/src/lib/Mocha.Zq/ZqParser.cs b/mocha-dotnet/src/lib/Mocha.Zq/ZqParser.cs index 2fc21e9..d99b539 100644 --- a/mocha-dotnet/src/lib/Mocha.Zq/ZqParser.cs +++ b/mocha-dotnet/src/lib/Mocha.Zq/ZqParser.cs @@ -646,7 +646,7 @@ public class ZqParser // is function call string fullyQualifiedName = values[0].Substring(0, values[0].IndexOf('(')); string parmList = values[0].Substring(values[0].IndexOf('(') + 1, values[0].IndexOf(')') - values[0].IndexOf('(') - 1); - val = new ZqMethodCall(new ZqVariableReference(fullyQualifiedName), parmList.Split(new char[] { ',' })); + val = new ZqMethodCall(new ZqVariableReference(fullyQualifiedName), ParseParameterList(parmList)); } else { @@ -670,6 +670,39 @@ public class ZqParser return null; } + private object[] ParseParameterList(string parmList) + { + string[] parms = parmList.Split(new char[] { ',' }); + object[] pp = new object[parms.Length]; + for (int i = 0; i < parms.Length; i++) + { + string parm = parms[i]; + if (parm.StartsWith("[") && parm.EndsWith("]")) + { + parm = parm.Substring(1, parm.Length - 2); + InstanceKey ik = InstanceKey.Parse(parm); + pp[i] = ik; + } + if (parm.StartsWith("'") && parm.EndsWith("'")) + { + pp[i] = parm.Substring(1, parm.Length - 2); + } + else if (parm.Equals("true")) + { + pp[i] = true; + } + else if (parm.Equals("false")) + { + pp[i] = false; + } + else if (Decimal.TryParse(parm, out decimal m)) + { + pp[i] = m; + } + } + return pp; + } + private string ReadBetween(string text, ref int i, char beginChar, char endChar) { StringBuilder sb = new StringBuilder(); diff --git a/mocha-dotnet/tests/Mocha.Zq.Tests/MethodDefinitionTests.cs b/mocha-dotnet/tests/Mocha.Zq.Tests/MethodDefinitionTests.cs index 9b4e1fe..47eb069 100644 --- a/mocha-dotnet/tests/Mocha.Zq.Tests/MethodDefinitionTests.cs +++ b/mocha-dotnet/tests/Mocha.Zq.Tests/MethodDefinitionTests.cs @@ -25,17 +25,25 @@ public class MethodDefinitionTests CommonInstanceSet.instanceByInstanceID('1$770') } + static function testStubFunctionCallWithInstanceKey() : Class = { + + CommonInstanceSet.instanceByInstanceID([1$770]) + + } }"); Assert.That(obj, Is.TypeOf()); - Assert.That(((ZqClass)obj).Functions.Count, Is.EqualTo(2)); + Assert.That(((ZqClass)obj).Functions.Count, Is.EqualTo(3)); Assert.That(((ZqClass)obj).Functions[1], Is.TypeOf()); Assert.That(((ZqSimpleReturnMethod)((ZqClass)obj).Functions[1]).ReturnValue, Is.TypeOf()); Assert.That(((ZqMethodCall)((ZqSimpleReturnMethod)((ZqClass)obj).Functions[1]).ReturnValue).ParmValues.Length, Is.EqualTo(1)); - // FIXME: the text literal, once parsed, should not have '' / "" quotes - Assert.That(((ZqMethodCall)((ZqSimpleReturnMethod)((ZqClass)obj).Functions[1]).ReturnValue).ParmValues[0], Is.EqualTo("'1$770'")); + Assert.That(((ZqMethodCall)((ZqSimpleReturnMethod)((ZqClass)obj).Functions[1]).ReturnValue).ParmValues[0], Is.TypeOf()); + Assert.That(((ZqMethodCall)((ZqSimpleReturnMethod)((ZqClass)obj).Functions[1]).ReturnValue).ParmValues[0], Is.EqualTo("1$770")); + + Assert.That(((ZqMethodCall)((ZqSimpleReturnMethod)((ZqClass)obj).Functions[2]).ReturnValue).ParmValues[0], Is.TypeOf()); + Assert.That(((ZqMethodCall)((ZqSimpleReturnMethod)((ZqClass)obj).Functions[2]).ReturnValue).ParmValues[0], Is.EqualTo(new InstanceKey(1, 770))); } [Test] @@ -74,8 +82,8 @@ public class MethodDefinitionTests Assert.That(obj, Is.TypeOf()); Assert.That(((ZqClass)obj).Functions.Count, Is.EqualTo(1)); - Assert.That(((ZqClass)obj).Functions[0], Is.TypeOf()); - Assert.That(((ZqBuildAttributeMethod)((ZqClass)obj).Functions[0]).InitialValue, Is.EqualTo("Build Attribute Method")); + Assert.That(((ZqClass)obj).Functions[0], Is.TypeOf()); + Assert.That(((ZqSimpleReturnMethod)((ZqClass)obj).Functions[0]).ReturnValue, Is.EqualTo("Build Attribute Method")); }