Skip to content

Commit

Permalink
fix: add more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
nan01ab committed Jan 19, 2025
1 parent 2f29978 commit 58b274c
Show file tree
Hide file tree
Showing 3 changed files with 148 additions and 4 deletions.
6 changes: 6 additions & 0 deletions tests/Neo.Compiler.CSharp.TestContracts/Contract_Overflow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,11 @@ public class Contract_Overflow : SmartContract.Framework.SmartContract

public static int NegateShortChecked(short a) => checked(-a);
public static int NegateShort(short a) => -a;

public static int NegateAddInt(int a, int b) => -(a + b);
public static int NegateAddIntChecked(int a, int b) => checked(-(a + b));

public static long NegateAddLong(long a, long b) => -(a + b);
public static long NegateAddLongChecked(long a, long b) => checked(-(a + b));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ public abstract class Contract_Overflow(Neo.SmartContract.Testing.SmartContractI
{
#region Compiled data

public static Neo.SmartContract.Manifest.ContractManifest Manifest => Neo.SmartContract.Manifest.ContractManifest.Parse(@"{""name"":""Contract_Overflow"",""groups"":[],""features"":{},""supportedstandards"":[],""abi"":{""methods"":[{""name"":""addInt"",""parameters"":[{""name"":""a"",""type"":""Integer""},{""name"":""b"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":0,""safe"":false},{""name"":""mulInt"",""parameters"":[{""name"":""a"",""type"":""Integer""},{""name"":""b"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":53,""safe"":false},{""name"":""addUInt"",""parameters"":[{""name"":""a"",""type"":""Integer""},{""name"":""b"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":106,""safe"":false},{""name"":""mulUInt"",""parameters"":[{""name"":""a"",""type"":""Integer""},{""name"":""b"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":141,""safe"":false},{""name"":""negateIntChecked"",""parameters"":[{""name"":""a"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":176,""safe"":false},{""name"":""negateInt"",""parameters"":[{""name"":""a"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":191,""safe"":false},{""name"":""negateLongChecked"",""parameters"":[{""name"":""a"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":206,""safe"":false},{""name"":""negateLong"",""parameters"":[{""name"":""a"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":225,""safe"":false},{""name"":""negateShortChecked"",""parameters"":[{""name"":""a"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":244,""safe"":false},{""name"":""negateShort"",""parameters"":[{""name"":""a"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":250,""safe"":false}],""events"":[]},""permissions"":[],""trusts"":[],""extra"":{""nef"":{""optimization"":""All""}}}");
public static Neo.SmartContract.Manifest.ContractManifest Manifest => Neo.SmartContract.Manifest.ContractManifest.Parse(@"{""name"":""Contract_Overflow"",""groups"":[],""features"":{},""supportedstandards"":[],""abi"":{""methods"":[{""name"":""addInt"",""parameters"":[{""name"":""a"",""type"":""Integer""},{""name"":""b"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":0,""safe"":false},{""name"":""mulInt"",""parameters"":[{""name"":""a"",""type"":""Integer""},{""name"":""b"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":53,""safe"":false},{""name"":""addUInt"",""parameters"":[{""name"":""a"",""type"":""Integer""},{""name"":""b"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":106,""safe"":false},{""name"":""mulUInt"",""parameters"":[{""name"":""a"",""type"":""Integer""},{""name"":""b"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":141,""safe"":false},{""name"":""negateIntChecked"",""parameters"":[{""name"":""a"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":176,""safe"":false},{""name"":""negateInt"",""parameters"":[{""name"":""a"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":191,""safe"":false},{""name"":""negateLongChecked"",""parameters"":[{""name"":""a"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":206,""safe"":false},{""name"":""negateLong"",""parameters"":[{""name"":""a"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":225,""safe"":false},{""name"":""negateShortChecked"",""parameters"":[{""name"":""a"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":244,""safe"":false},{""name"":""negateShort"",""parameters"":[{""name"":""a"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":250,""safe"":false},{""name"":""negateAddInt"",""parameters"":[{""name"":""a"",""type"":""Integer""},{""name"":""b"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":256,""safe"":false},{""name"":""negateAddIntChecked"",""parameters"":[{""name"":""a"",""type"":""Integer""},{""name"":""b"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":319,""safe"":false},{""name"":""negateAddLong"",""parameters"":[{""name"":""a"",""type"":""Integer""},{""name"":""b"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":354,""safe"":false},{""name"":""negateAddLongChecked"",""parameters"":[{""name"":""a"",""type"":""Integer""},{""name"":""b"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":449,""safe"":false}],""events"":[]},""permissions"":[],""trusts"":[],""extra"":{""nef"":{""optimization"":""All""}}}");

/// <summary>
/// Optimization: "All"
/// </summary>
public static Neo.SmartContract.NefFile Nef => Neo.IO.Helper.AsSerializable<Neo.SmartContract.NefFile>(Convert.FromBase64String(@"TkVGM1Rlc3RpbmdFbmdpbmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0AAVcAAnh5nkoCAAAAgC4EIgpKAv///38yHgP/////AAAAAJFKAv///38yDAMAAAAAAQAAAJ9AVwACeHmgSgIAAACALgQiCkoC////fzIeA/////8AAAAAkUoC////fzIMAwAAAAABAAAAn0BXAAJ4eZ5KEC4EIg5KA/////8AAAAAMgwD/////wAAAACRQFcAAnh5oEoQLgQiDkoD/////wAAAAAyDAP/////AAAAAJFAVwABeEoCAAAAgCoDOptAVwABeEoCAAAAgCoDQJtAVwABeEoDAAAAAAAAAIAqAzqbQFcAAXhKAwAAAAAAAACAKgNAm0BXAAF4m0BXAAF4m0CeMqEq"));
public static Neo.SmartContract.NefFile Nef => Neo.IO.Helper.AsSerializable<Neo.SmartContract.NefFile>(Convert.FromBase64String(@"TkVGM1Rlc3RpbmdFbmdpbmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3wAVcAAnh5nkoCAAAAgC4EIgpKAv///38yHgP/////AAAAAJFKAv///38yDAMAAAAAAQAAAJ9AVwACeHmgSgIAAACALgQiCkoC////fzIeA/////8AAAAAkUoC////fzIMAwAAAAABAAAAn0BXAAJ4eZ5KEC4EIg5KA/////8AAAAAMgwD/////wAAAACRQFcAAnh5oEoQLgQiDkoD/////wAAAAAyDAP/////AAAAAJFAVwABeEoCAAAAgCoDOptAVwABeEoCAAAAgCoDQJtAVwABeEoDAAAAAAAAAIAqAzqbQFcAAXhKAwAAAAAAAACAKgNAm0BXAAF4m0BXAAF4m0BXAAJ4eZ5KAgAAAIAuBCIKSgL///9/Mh4D/////wAAAACRSgL///9/MgwDAAAAAAEAAACfSgIAAACAKgNAm0BXAAJ4eZ5KAgAAAIAuAzpKAv///38yAzpKAgAAAIAqAzqbQFcAAnh5nkoDAAAAAAAAAIAuBCIOSgP/////////fzIyBP//////////AAAAAAAAAACRSgP/////////fzIUBAAAAAAAAAAAAQAAAAAAAACfSgMAAAAAAAAAgCoDQJtAVwACeHmeSgMAAAAAAAAAgC4DOkoD/////////38yAzpKAwAAAAAAAACAKgM6m0D1Twbi"));

#endregion

Expand Down Expand Up @@ -123,6 +123,126 @@ public abstract class Contract_Overflow(Neo.SmartContract.Testing.SmartContractI
[DisplayName("mulUInt")]
public abstract BigInteger? MulUInt(BigInteger? a, BigInteger? b);

/// <summary>
/// Unsafe method
/// </summary>
/// <remarks>
/// Script: VwACeHmeSgIAAACALgQiCkoC////fzIeA/////8AAAAAkUoC////fzIMAwAAAAABAAAAn0oCAAAAgCoDQJtA
/// INITSLOT 0002 [64 datoshi]
/// LDARG0 [2 datoshi]
/// LDARG1 [2 datoshi]
/// ADD [8 datoshi]
/// DUP [2 datoshi]
/// PUSHINT32 00000080 [1 datoshi]
/// JMPGE 04 [2 datoshi]
/// JMP 0A [2 datoshi]
/// DUP [2 datoshi]
/// PUSHINT32 FFFFFF7F [1 datoshi]
/// JMPLE 1E [2 datoshi]
/// PUSHINT64 FFFFFFFF00000000 [1 datoshi]
/// AND [8 datoshi]
/// DUP [2 datoshi]
/// PUSHINT32 FFFFFF7F [1 datoshi]
/// JMPLE 0C [2 datoshi]
/// PUSHINT64 0000000001000000 [1 datoshi]
/// SUB [8 datoshi]
/// DUP [2 datoshi]
/// PUSHINT32 00000080 [1 datoshi]
/// JMPNE 03 [2 datoshi]
/// RET [0 datoshi]
/// NEGATE [4 datoshi]
/// RET [0 datoshi]
/// </remarks>
[DisplayName("negateAddInt")]
public abstract BigInteger? NegateAddInt(BigInteger? a, BigInteger? b);

/// <summary>
/// Unsafe method
/// </summary>
/// <remarks>
/// Script: VwACeHmeSgIAAACALgM6SgL///9/MgM6SgIAAACAKgM6m0A=
/// INITSLOT 0002 [64 datoshi]
/// LDARG0 [2 datoshi]
/// LDARG1 [2 datoshi]
/// ADD [8 datoshi]
/// DUP [2 datoshi]
/// PUSHINT32 00000080 [1 datoshi]
/// JMPGE 03 [2 datoshi]
/// THROW [512 datoshi]
/// DUP [2 datoshi]
/// PUSHINT32 FFFFFF7F [1 datoshi]
/// JMPLE 03 [2 datoshi]
/// THROW [512 datoshi]
/// DUP [2 datoshi]
/// PUSHINT32 00000080 [1 datoshi]
/// JMPNE 03 [2 datoshi]
/// THROW [512 datoshi]
/// NEGATE [4 datoshi]
/// RET [0 datoshi]
/// </remarks>
[DisplayName("negateAddIntChecked")]
public abstract BigInteger? NegateAddIntChecked(BigInteger? a, BigInteger? b);

/// <summary>
/// Unsafe method
/// </summary>
/// <remarks>
/// Script: VwACeHmeSgMAAAAAAAAAgC4EIg5KA/////////9/MjIE//////////8AAAAAAAAAAJFKA/////////9/MhQEAAAAAAAAAAABAAAAAAAAAJ9KAwAAAAAAAACAKgNAm0A=
/// INITSLOT 0002 [64 datoshi]
/// LDARG0 [2 datoshi]
/// LDARG1 [2 datoshi]
/// ADD [8 datoshi]
/// DUP [2 datoshi]
/// PUSHINT64 0000000000000080 [1 datoshi]
/// JMPGE 04 [2 datoshi]
/// JMP 0E [2 datoshi]
/// DUP [2 datoshi]
/// PUSHINT64 FFFFFFFFFFFFFF7F [1 datoshi]
/// JMPLE 32 [2 datoshi]
/// PUSHINT128 FFFFFFFFFFFFFFFF0000000000000000 [4 datoshi]
/// AND [8 datoshi]
/// DUP [2 datoshi]
/// PUSHINT64 FFFFFFFFFFFFFF7F [1 datoshi]
/// JMPLE 14 [2 datoshi]
/// PUSHINT128 00000000000000000100000000000000 [4 datoshi]
/// SUB [8 datoshi]
/// DUP [2 datoshi]
/// PUSHINT64 0000000000000080 [1 datoshi]
/// JMPNE 03 [2 datoshi]
/// RET [0 datoshi]
/// NEGATE [4 datoshi]
/// RET [0 datoshi]
/// </remarks>
[DisplayName("negateAddLong")]
public abstract BigInteger? NegateAddLong(BigInteger? a, BigInteger? b);

/// <summary>
/// Unsafe method
/// </summary>
/// <remarks>
/// Script: VwACeHmeSgMAAAAAAAAAgC4DOkoD/////////38yAzpKAwAAAAAAAACAKgM6m0A=
/// INITSLOT 0002 [64 datoshi]
/// LDARG0 [2 datoshi]
/// LDARG1 [2 datoshi]
/// ADD [8 datoshi]
/// DUP [2 datoshi]
/// PUSHINT64 0000000000000080 [1 datoshi]
/// JMPGE 03 [2 datoshi]
/// THROW [512 datoshi]
/// DUP [2 datoshi]
/// PUSHINT64 FFFFFFFFFFFFFF7F [1 datoshi]
/// JMPLE 03 [2 datoshi]
/// THROW [512 datoshi]
/// DUP [2 datoshi]
/// PUSHINT64 0000000000000080 [1 datoshi]
/// JMPNE 03 [2 datoshi]
/// THROW [512 datoshi]
/// NEGATE [4 datoshi]
/// RET [0 datoshi]
/// </remarks>
[DisplayName("negateAddLongChecked")]
public abstract BigInteger? NegateAddLongChecked(BigInteger? a, BigInteger? b);

/// <summary>
/// Unsafe method
/// </summary>
Expand Down
22 changes: 20 additions & 2 deletions tests/Neo.Compiler.CSharp.UnitTests/UnitTest_Overflow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,16 @@ public void Test_MulUInt()
[TestMethod]
public void Test_NegateChecked()
{
Assert.AreEqual(-2147483647, Contract.NegateIntChecked(2147483647));
Assert.AreEqual(-2147483647, Contract.NegateIntChecked(int.MaxValue));
Assert.AreEqual(-2147483647, Contract.NegateInt(int.MaxValue));

// VMUnhandledException -int.MinValue
Assert.ThrowsException<TestException>(() => Contract.NegateIntChecked(int.MinValue));

Assert.AreEqual(-9223372036854775807, Contract.NegateLongChecked(9223372036854775807));
Assert.AreEqual(-long.MaxValue, Contract.NegateLongChecked(long.MaxValue));
Assert.AreEqual(-long.MaxValue, Contract.NegateLong(long.MaxValue));

// VMUnhandledException -long.MinValue
Assert.ThrowsException<TestException>(() => Contract.NegateLongChecked(long.MinValue));

// -short -> int
Expand All @@ -72,6 +76,20 @@ public void Test_NegateChecked()

// it is different for short.MinValue, because `-short` is an int
Assert.AreEqual(32768, unchecked(-short.MinValue));


// add and negate
Assert.AreEqual(-2147483648, Contract.NegateAddInt(int.MaxValue, 1));
Assert.ThrowsException<TestException>(() => Contract.NegateAddIntChecked(int.MaxValue, 1));

Assert.AreEqual(-9223372036854775808, Contract.NegateAddLong(long.MaxValue, 1));
Assert.ThrowsException<TestException>(() => Contract.NegateAddLongChecked(long.MaxValue, 1));

Assert.AreEqual(-2147483648, Contract.NegateAddInt(-2147483647, -1));
Assert.ThrowsException<TestException>(() => Contract.NegateAddIntChecked(-2147483647, -1));

Assert.AreEqual(-9223372036854775808, Contract.NegateAddLong(-9223372036854775807, -1));
Assert.ThrowsException<TestException>(() => Contract.NegateAddLongChecked(-9223372036854775807, -1));
}
}
}

0 comments on commit 58b274c

Please sign in to comment.