stario/starring_test.go

105 lines
2.4 KiB
Go
Raw Permalink Normal View History

package stario
import (
"bytes"
"testing"
)
func TestNewStarRingRejectsInvalidCapacity(t *testing.T) {
ring, err := NewStarRing(0)
if err != ErrStarRingInvalidCapacity {
t.Fatalf("unexpected error: %v", err)
}
if ring != nil {
t.Fatal("expected nil ring when capacity is invalid")
}
}
func TestStarRingWriteAndSnapshot(t *testing.T) {
ring, err := NewStarRing(16)
if err != nil {
t.Fatal(err)
}
if n, err := ring.Write([]byte("abc")); err != nil || n != 3 {
t.Fatalf("write failed: n=%d err=%v", n, err)
}
if n, err := ring.WriteString("def"); err != nil || n != 3 {
t.Fatalf("write string failed: n=%d err=%v", n, err)
}
got := ring.Snapshot()
if !bytes.Equal(got, []byte("abcdef")) {
t.Fatalf("unexpected snapshot: %q", got)
}
if ring.Len() != 6 {
t.Fatalf("unexpected ring len: %d", ring.Len())
}
if ring.Capacity() != 16 {
t.Fatalf("unexpected ring capacity: %d", ring.Capacity())
}
}
func TestStarRingOverflowDropsOldestBytesPrecisely(t *testing.T) {
ring, err := NewStarRing(10)
if err != nil {
t.Fatal(err)
}
_, _ = ring.WriteString("abcde")
_, _ = ring.WriteString("fghij")
_, _ = ring.WriteString("kl")
got := ring.Snapshot()
want := []byte("cdefghijkl")
if !bytes.Equal(got, want) {
t.Fatalf("unexpected snapshot after overflow: got %q want %q", got, want)
}
if ring.Len() != len(want) {
t.Fatalf("unexpected ring len after overflow: %d", ring.Len())
}
}
func TestStarRingLargeWriteKeepsTail(t *testing.T) {
ring, err := NewStarRing(5)
if err != nil {
t.Fatal(err)
}
_, _ = ring.WriteString("123")
_, _ = ring.WriteString("456789")
got := ring.Snapshot()
want := []byte("56789")
if !bytes.Equal(got, want) {
t.Fatalf("unexpected snapshot after large write: got %q want %q", got, want)
}
}
func TestStarRingSnapshotIsCopy(t *testing.T) {
ring, err := NewStarRing(8)
if err != nil {
t.Fatal(err)
}
_, _ = ring.WriteString("hello")
first := ring.Snapshot()
first[0] = 'H'
second := ring.Snapshot()
if !bytes.Equal(second, []byte("hello")) {
t.Fatalf("snapshot should not expose internal storage: %q", second)
}
}
func TestStarRingReset(t *testing.T) {
ring, err := NewStarRing(8)
if err != nil {
t.Fatal(err)
}
_, _ = ring.WriteString("hello")
ring.Reset()
if ring.Len() != 0 {
t.Fatalf("expected len=0 after reset, got %d", ring.Len())
}
if got := ring.Snapshot(); len(got) != 0 {
t.Fatalf("expected empty snapshot after reset, got %q", got)
}
}