75 lines
1.3 KiB
Go
75 lines
1.3 KiB
Go
package ds
|
|
|
|
import "testing"
|
|
|
|
func TestStackBasic(t *testing.T) {
|
|
var s Stack[int]
|
|
if !s.Empty() {
|
|
t.Fatal("新建栈应为空")
|
|
}
|
|
if _, ok := s.Pop(); ok {
|
|
t.Fatal("空栈 Pop 应返回 false")
|
|
}
|
|
if _, ok := s.Peek(); ok {
|
|
t.Fatal("空栈 Peek 应返回 false")
|
|
}
|
|
|
|
s.Push(1)
|
|
s.Push(2)
|
|
s.Push(3)
|
|
if s.Len() != 3 {
|
|
t.Fatalf("Len = %d, want 3", s.Len())
|
|
}
|
|
|
|
// LIFO 顺序
|
|
for _, want := range []int{3, 2, 1} {
|
|
got, ok := s.Pop()
|
|
if !ok {
|
|
t.Fatalf("Pop 失败,期望 %d", want)
|
|
}
|
|
if got != want {
|
|
t.Fatalf("Pop = %d, want %d", got, want)
|
|
}
|
|
}
|
|
if !s.Empty() {
|
|
t.Fatal("全部弹出后应为空")
|
|
}
|
|
}
|
|
|
|
func TestStackStringType(t *testing.T) {
|
|
var s Stack[string]
|
|
s.Push("a")
|
|
s.Push("b")
|
|
top, ok := s.Peek()
|
|
if !ok || top != "b" {
|
|
t.Fatalf("Peek = %q,%v, want \"b\",true", top, ok)
|
|
}
|
|
v, _ := s.Pop()
|
|
if v != "b" {
|
|
t.Fatalf("Pop = %q, want \"b\"", v)
|
|
}
|
|
}
|
|
|
|
func TestStackLeakFunctional(t *testing.T) {
|
|
// 功能性验证:大量 push/pop 交替后仍正确,间接验证无状态泄漏。
|
|
var s Stack[int]
|
|
s.Push(1)
|
|
s.Push(2)
|
|
v, _ := s.Pop()
|
|
if v != 2 {
|
|
t.Fatalf("Pop = %d, want 2", v)
|
|
}
|
|
s.Push(3)
|
|
v, _ = s.Pop()
|
|
if v != 3 {
|
|
t.Fatalf("Pop = %d, want 3", v)
|
|
}
|
|
v, _ = s.Pop()
|
|
if v != 1 {
|
|
t.Fatalf("Pop = %d, want 1", v)
|
|
}
|
|
if !s.Empty() {
|
|
t.Fatal("应为空")
|
|
}
|
|
}
|