package pqueue import ( "testing" "github.com/davecgh/go-spew/spew" "474420502.top/eson/structure/compare" ) func TestQueuePush(t *testing.T) { pq := New(compare.Int) for _, v := range []int{32, 10, 53, 78, 90, 1, 4} { pq.Push(v) if v, ok := pq.Top(); ok { } else { t.Error(v) } } if v, ok := pq.Top(); ok { if v != 90 { t.Error(v) } } else { t.Error(v) } } func TestQueuePop(t *testing.T) { pq := New(compare.Int) for _, v := range []int{32, 10, 53, 78, 90, 1, 4} { pq.Push(v) if v, ok := pq.Top(); ok { } else { t.Error(v) } } l := []int{90, 78, 53, 32, 10, 4, 1} for _, lv := range l { if v, ok := pq.Pop(); ok { if v != lv { t.Error(v) } } else { t.Error(v) } } if v, ok := pq.Pop(); ok { t.Error(v) } } func TestQueueGet(t *testing.T) { pq := New(compare.Int) l := []int{32, 10, 53, 78, 90, 1, 4} for _, v := range l { pq.Push(v) } if v, ok := pq.Get(0); ok { t.Error(v) } if v, ok := pq.Get(70); ok { t.Error(v) } for _, v := range l { if gv, ok := pq.Get(v); ok { if gv != v { t.Error("Get value is error, value is", gv) } } } } func TestQueueRemove(t *testing.T) { pq := New(compare.Int) l := []int{32, 10, 53, 78, 90, 1, 4} for _, v := range l { pq.Push(v) } content := "" for _, v := range l { t.Error(pq.Top()) pq.Remove(v) content += spew.Sprint(pq.Values()) } if content != "[1 4 10 53 78 90][1 4 53 78 90][1 4 78 90][1 4 90][1 4][4][]" { t.Error(content) } } func TestQueueRemoveIndex(t *testing.T) { pq := New(compare.Int) l := []int{32, 10, 53, 78, 90, 1, 4} for _, v := range l { pq.Push(v) } content := "" for range l { pq.RemoveWithIndex(0) content += spew.Sprint(pq.Values()) } if content != "[1 4 10 32 53 78][1 4 10 32 53][1 4 10 32][1 4 10][1 4][1][]" { t.Error(content) } if pq.RemoveWithIndex(0) { t.Error("pq is not exist elements") } } func TestQueueIndex(t *testing.T) { pq := New(compare.Int) for _, v := range []int{32, 10, 53, 78, 90, 1, 4} { pq.Push(v) } l := []int{90, 78, 53, 32, 10, 4, 1} for i, lv := range l { if v, ok := pq.Index(len(l) - i - 1); ok { if v != l[len(l)-i-1] { t.Error(v) } } else { t.Error(i, "index is not exist") } if v, ok := pq.Index(i); ok { if v != lv { t.Error(v) } } else { t.Error(i, "index is not exist") } } if v, ok := pq.Index(-1); ok { if v != 1 { t.Error(v) } } else { t.Error("-1 index is not exist") } if v, ok := pq.Index(pq.Size()); ok { t.Error("index is exits", pq.Size(), v) } if v, ok := pq.Index(pq.Size() - 1); !ok { if v != 1 { t.Error("the last value is 1 not is ", v) } } if v, ok := pq.Index(-10); ok { t.Error("-10 index is exits", v) } } func BenchmarkQueueGet(b *testing.B) { l := loadTestData() pq := New(compare.Int) for _, v := range l { pq.Push(v) } execCount := 5 b.N = len(l) * execCount b.ResetTimer() b.StartTimer() ALL: for i := 0; i < execCount; i++ { for _, v := range l { if gv, ok := pq.Get(v); !ok { b.Error(gv) break ALL } } } } func BenchmarkQueueRemove(b *testing.B) { l := loadTestData() pq := New(compare.Int) for _, v := range l { pq.Push(v) } b.N = len(l) b.ResetTimer() b.StartTimer() for _, v := range l { pq.Remove(v) } } func BenchmarkQueueIndex(b *testing.B) { l := loadTestData() pq := New(compare.Int) for _, v := range l { pq.Push(v) } execCount := 2 b.N = len(l) * execCount b.ResetTimer() b.StartTimer() ALL: for i := 0; i < execCount; i++ { for idx := range l { if v, ok := pq.Index(idx); !ok { b.Error(v) break ALL } } } } func BenchmarkPriorityPush(b *testing.B) { l := loadTestData() execCount := 5 b.N = len(l) * execCount b.ResetTimer() b.StartTimer() for i := 0; i < execCount; i++ { pq := New(compare.Int) for _, v := range l { pq.Push(v) } } } func BenchmarkPriorityPop(b *testing.B) { l := loadTestData() pq := New(compare.Int) for _, v := range l { pq.Push(v) } b.N = len(l) b.ResetTimer() b.StartTimer() for i := 0; i < b.N; i++ { pq.Pop() } }