diff --git a/src/Neo.Compiler.CSharp/Neo.Compiler.CSharp.csproj b/src/Neo.Compiler.CSharp/Neo.Compiler.CSharp.csproj index 5234c8d35..692f0c310 100644 --- a/src/Neo.Compiler.CSharp/Neo.Compiler.CSharp.csproj +++ b/src/Neo.Compiler.CSharp/Neo.Compiler.CSharp.csproj @@ -20,7 +20,7 @@ - + diff --git a/src/Neo.SmartContract.Framework/Services/Runtime.cs b/src/Neo.SmartContract.Framework/Services/Runtime.cs index ae3be73cf..f9d6dc74d 100644 --- a/src/Neo.SmartContract.Framework/Services/Runtime.cs +++ b/src/Neo.SmartContract.Framework/Services/Runtime.cs @@ -105,5 +105,8 @@ public static extern byte AddressVersion [Syscall("System.Runtime.GetNetwork")] public static extern uint GetNetwork(); + + [Syscall("System.Runtime.LoadScript")] + public static extern object LoadScript(ByteString script, CallFlags flags, params object[] args); } } diff --git a/tests/Neo.Compiler.CSharp.UnitTests/UnitTest_IntegerParse.cs b/tests/Neo.Compiler.CSharp.UnitTests/UnitTest_IntegerParse.cs index ba7dd958d..d32af52f5 100644 --- a/tests/Neo.Compiler.CSharp.UnitTests/UnitTest_IntegerParse.cs +++ b/tests/Neo.Compiler.CSharp.UnitTests/UnitTest_IntegerParse.cs @@ -16,26 +16,22 @@ public void SByteParse_Test() var result = testengine.ExecuteTestCaseStandard(methodname, "127"); var value = result.Pop().GetInteger(); - Assert.AreEqual(127, value); + Assert.AreEqual(sbyte.MaxValue, value); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "-128"); value = result.Pop().GetInteger(); - Assert.AreEqual(-128, value); + Assert.AreEqual(sbyte.MinValue, value); //test backspace trip testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, " 20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "128"); @@ -77,26 +73,22 @@ public void ByteParse_Test() var result = testengine.ExecuteTestCaseStandard(methodname, "0"); var value = result.Pop().GetInteger(); - Assert.AreEqual(0, value); + Assert.AreEqual(byte.MinValue, value); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "255"); value = result.Pop().GetInteger(); - Assert.AreEqual(255, value); + Assert.AreEqual(byte.MaxValue, value); //test backspace trip testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, " 20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "-1"); @@ -138,26 +130,22 @@ public void UShortParse_Test() var result = testengine.ExecuteTestCaseStandard(methodname, "0"); var value = result.Pop().GetInteger(); - Assert.AreEqual(0, value); + Assert.AreEqual(ushort.MinValue, value); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "65535"); value = result.Pop().GetInteger(); - Assert.AreEqual(65535, value); + Assert.AreEqual(ushort.MaxValue, value); //test backspace trip testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, " 20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "-1"); @@ -199,26 +187,22 @@ public void ShortParse_Test() var result = testengine.ExecuteTestCaseStandard(methodname, "-32768"); var value = result.Pop().GetInteger(); - Assert.AreEqual(-32768, value); + Assert.AreEqual(short.MinValue, value); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "32767"); value = result.Pop().GetInteger(); - Assert.AreEqual(32767, value); + Assert.AreEqual(short.MaxValue, value); //test backspace trip testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, " 20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "-32769"); @@ -260,26 +244,22 @@ public void ULongParse_Test() var result = testengine.ExecuteTestCaseStandard(methodname, "18446744073709551615"); var value = result.Pop().GetInteger(); - Assert.AreEqual(18446744073709551615, value); + Assert.AreEqual(ulong.MaxValue, value); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "0"); value = result.Pop().GetInteger(); - Assert.AreEqual(0, value); + Assert.AreEqual(ulong.MinValue, value); //test backspace trip testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, " 20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "18446744073709551616"); @@ -319,29 +299,24 @@ public void LongParse_Test() testengine.AddEntryScript("./TestClasses/Contract_IntegerParse.cs"); string methodname = "testLongparse"; - var result = testengine.ExecuteTestCaseStandard(methodname, " -9223372036854775808"); + var result = testengine.ExecuteTestCaseStandard(methodname, "-9223372036854775808"); var value = result.Pop().GetInteger(); - Assert.AreEqual(-9223372036854775808, value); + Assert.AreEqual(long.MinValue, value); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "9223372036854775807"); value = result.Pop().GetInteger(); - Assert.AreEqual(9223372036854775807, value); + Assert.AreEqual(long.MaxValue, value); //test backspace trip testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, " 20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); - + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "-9223372036854775809"); @@ -383,25 +358,21 @@ public void UIntParse_Test() var result = testengine.ExecuteTestCaseStandard(methodname, "4294967295"); var value = result.Pop().GetInteger(); - Assert.AreEqual(4294967295, value); + Assert.AreEqual(uint.MaxValue, value); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "0"); value = result.Pop().GetInteger(); - Assert.AreEqual(0, value); + Assert.AreEqual(uint.MinValue, value); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, " 20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "-1"); @@ -443,25 +414,21 @@ public void IntParse_Test() var result = testengine.ExecuteTestCaseStandard(methodname, "2147483647"); var value = result.Pop().GetInteger(); - Assert.AreEqual(2147483647, value); + Assert.AreEqual(int.MaxValue, value); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "-2147483648"); value = result.Pop().GetInteger(); - Assert.AreEqual(-2147483648, value); + Assert.AreEqual(int.MinValue, value); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, " 20 "); - - value = result.Pop().GetInteger(); - Assert.AreEqual(20, value); + Assert.AreEqual(VMState.FAULT, testengine.State); testengine.Reset(); result = testengine.ExecuteTestCaseStandard(methodname, "2147483648"); diff --git a/tests/Neo.Compiler.CSharp.UnitTests/Utils/TestEngine.cs b/tests/Neo.Compiler.CSharp.UnitTests/Utils/TestEngine.cs index fddd7aab7..3f6991fa6 100644 --- a/tests/Neo.Compiler.CSharp.UnitTests/Utils/TestEngine.cs +++ b/tests/Neo.Compiler.CSharp.UnitTests/Utils/TestEngine.cs @@ -162,7 +162,7 @@ public EvaluationStack ExecuteTestCaseStandard(int offset, ushort rvcount, NefFi Console.WriteLine("op:[" + this.CurrentContext.InstructionPointer.ToString("X04") + "]" + - this.CurrentContext.CurrentInstruction.OpCode); + this.CurrentContext.CurrentInstruction?.OpCode); this.ExecuteNext(); } return this.ResultStack; diff --git a/tests/Neo.SmartContract.Framework.UnitTests/Services/RuntimeTest.cs b/tests/Neo.SmartContract.Framework.UnitTests/Services/RuntimeTest.cs index fcd89d192..c592e933c 100644 --- a/tests/Neo.SmartContract.Framework.UnitTests/Services/RuntimeTest.cs +++ b/tests/Neo.SmartContract.Framework.UnitTests/Services/RuntimeTest.cs @@ -106,6 +106,17 @@ public void Test_InvocationCounter() Assert.AreEqual(0x01, item.GetInteger()); } + [TestMethod] + public void Test_LoadScript() + { + var result = _engine.ExecuteTestCaseStandard("dynamicSum", new StackItem[] { new Integer(1), new Integer(3) }); + Assert.AreEqual(1, result.Count); + + var item = result.Pop(); + Assert.IsInstanceOfType(item, typeof(Integer)); + Assert.AreEqual(4, item.GetInteger()); + } + [TestMethod] public void Test_Time() { diff --git a/tests/Neo.SmartContract.Framework.UnitTests/TestClasses/Contract_Runtime.cs b/tests/Neo.SmartContract.Framework.UnitTests/TestClasses/Contract_Runtime.cs index fd2559d56..56fd54466 100644 --- a/tests/Neo.SmartContract.Framework.UnitTests/TestClasses/Contract_Runtime.cs +++ b/tests/Neo.SmartContract.Framework.UnitTests/TestClasses/Contract_Runtime.cs @@ -135,5 +135,11 @@ public static object GetTransactionScript() var tx = (Transaction)Runtime.ScriptContainer; return tx?.Script; } + + public static int DynamicSum(int a, int b) + { + ByteString script = (ByteString)new byte[] { 0x9E }; // ADD + return (int)Runtime.LoadScript(script, CallFlags.All, new object[] { a, b }); + } } }