starlog/internal/runtimex/chan_stack_test.go

65 lines
1.6 KiB
Go
Raw Normal View History

2026-03-19 16:37:57 +08:00
package runtimex
import (
"errors"
"io"
"testing"
)
func TestChanStackPushPop(t *testing.T) {
stack := NewChanStack(2)
if err := stack.Push("a"); err != nil {
t.Fatalf("Push failed: %v", err)
}
if err := stack.Push("b"); err != nil {
t.Fatalf("Push failed: %v", err)
}
if stack.Len() != 2 {
t.Fatalf("expected len=2, got %d", stack.Len())
}
if stack.Free() != 0 {
t.Fatalf("expected free=0, got %d", stack.Free())
}
first, err := stack.Pop()
if err != nil {
t.Fatalf("Pop failed: %v", err)
}
if first.(string) != "a" {
t.Fatalf("unexpected first value: %v", first)
}
second, err := stack.Pop()
if err != nil {
t.Fatalf("Pop failed: %v", err)
}
if second.(string) != "b" {
t.Fatalf("unexpected second value: %v", second)
}
}
func TestChanStackTryPushFull(t *testing.T) {
stack := NewChanStack(1)
if err := stack.TryPush("a"); err != nil {
t.Fatalf("TryPush should succeed on empty stack: %v", err)
}
if err := stack.TryPush("b"); !errors.Is(err, ErrStackFull) {
t.Fatalf("TryPush should return ErrStackFull, got %v", err)
}
}
func TestChanStackCloseBehavior(t *testing.T) {
stack := NewChanStack(1)
if err := stack.Close(); err != nil {
t.Fatalf("Close should succeed first time: %v", err)
}
if err := stack.Close(); !errors.Is(err, ErrStackClosed) {
t.Fatalf("Close should return ErrStackClosed on second call, got %v", err)
}
if err := stack.Push("x"); !errors.Is(err, io.EOF) {
t.Fatalf("Push after close should return io.EOF, got %v", err)
}
if _, err := stack.Pop(); !errors.Is(err, io.EOF) {
t.Fatalf("Pop after close should return io.EOF, got %v", err)
}
}