github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/vm/ref_counter_test.go (about)

     1  package vm
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestRefCounter_Add(t *testing.T) {
    11  	r := newRefCounter()
    12  
    13  	require.Equal(t, 0, int(*r))
    14  
    15  	r.Add(stackitem.Null{})
    16  	require.Equal(t, 1, int(*r))
    17  
    18  	r.Add(stackitem.Null{})
    19  	require.Equal(t, 2, int(*r)) // count scalar items twice
    20  
    21  	arr := stackitem.NewArray([]stackitem.Item{stackitem.NewByteArray([]byte{1}), stackitem.NewBool(false)})
    22  	r.Add(arr)
    23  	require.Equal(t, 5, int(*r)) // array + 2 elements
    24  
    25  	r.Add(arr)
    26  	require.Equal(t, 6, int(*r)) // count only array
    27  
    28  	r.Remove(arr)
    29  	require.Equal(t, 5, int(*r))
    30  
    31  	r.Remove(arr)
    32  	require.Equal(t, 2, int(*r))
    33  
    34  	m := stackitem.NewMap()
    35  	m.Add(stackitem.NewByteArray([]byte("some")), stackitem.NewBool(false))
    36  	r.Add(m)
    37  	require.Equal(t, 5, int(*r)) // map + key + value
    38  
    39  	r.Add(m)
    40  	require.Equal(t, 6, int(*r)) // map only
    41  
    42  	r.Remove(m)
    43  	require.Equal(t, 5, int(*r))
    44  
    45  	r.Remove(m)
    46  	require.Equal(t, 2, int(*r))
    47  }
    48  
    49  func BenchmarkRefCounter_Add(b *testing.B) {
    50  	a := stackitem.NewArray(nil)
    51  	rc := newRefCounter()
    52  
    53  	b.ResetTimer()
    54  	for i := 0; i < b.N; i++ {
    55  		rc.Add(a)
    56  	}
    57  }
    58  
    59  func BenchmarkRefCounter_AddRemove(b *testing.B) {
    60  	a := stackitem.NewArray([]stackitem.Item{})
    61  	rc := newRefCounter()
    62  
    63  	b.ResetTimer()
    64  	for i := 0; i < b.N; i++ {
    65  		rc.Add(a)
    66  		rc.Remove(a)
    67  	}
    68  }