--- /dev/null
+package utils
+
+import (
+ "testing"
+)
+
+type SimpleStackTest struct {
+ index int
+}
+
+func TestUnique(b *testing.T) {
+ stack := NewStackLock(10, 40, func() interface{} {
+ newone := &SimpleStackTest{}
+ return newone
+ })
+ values := []interface{}{}
+ for x := 0; x < 10; x++ {
+ values = append(values, stack.Pop())
+ }
+ if stack.active != 10 {
+ b.Errorf("Failed to match 10 active %v ", stack.active)
+ }
+ value1 := stack.Pop().(*SimpleStackTest)
+ value1.index = stack.active
+ value2 := stack.Pop().(*SimpleStackTest)
+ value2.index = stack.active
+ value3 := stack.Pop().(*SimpleStackTest)
+ value3.index = stack.active
+
+ if !isDifferent(value1, value2, value3) {
+ b.Errorf("Failed to get unique values")
+ }
+
+ if stack.active != 13 {
+ b.Errorf("Failed to match 13 active %v ", stack.active)
+ }
+
+ for _, v := range values {
+ stack.Push(v)
+ }
+ if stack.len != 10 {
+ b.Errorf("Failed to match 10 len %v ", stack.len)
+ }
+ if stack.capacity != 10 {
+ b.Errorf("Failed to capacity 10 len %v ", stack.capacity)
+ }
+
+ stack.Push(value1)
+ stack.Push(value2)
+ stack.Push(value3)
+ if stack.capacity != 13 {
+ b.Errorf("Failed to capacity 13 len %v ", stack.capacity)
+ }
+
+ value1 = stack.Pop().(*SimpleStackTest)
+ value2 = stack.Pop().(*SimpleStackTest)
+ value3 = stack.Pop().(*SimpleStackTest)
+ println(value1, value2, value3)
+ if !isDifferent(value1, value2, value3) {
+ b.Errorf("Failed to get unique values")
+ }
+
+}
+func TestLimits(b *testing.T) {
+ stack := NewStackLock(10, 20, func() interface{} {
+ newone := &SimpleStackTest{}
+ return newone
+ })
+ values := []interface{}{}
+ for x := 0; x < 50; x++ {
+ values = append(values, stack.Pop())
+ }
+ if stack.active != 50 {
+ b.Errorf("Failed to match 50 active %v ", stack.active)
+ }
+ for _, v := range values {
+ stack.Push(v)
+ }
+ if stack.Capacity() != 20 {
+ b.Errorf("Failed to match 20 capcity %v ", stack.Capacity())
+ }
+
+}
+func isDifferent(values ...*SimpleStackTest) bool {
+ if len(values) == 2 {
+ return values[0] != values[1]
+ }
+ for _, v := range values[1:] {
+ if values[0] == v {
+ return false
+ }
+ }
+ return isDifferent(values[1:]...)
+}
+
+func BenchmarkCreateWrite(b *testing.B) {
+ stack := NewStackLock(0, 40, func() interface{} { return &SimpleStackTest{} })
+ for x := 0; x < b.N; x++ {
+ stack.Push(x)
+ }
+}
+func BenchmarkAllocWrite(b *testing.B) {
+ stack := NewStackLock(b.N, b.N+100, func() interface{} { return &SimpleStackTest{} })
+ for x := 0; x < b.N; x++ {
+ stack.Push(x)
+ }
+}
+func BenchmarkCreate(b *testing.B) {
+ NewStackLock(b.N, b.N+100, func() interface{} { return &SimpleStackTest{} })
+}
+func BenchmarkParrallel(b *testing.B) {
+ stack := NewStackLock(b.N, b.N+100, func() interface{} { return &SimpleStackTest{} })
+ b.RunParallel(func(pb *testing.PB) {
+ for pb.Next() {
+ for x := 0; x < 50000; x++ {
+ stack.Push(x)
+ }
+ }
+ })
+ b.RunParallel(func(pb *testing.PB) {
+ for pb.Next() {
+ for x := 0; x < 50000; x++ {
+ stack.Pop()
+ }
+ }
+ })
+}