mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-12-18 05:44:43 +00:00
29586f2aa7
Refactor HaveInputsDuplicate() out of the core and Blockchain, it doesn't depend on the Blockchain state. Make it more efficient.
144 lines
5.5 KiB
Go
144 lines
5.5 KiB
Go
package transaction
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/CityOfZion/neo-go/pkg/util"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestGroupInputsByPrevHash0(t *testing.T) {
|
|
inputs := make([]Input, 0)
|
|
res := GroupInputsByPrevHash(inputs)
|
|
require.Equal(t, 0, len(res))
|
|
}
|
|
|
|
func TestGroupInputsByPrevHash1(t *testing.T) {
|
|
inputs := make([]Input, 0)
|
|
hash, err := util.Uint256DecodeStringLE("46168f963d6d8168a870405f66cc9e13a235791013b8ee2f90cc20a8293bd1af")
|
|
require.NoError(t, err)
|
|
inputs = append(inputs, Input{PrevHash: hash, PrevIndex: 42})
|
|
res := GroupInputsByPrevHash(inputs)
|
|
require.Equal(t, 1, len(res))
|
|
require.Equal(t, 1, len(res[0]))
|
|
assert.Equal(t, hash, res[0][0].PrevHash)
|
|
assert.Equal(t, uint16(42), res[0][0].PrevIndex)
|
|
}
|
|
|
|
func TestGroupInputsByPrevHashMany(t *testing.T) {
|
|
hash1, err := util.Uint256DecodeStringBE("a83ba6ede918a501558d3170a124324aedc89909e64c4ff2c6f863094f980b25")
|
|
require.NoError(t, err)
|
|
hash2, err := util.Uint256DecodeStringBE("629397158f852e838077bb2715b13a2e29b0a51c2157e5466321b70ed7904ce9")
|
|
require.NoError(t, err)
|
|
hash3, err := util.Uint256DecodeStringBE("caa41245c3e48ddc13dabe989ba8fbc59418e9228fef9efb62855b0b17d7448b")
|
|
require.NoError(t, err)
|
|
inputs := make([]Input, 0)
|
|
for i := 0; i < 10; i++ {
|
|
inputs = append(inputs, Input{PrevHash: hash1, PrevIndex: uint16(i)})
|
|
inputs = append(inputs, Input{PrevHash: hash2, PrevIndex: uint16(i)})
|
|
inputs = append(inputs, Input{PrevHash: hash3, PrevIndex: uint16(i)})
|
|
}
|
|
for i := 15; i < 20; i++ {
|
|
inputs = append(inputs, Input{PrevHash: hash3, PrevIndex: uint16(i)})
|
|
}
|
|
for i := 10; i < 15; i++ {
|
|
inputs = append(inputs, Input{PrevHash: hash2, PrevIndex: uint16(i)})
|
|
inputs = append(inputs, Input{PrevHash: hash3, PrevIndex: uint16(i)})
|
|
}
|
|
seen := make(map[uint16]bool)
|
|
res := GroupInputsByPrevHash(inputs)
|
|
require.Equal(t, 3, len(res))
|
|
assert.Equal(t, hash2, res[0][0].PrevHash)
|
|
assert.Equal(t, 15, len(res[0]))
|
|
for i := range res[0] {
|
|
assert.Equal(t, res[0][i].PrevHash, res[0][0].PrevHash)
|
|
assert.Equal(t, false, seen[res[0][i].PrevIndex])
|
|
seen[res[0][i].PrevIndex] = true
|
|
}
|
|
seen = make(map[uint16]bool)
|
|
assert.Equal(t, hash1, res[1][0].PrevHash)
|
|
assert.Equal(t, 10, len(res[1]))
|
|
for i := range res[1] {
|
|
assert.Equal(t, res[1][i].PrevHash, res[1][0].PrevHash)
|
|
assert.Equal(t, false, seen[res[1][i].PrevIndex])
|
|
seen[res[1][i].PrevIndex] = true
|
|
}
|
|
seen = make(map[uint16]bool)
|
|
assert.Equal(t, hash3, res[2][0].PrevHash)
|
|
assert.Equal(t, 20, len(res[2]))
|
|
for i := range res[2] {
|
|
assert.Equal(t, res[2][i].PrevHash, res[2][0].PrevHash)
|
|
assert.Equal(t, false, seen[res[2][i].PrevIndex])
|
|
seen[res[2][i].PrevIndex] = true
|
|
}
|
|
}
|
|
|
|
func TestHaveDuplicateInputs0(t *testing.T) {
|
|
inputs := make([]Input, 0)
|
|
require.False(t, HaveDuplicateInputs(inputs))
|
|
}
|
|
|
|
func TestHaveDuplicateInputs1(t *testing.T) {
|
|
inputs := make([]Input, 0)
|
|
hash, err := util.Uint256DecodeStringLE("46168f963d6d8168a870405f66cc9e13a235791013b8ee2f90cc20a8293bd1af")
|
|
require.NoError(t, err)
|
|
inputs = append(inputs, Input{PrevHash: hash, PrevIndex: 42})
|
|
require.False(t, HaveDuplicateInputs(inputs))
|
|
}
|
|
|
|
func TestHaveDuplicateInputs2True(t *testing.T) {
|
|
inputs := make([]Input, 0)
|
|
hash, err := util.Uint256DecodeStringLE("46168f963d6d8168a870405f66cc9e13a235791013b8ee2f90cc20a8293bd1af")
|
|
require.NoError(t, err)
|
|
inputs = append(inputs, Input{PrevHash: hash, PrevIndex: 42})
|
|
inputs = append(inputs, Input{PrevHash: hash, PrevIndex: 42})
|
|
require.True(t, HaveDuplicateInputs(inputs))
|
|
}
|
|
|
|
func TestHaveDuplicateInputs2FalseInd(t *testing.T) {
|
|
inputs := make([]Input, 0)
|
|
hash, err := util.Uint256DecodeStringLE("46168f963d6d8168a870405f66cc9e13a235791013b8ee2f90cc20a8293bd1af")
|
|
require.NoError(t, err)
|
|
inputs = append(inputs, Input{PrevHash: hash, PrevIndex: 42})
|
|
inputs = append(inputs, Input{PrevHash: hash, PrevIndex: 41})
|
|
require.False(t, HaveDuplicateInputs(inputs))
|
|
}
|
|
|
|
func TestHaveDuplicateInputs2FalseHash(t *testing.T) {
|
|
inputs := make([]Input, 0)
|
|
hash1, err := util.Uint256DecodeStringBE("a83ba6ede918a501558d3170a124324aedc89909e64c4ff2c6f863094f980b25")
|
|
require.NoError(t, err)
|
|
hash2, err := util.Uint256DecodeStringBE("629397158f852e838077bb2715b13a2e29b0a51c2157e5466321b70ed7904ce9")
|
|
require.NoError(t, err)
|
|
inputs = append(inputs, Input{PrevHash: hash1, PrevIndex: 42})
|
|
inputs = append(inputs, Input{PrevHash: hash2, PrevIndex: 42})
|
|
require.False(t, HaveDuplicateInputs(inputs))
|
|
}
|
|
|
|
func TestHaveDuplicateInputsMFalse(t *testing.T) {
|
|
inputs := make([]Input, 0)
|
|
hash1, err := util.Uint256DecodeStringBE("a83ba6ede918a501558d3170a124324aedc89909e64c4ff2c6f863094f980b25")
|
|
require.NoError(t, err)
|
|
hash2, err := util.Uint256DecodeStringBE("629397158f852e838077bb2715b13a2e29b0a51c2157e5466321b70ed7904ce9")
|
|
require.NoError(t, err)
|
|
for i := 0; i < 10; i++ {
|
|
inputs = append(inputs, Input{PrevHash: hash1, PrevIndex: uint16(i)})
|
|
inputs = append(inputs, Input{PrevHash: hash2, PrevIndex: uint16(i)})
|
|
}
|
|
require.False(t, HaveDuplicateInputs(inputs))
|
|
}
|
|
|
|
func TestHaveDuplicateInputsMTrue(t *testing.T) {
|
|
inputs := make([]Input, 0)
|
|
hash1, err := util.Uint256DecodeStringBE("a83ba6ede918a501558d3170a124324aedc89909e64c4ff2c6f863094f980b25")
|
|
require.NoError(t, err)
|
|
hash2, err := util.Uint256DecodeStringBE("629397158f852e838077bb2715b13a2e29b0a51c2157e5466321b70ed7904ce9")
|
|
require.NoError(t, err)
|
|
for i := 0; i < 10; i++ {
|
|
inputs = append(inputs, Input{PrevHash: hash1, PrevIndex: uint16(i)})
|
|
inputs = append(inputs, Input{PrevHash: hash2, PrevIndex: uint16(i)})
|
|
}
|
|
inputs = append(inputs, Input{PrevHash: hash1, PrevIndex: 0})
|
|
require.True(t, HaveDuplicateInputs(inputs))
|
|
}
|