package stack

import (
	"testing"

	"github.com/stretchr/testify/require"
)

func TestClear(t *testing.T) {
	s := NewStack(32, nil)
	s.Clear()
	require.Equal(t, 0, s.height)
}

func TestDupicate(t *testing.T) {
	expected := NewStack(32, nil)
	expected.height = 2
	s := NewStack(32, nil)
	s.Duplicate()
	require.Equal(t, expected.height, s.height)
	s.Push(12)
	s.Duplicate()
	expected.Push(12)
	expected.Push(12)
	require.Equal(t, expected.height, s.height)
	require.Equal(t, expected.data, s.data)
}

func TestPop(t *testing.T) {
	s := NewStack(32, nil)
	v := s.Pop()
	require.Equal(t, 0, v)
	s.Push(12)
	s.Push(14)
	v = s.Pop()
	require.Equal(t, 14, v)
	v = s.Pop()
	require.Equal(t, 12, v)
	v = s.Pop()
	require.Equal(t, 0, v)
}

func TestPush(t *testing.T) {
	s := NewStack(32, nil)
	for i := 0; i < 32; i++ {
		s.Push(i)
	}
	require.Equal(t, 32, s.size)
	s.Push(-1)
	require.Equal(t, 64, s.size)
}

func TestSwap(t *testing.T) {
	s := NewStack(32, nil)
	s2 := NewStack(32, nil)
	s.Swap()
	s2.Push(0)
	s2.Push(0)
	require.Equal(t, s2, s)
	s.Clear()
	s.Push(1)
	s.Swap()
	s2.Clear()
	s2.Push(1)
	s2.Push(0)
	require.Equal(t, s2, s)
	s.Clear()
	s.Push(1)
	s.Push(2)
	s2.Clear()
	s2.Push(2)
	s2.Push(1)
	s.Swap()
	require.Equal(t, s2, s)
}

func TestHeights(t *testing.T) {
	// TODO
}

func TestTransfert(t *testing.T) {
	// TODO
}