7582279077
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
110 lines
1.6 KiB
Go
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()
|
|
}
|