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