github.com/lingyao2333/mo-zero@v1.4.1/core/collection/ring_test.go (about)

     1  package collection
     2  
     3  import (
     4  	"sync"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  )
     9  
    10  func TestNewRing(t *testing.T) {
    11  	assert.Panics(t, func() {
    12  		NewRing(0)
    13  	})
    14  }
    15  
    16  func TestRingLess(t *testing.T) {
    17  	ring := NewRing(5)
    18  	for i := 0; i < 3; i++ {
    19  		ring.Add(i)
    20  	}
    21  	elements := ring.Take()
    22  	assert.ElementsMatch(t, []interface{}{0, 1, 2}, elements)
    23  }
    24  
    25  func TestRingMore(t *testing.T) {
    26  	ring := NewRing(5)
    27  	for i := 0; i < 11; i++ {
    28  		ring.Add(i)
    29  	}
    30  	elements := ring.Take()
    31  	assert.ElementsMatch(t, []interface{}{6, 7, 8, 9, 10}, elements)
    32  }
    33  
    34  func TestRingAdd(t *testing.T) {
    35  	ring := NewRing(5051)
    36  	wg := sync.WaitGroup{}
    37  	for i := 1; i <= 100; i++ {
    38  		wg.Add(1)
    39  		go func(i int) {
    40  			defer wg.Done()
    41  			for j := 1; j <= i; j++ {
    42  				ring.Add(i)
    43  			}
    44  		}(i)
    45  	}
    46  	wg.Wait()
    47  	assert.Equal(t, 5050, len(ring.Take()))
    48  }
    49  
    50  func BenchmarkRingAdd(b *testing.B) {
    51  	ring := NewRing(500)
    52  	b.RunParallel(func(pb *testing.PB) {
    53  		for pb.Next() {
    54  			for i := 0; i < b.N; i++ {
    55  				ring.Add(i)
    56  			}
    57  		}
    58  	})
    59  }