stario/starring_test.go
starainrt c8facb5a03
stario: 提升 Go 1.20 基线与交互/队列稳定性
- 提升 go.mod 基线到 Go 1.20,并补齐对应测试
  - 修正 Passwd / PasswdResponseSignal 语义,Ctrl+C 默认退出当前流程
  - 优化 raw terminal redraw、Restore 与 StopUntil 的边界行为
  - 新增 StarPipe、FrameReader/FrameWriter、ReadFullContext/WriteFullContext/CopyContext、IsTerminal/ReadPasswordContext
  - 收口 StarQueue / StarBuffer 语义,删除 EndWrite,统一 Close / Abort 行为
  - 补齐 signal、timeout、queue、terminal、pipe、buffer 的回归测试与 race 覆盖
2026-04-15 14:35:19 +08:00

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