79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package ds
|
|
|
|
import "testing"
|
|
|
|
func TestDequeBothEnds(t *testing.T) {
|
|
var d Deque[int]
|
|
d.PushBack(2)
|
|
d.PushBack(3)
|
|
d.PushFront(1)
|
|
d.PushFront(0)
|
|
// 队列内容应为 [0,1,2,3]
|
|
if got, _ := d.Front(); got != 0 {
|
|
t.Fatalf("Front = %d, want 0", got)
|
|
}
|
|
if got, _ := d.Back(); got != 3 {
|
|
t.Fatalf("Back = %d, want 3", got)
|
|
}
|
|
if d.Len() != 4 {
|
|
t.Fatalf("Len = %d, want 4", d.Len())
|
|
}
|
|
|
|
// 交替弹出,验证两端 O(1)
|
|
if v, _ := d.PopFront(); v != 0 {
|
|
t.Fatalf("PopFront = %d, want 0", v)
|
|
}
|
|
if v, _ := d.PopBack(); v != 3 {
|
|
t.Fatalf("PopBack = %d, want 3", v)
|
|
}
|
|
if v, _ := d.PopFront(); v != 1 {
|
|
t.Fatalf("PopFront = %d, want 1", v)
|
|
}
|
|
if v, _ := d.PopBack(); v != 2 {
|
|
t.Fatalf("PopBack = %d, want 2", v)
|
|
}
|
|
if !d.Empty() {
|
|
t.Fatal("应为空")
|
|
}
|
|
}
|
|
|
|
func TestDequeGrowAcrossBoundary(t *testing.T) {
|
|
// 跨越 head 边界触发扩容,验证数据顺序不乱。
|
|
var d Deque[int]
|
|
for i := 0; i < 20; i++ {
|
|
d.PushBack(i)
|
|
}
|
|
// 先弹出几个,让 head 前移,再继续插入触发扩容。
|
|
for i := 0; i < 5; i++ {
|
|
_, _ = d.PopFront()
|
|
}
|
|
for i := 20; i < 40; i++ {
|
|
d.PushBack(i)
|
|
}
|
|
// 期望顺序 5..39
|
|
for want := 5; want < 40; want++ {
|
|
got, ok := d.PopFront()
|
|
if !ok || got != want {
|
|
t.Fatalf("PopFront = %d,%v, want %d", got, ok, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDequeString(t *testing.T) {
|
|
var d Deque[string]
|
|
d.PushFront("b")
|
|
d.PushFront("a")
|
|
d.PushBack("c")
|
|
var got []string
|
|
for !d.Empty() {
|
|
v, _ := d.PopFront()
|
|
got = append(got, v)
|
|
}
|
|
want := []string{"a", "b", "c"}
|
|
for i := range want {
|
|
if got[i] != want[i] {
|
|
t.Fatalf("结果[%d] = %q, want %q", i, got[i], want[i])
|
|
}
|
|
}
|
|
}
|