From dd1b2c01117bc30b65509909b13968f025b701a1 Mon Sep 17 00:00:00 2001 From: kev Date: Mon, 22 Jan 2024 12:02:14 +0000 Subject: [PATCH] Added LogNot --- CLVMDotNet/src/CLVM/MoreOps.cs | 7 ++-- .../tests/CLVM/Operators/OperatorTests.cs | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/CLVMDotNet/src/CLVM/MoreOps.cs b/CLVMDotNet/src/CLVM/MoreOps.cs index d58a7e9..e13c620 100644 --- a/CLVMDotNet/src/CLVM/MoreOps.cs +++ b/CLVMDotNet/src/CLVM/MoreOps.cs @@ -588,10 +588,13 @@ public static Tuple OpAll(SExp args) return Tuple.Create(cost, r); } - public static Tuple OpLogNot(dynamic args) { - throw new Exception("Not implemented yet!"); + var list = ArgsAsIntList("lognot", args, 1); + BigInteger cost = Costs.LOGNOT_BASE_COST + list[0].Item2 * Costs.LOGNOT_COST_PER_BYTE; + BigInteger s = list[0].Item1; + var inverted = -s - 1; + return MallocCost(cost, SExp.To(inverted)); } public static Tuple OpNot(dynamic args) diff --git a/CLVMDotNet/tests/CLVM/Operators/OperatorTests.cs b/CLVMDotNet/tests/CLVM/Operators/OperatorTests.cs index f5f6ea6..5006a35 100644 --- a/CLVMDotNet/tests/CLVM/Operators/OperatorTests.cs +++ b/CLVMDotNet/tests/CLVM/Operators/OperatorTests.cs @@ -406,6 +406,39 @@ public void OpLogxorInt() #endregion #region OpLogNot + [Fact] + public void OpLogNot() + { + var result = x.Operator.ApplyOperator(new byte[] { 0x1B }, x.SExp.To(new List { 1})); + var atom = result.Item2.AsAtom(); + Assert.Equal(344, result.Item1); + Assert.True(atom!.SequenceEqual(new byte[] + { + 0xFE + })); + } + + [Fact] + public void OpLogNotNegativeNumbers() + { + var result = x.Operator.ApplyOperator(new byte[] { 0x1B }, x.SExp.To(new List { -1111})); + var atom = result.Item2.AsAtom(); + Assert.Equal(357, result.Item1); + Assert.True(atom!.SequenceEqual(new byte[] + { + 0x04, 0x56 + })); + } + + [Fact] + public void OpLogNotThrowsWithNoParameters() + { + var errorMessage = + Assert.Throws(() => + x.Operator.ApplyOperator(new byte[] { 0x1B }, + x.SExp.To(new List { }))); + Assert.Contains("lognot takes exactly 1 arguments", errorMessage.Message); + } #endregion #region OpAny