package lastack

import (
	"testing"

	"github.com/emirpasic/gods/stacks/arraystack"

	"github.com/Pallinder/go-randomdata"
)

// func TestPush(t *testing.T) {
// 	s := New()
// 	for i := 0; i < 10; i++ {
// 		v := randomdata.Number(0, 10)
// 		s.Push(v)
// 		t.Error(v)
// 		t.Error(s.String(), " size ", s.size)
// 	}

// 	t.Error(s.Values())

// 	for i := 0; i < 10; i++ {
// 		v, ok := s.Pop()
// 		t.Error(v, ok)
// 		t.Error(s.String(), " size ", s.size)
// 	}

// 	for i := 0; i < 10; i++ {
// 		v := randomdata.Number(0, 10)
// 		s.Push(v)
// 	}

// 	for i := -1; i < 11; i++ {
// 		v, ok := s.Get(i)
// 		t.Error(v, ok)
// 	}

// }

func BenchmarkGet(b *testing.B) {
	s := New()
	b.N = 20000000

	for i := 0; i < b.N; i++ {
		v := randomdata.Number(0, 65535)
		s.Push(v)
	}

	b.ResetTimer()
	b.StartTimer()

	for i := 0; i < b.N; i++ {
		s.Get(i)
	}
}

func BenchmarkPush(b *testing.B) {
	s := New()
	b.N = 200000
	for i := 0; i < b.N; i++ {
		v := randomdata.Number(0, 65535)
		s.Push(v)
	}
}

func BenchmarkGodsPush(b *testing.B) {
	s := arraystack.New()
	b.N = 200000
	for i := 0; i < b.N; i++ {
		v := randomdata.Number(0, 65535)
		s.Push(v)
	}
}

func BenchmarkPop(b *testing.B) {
	s := New()
	b.N = 200000

	for i := 0; i < b.N; i++ {
		v := randomdata.Number(0, 65535)
		s.Push(v)
	}

	b.ResetTimer()
	b.StartTimer()

	for i := 0; i < b.N; i++ {
		s.Pop()
	}
}

func BenchmarkGodsPop(b *testing.B) {
	s := arraystack.New()
	b.N = 200

	for i := 0; i < b.N; i++ {
		v := randomdata.Number(0, 65535)
		s.Push(v)
	}

	b.ResetTimer()
	b.StartTimer()

	for i := 0; i < b.N; i++ {
		s.Pop()
	}
}

func BenchmarkValues(b *testing.B) {
	s := New()
	for i := 0; i < b.N; i++ {
		v := randomdata.Number(0, 65535)
		s.Push(v)
	}

	b.ResetTimer()
	b.StartTimer()

	for i := 0; i < b.N; i++ {
		s.Values()
	}
}

func BenchmarkGodsValues(b *testing.B) {
	s := arraystack.New()
	for i := 0; i < b.N; i++ {
		v := randomdata.Number(0, 65535)
		s.Push(v)
	}

	b.ResetTimer()
	b.StartTimer()

	for i := 0; i < b.N; i++ {
		s.Values()
	}
}