neo-go/pkg/vm/ref_counter_test.go
Roman Khimov 1b83dc2476 *: improve for loop syntax
Mostly it's about Go 1.22+ syntax with ranging over integers, but it also
prefers ranging over slices where possible (it makes code a little better to
read).

Notice that we have a number of dangerous loops where slices are mutated
during loop execution, many of these can't be converted since we need proper
length evalutation at every iteration.

Signed-off-by: Roman Khimov <roman@nspcc.ru>
2024-08-30 21:45:18 +03:00

68 lines
1.3 KiB
Go

package vm
import (
"testing"
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
"github.com/stretchr/testify/require"
)
func TestRefCounter_Add(t *testing.T) {
r := newRefCounter()
require.Equal(t, 0, int(*r))
r.Add(stackitem.Null{})
require.Equal(t, 1, int(*r))
r.Add(stackitem.Null{})
require.Equal(t, 2, int(*r)) // count scalar items twice
arr := stackitem.NewArray([]stackitem.Item{stackitem.NewByteArray([]byte{1}), stackitem.NewBool(false)})
r.Add(arr)
require.Equal(t, 5, int(*r)) // array + 2 elements
r.Add(arr)
require.Equal(t, 6, int(*r)) // count only array
r.Remove(arr)
require.Equal(t, 5, int(*r))
r.Remove(arr)
require.Equal(t, 2, int(*r))
m := stackitem.NewMap()
m.Add(stackitem.NewByteArray([]byte("some")), stackitem.NewBool(false))
r.Add(m)
require.Equal(t, 5, int(*r)) // map + key + value
r.Add(m)
require.Equal(t, 6, int(*r)) // map only
r.Remove(m)
require.Equal(t, 5, int(*r))
r.Remove(m)
require.Equal(t, 2, int(*r))
}
func BenchmarkRefCounter_Add(b *testing.B) {
a := stackitem.NewArray(nil)
rc := newRefCounter()
b.ResetTimer()
for range b.N {
rc.Add(a)
}
}
func BenchmarkRefCounter_AddRemove(b *testing.B) {
a := stackitem.NewArray([]stackitem.Item{})
rc := newRefCounter()
b.ResetTimer()
for range b.N {
rc.Add(a)
rc.Remove(a)
}
}