Files
2026-05-11 15:53:43 +02:00

110 lines
1.6 KiB
Go

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()
}