diff --git a/buffer.go b/buffer.go index bf02f59..88c61a2 100644 --- a/buffer.go +++ b/buffer.go @@ -15,6 +15,9 @@ type RingBuffer struct { // NewRingBuffer creates a ring buffer with the given capacity. func NewRingBuffer(size int) *RingBuffer { + if size < 0 { + size = 0 + } return &RingBuffer{ data: make([]byte, size), size: size, @@ -26,6 +29,10 @@ func (rb *RingBuffer) Write(p []byte) (n int, err error) { rb.mu.Lock() defer rb.mu.Unlock() + if rb.size == 0 { + return len(p), nil + } + for _, b := range p { rb.data[rb.end] = b rb.end = (rb.end + 1) % rb.size diff --git a/buffer_test.go b/buffer_test.go index bbd4f1c..4d4e79f 100644 --- a/buffer_test.go +++ b/buffer_test.go @@ -69,4 +69,18 @@ func TestRingBuffer(t *testing.T) { bytes[0] = 'x' assert.Equal(t, "hello", rb.String()) }) + + t.Run("zero or negative capacity is a no-op", func(t *testing.T) { + for _, size := range []int{0, -1} { + rb := NewRingBuffer(size) + + n, err := rb.Write([]byte("discarded")) + assert.NoError(t, err) + assert.Equal(t, len("discarded"), n) + assert.Equal(t, 0, rb.Cap()) + assert.Equal(t, 0, rb.Len()) + assert.Equal(t, "", rb.String()) + assert.Nil(t, rb.Bytes()) + } + }) }