github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/xsync/pool_test.go (about)

     1  package xsync
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  )
     8  
     9  type poolMock struct {
    10  	items []any
    11  }
    12  
    13  func (p *poolMock) Get() (v any) {
    14  	if len(p.items) == 0 {
    15  		return nil
    16  	}
    17  
    18  	v, p.items = p.items[0], p.items[1:]
    19  
    20  	return v
    21  }
    22  
    23  func (p *poolMock) Put(v any) {
    24  	p.items = append(p.items, v)
    25  }
    26  
    27  func TestPool(t *testing.T) {
    28  	t.Run("Default", func(t *testing.T) {
    29  		p := Pool[int]{
    30  			p: &poolMock{},
    31  		}
    32  		v := p.GetOrNil()
    33  		require.Nil(t, v)
    34  		v = p.GetOrNew()
    35  		require.NotNil(t, v)
    36  		require.Equal(t, 0, *v)
    37  		*v = 123
    38  		p.Put(v)
    39  		v = p.GetOrNew()
    40  		require.NotNil(t, v)
    41  		require.Equal(t, 123, *v)
    42  		v = p.GetOrNil()
    43  		require.Nil(t, v)
    44  	})
    45  	t.Run("New", func(t *testing.T) {
    46  		p := Pool[int]{
    47  			p: &poolMock{},
    48  			New: func() *int {
    49  				v := 123
    50  
    51  				return &v
    52  			},
    53  		}
    54  		v := p.GetOrNil()
    55  		require.Nil(t, v)
    56  		v = p.GetOrNew()
    57  		require.NotNil(t, v)
    58  		require.Equal(t, 123, *v)
    59  		*v = 456
    60  		p.Put(v)
    61  		v = p.GetOrNew()
    62  		require.NotNil(t, v)
    63  		require.Equal(t, 456, *v)
    64  		v = p.GetOrNil()
    65  		require.Nil(t, v)
    66  		v = p.GetOrNew()
    67  		require.NotNil(t, v)
    68  		require.Equal(t, 123, *v)
    69  	})
    70  }