105 lines
2.4 KiB
Go
105 lines
2.4 KiB
Go
|
|
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)
|
||
|
|
}
|
||
|
|
}
|