herald.go/db/stack/stack_test.go
2022-04-20 18:29:37 +00:00

119 lines
2 KiB
Go

package stack_test
import (
"testing"
"time"
"github.com/lbryio/hub/db/stack"
)
func TestPush(t *testing.T) {
var want uint32 = 3
stack := stack.NewSliceBacked(10)
stack.Push(0)
stack.Push(1)
stack.Push(2)
if got := stack.Len(); got != want {
t.Errorf("got %v, want %v", got, want)
}
}
func TestPushPop(t *testing.T) {
stack := stack.NewSliceBacked(10)
for i := 0; i < 5; i++ {
stack.Push(i)
}
for i := 0; i < 5; i++ {
wantLen := 5 - i
if got := stack.Len(); int(got) != wantLen {
t.Errorf("got %v, want %v", got, wantLen)
}
if got := stack.Pop(); got != 5-i-1 {
t.Errorf("got %v, want %v", got, 5-i-1)
}
wantLen -= 1
if got := stack.Len(); int(got) != wantLen {
t.Errorf("got %v, want %v", got, wantLen)
}
}
}
func doPushes(stack *stack.SliceBacked, numPushes int) {
for i := 0; i < numPushes; i++ {
stack.Push(i)
}
}
func doPops(stack *stack.SliceBacked, numPops int) {
for i := 0; i < numPops; i++ {
stack.Pop()
}
}
func TestMultiThreaded(t *testing.T) {
stack := stack.NewSliceBacked(100000)
go doPushes(stack, 100000)
go doPushes(stack, 100000)
go doPushes(stack, 100000)
time.Sleep(time.Second)
if stack.Len() != 300000 {
t.Errorf("got %v, want %v", stack.Len(), 300000)
}
go doPops(stack, 100000)
go doPops(stack, 100000)
go doPops(stack, 100000)
time.Sleep(time.Second)
if stack.Len() != 0 {
t.Errorf("got %v, want %v", stack.Len(), 0)
}
}
func TestGet(t *testing.T) {
stack := stack.NewSliceBacked(10)
for i := 0; i < 5; i++ {
stack.Push(i)
}
if got := stack.GetTip(); got != 4 {
t.Errorf("got %v, want %v", got, 4)
}
for i := 0; i < 5; i++ {
if got := stack.Get(uint32(i)); got != i {
t.Errorf("got %v, want %v", got, i)
}
}
slice := stack.GetSlice()
if len(slice) != 10 {
t.Errorf("got %v, want %v", len(slice), 10)
}
}
func TestLenCap(t *testing.T) {
stack := stack.NewSliceBacked(10)
if got := stack.Len(); got != 0 {
t.Errorf("got %v, want %v", got, 0)
}
if got := stack.Cap(); got != 10 {
t.Errorf("got %v, want %v", got, 10)
}
}