package eventbus import ( "sync" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestRingBuffer_PushPop(t *testing.T) { ring := NewRingBuffer[int](5) ring.Push(1) ring.Push(2) ring.Push(3) v, ok := ring.Pop() require.True(t, ok) assert.Equal(t, 1, v) v, ok = ring.Pop() require.True(t, ok) assert.Equal(t, 2, v) v, ok = ring.Pop() require.True(t, ok) assert.Equal(t, 3, v) } func TestRingBuffer_Empty(t *testing.T) { ring := NewRingBuffer[int](5) v, ok := ring.Pop() assert.False(t, ok) assert.Equal(t, 0, v) } func TestRingBuffer_OverwriteOldest(t *testing.T) { ring := NewRingBuffer[int](4) ring.Push(1) ring.Push(2) ring.Push(3) ring.Push(4) ring.Push(5) ring.Push(6) var values []int for { v, ok := ring.Pop() if !ok { break } values = append(values, v) } assert.Equal(t, []int{3, 4, 5, 6}, values) } func TestRingBuffer_Len(t *testing.T) { ring := NewRingBuffer[int](5) assert.Equal(t, 0, ring.Len()) ring.Push(1) assert.Equal(t, 1, ring.Len()) ring.Push(2) ring.Push(3) assert.Equal(t, 3, ring.Len()) ring.Pop() assert.Equal(t, 2, ring.Len()) ring.Push(4) ring.Push(5) ring.Push(6) ring.Push(7) assert.Equal(t, 5, ring.Len()) ring.Push(8) assert.Equal(t, 5, ring.Len()) } func TestRingBuffer_Concurrent(t *testing.T) { ring := NewRingBuffer[int](100) var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func(id int) { defer wg.Done() for j := 0; j < 100; j++ { ring.Push(id*100 + j) } }(i) } wg.Add(1) go func() { defer wg.Done() for i := 0; i < 500; i++ { ring.Pop() } }() wg.Wait() }