VM: Add Sub, Mul, Mod LSH, RSH
This commit is contained in:
parent
c163ae2019
commit
64491a4d83
2 changed files with 92 additions and 0 deletions
|
@ -27,11 +27,46 @@ func (i *Int) Equal(s *Int) bool {
|
||||||
|
|
||||||
// Add will add two stackIntegers together
|
// Add will add two stackIntegers together
|
||||||
func (i *Int) Add(s *Int) (*Int, error) {
|
func (i *Int) Add(s *Int) (*Int, error) {
|
||||||
|
return &Int{
|
||||||
|
val: new(big.Int).Add(i.val, s.val),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sub will subtract two stackIntegers together
|
||||||
|
func (i *Int) Sub(s *Int) (*Int, error) {
|
||||||
return &Int{
|
return &Int{
|
||||||
val: new(big.Int).Sub(i.val, s.val),
|
val: new(big.Int).Sub(i.val, s.val),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mul will multiply two stackIntegers together
|
||||||
|
func (i *Int) Mul(s *Int) (*Int, error) {
|
||||||
|
return &Int{
|
||||||
|
val: new(big.Int).Mul(i.val, s.val),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mod will take the mod of two stackIntegers together
|
||||||
|
func (i *Int) Mod(s *Int) (*Int, error) {
|
||||||
|
return &Int{
|
||||||
|
val: new(big.Int).Mod(i.val, s.val),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rsh will shift the integer b to the right by `n` bits
|
||||||
|
func (i *Int) Rsh(n *Int) (*Int, error) {
|
||||||
|
return &Int{
|
||||||
|
val: new(big.Int).Rsh(i.val, uint(n.val.Int64())),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lsh will shift the integer b to the left by `n` bits
|
||||||
|
func (i *Int) Lsh(n *Int) (*Int, error) {
|
||||||
|
return &Int{
|
||||||
|
val: new(big.Int).Lsh(i.val, uint(n.val.Int64())),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Integer will overwrite the default implementation
|
// Integer will overwrite the default implementation
|
||||||
// to allow go to cast this item as an integer.
|
// to allow go to cast this item as an integer.
|
||||||
func (i *Int) Integer() (*Int, error) {
|
func (i *Int) Integer() (*Int, error) {
|
||||||
|
|
57
pkg/vm/stack/int_test.go
Normal file
57
pkg/vm/stack/int_test.go
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
package stack
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAdd(t *testing.T) {
|
||||||
|
a := testMakeStackInt(t, 10)
|
||||||
|
b := testMakeStackInt(t, 20)
|
||||||
|
expected := testMakeStackInt(t, 30)
|
||||||
|
c, err := a.Add(b)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, true, expected.Equal(c))
|
||||||
|
}
|
||||||
|
func TestSub(t *testing.T) {
|
||||||
|
a := testMakeStackInt(t, 30)
|
||||||
|
b := testMakeStackInt(t, 200)
|
||||||
|
expected := testMakeStackInt(t, 170)
|
||||||
|
c, err := b.Sub(a)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, true, expected.Equal(c))
|
||||||
|
}
|
||||||
|
func TestMul(t *testing.T) {
|
||||||
|
a := testMakeStackInt(t, 10)
|
||||||
|
b := testMakeStackInt(t, 20)
|
||||||
|
expected := testMakeStackInt(t, 200)
|
||||||
|
c, err := a.Mul(b)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, true, expected.Equal(c))
|
||||||
|
}
|
||||||
|
func TestMod(t *testing.T) {
|
||||||
|
a := testMakeStackInt(t, 10)
|
||||||
|
b := testMakeStackInt(t, 20)
|
||||||
|
expected := testMakeStackInt(t, 10)
|
||||||
|
c, err := a.Mod(b)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, true, expected.Equal(c))
|
||||||
|
}
|
||||||
|
func TestLsh(t *testing.T) {
|
||||||
|
a := testMakeStackInt(t, 23)
|
||||||
|
b := testMakeStackInt(t, 8)
|
||||||
|
expected := testMakeStackInt(t, 5888)
|
||||||
|
c, err := a.Lsh(b)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, true, expected.Equal(c))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRsh(t *testing.T) {
|
||||||
|
a := testMakeStackInt(t, 128)
|
||||||
|
b := testMakeStackInt(t, 3)
|
||||||
|
expected := testMakeStackInt(t, 16)
|
||||||
|
c, err := a.Rsh(b)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, true, expected.Equal(c))
|
||||||
|
}
|
Loading…
Reference in a new issue