// File: queue_test.go
// Created Time: 2022-11-28
// Author: Reanon (793584285@qq.com)

package chapter_stack_and_queue

import "testing"

func TestArrayQueue(t *testing.T) {
	// 初始化队列，使用队列的通用接口
	var queue Queue
	capacity := 10
	queue = NewArrayQueue(capacity)

	// 元素入队
	queue.Offer(1)
	queue.Offer(2)
	queue.Offer(3)
	queue.Offer(4)
	queue.Offer(5)
	t.Log("队列 queue = ", queue.toString())

	// 访问队首元素
	peek := queue.Peek()
	t.Log("队首元素 peek = ", peek)

	// 元素出队
	pop := queue.Poll()
	t.Log("出队元素 pop  = ", pop, ", 出队后 queue =", queue.toString())

	// 获取队的长度
	size := queue.Size()
	t.Log("队的长度 size = ", size)

	// 判断是否为空
	isEmpty := queue.IsEmpty()
	t.Log("队是否为空 = ", isEmpty)
}

func TestLinkedListQueue(t *testing.T) {
	// 初始化队
	var queue Queue
	queue = NewLinkedListQueue()

	// 元素入队
	queue.Offer(1)
	queue.Offer(2)
	queue.Offer(3)
	queue.Offer(4)
	queue.Offer(5)
	t.Log("队列 queue = ", queue.toString())

	// 访问队首元素
	peek := queue.Peek()
	t.Log("队首元素 peek = ", peek)

	// 元素出队
	pop := queue.Poll()
	t.Log("出队元素 pop  = ", pop, ", 出队后 queue =", queue.toString())

	// 获取队的长度
	size := queue.Size()
	t.Log("队的长度 size = ", size)

	// 判断是否为空
	isEmpty := queue.IsEmpty()
	t.Log("队是否为空 = ", isEmpty)
}

// BenchmarkArrayQueue 8 ns/op in Mac M1 Pro
func BenchmarkArrayQueue(b *testing.B) {
	capacity := 1000
	stack := NewArrayQueue(capacity)
	// use b.N for looping
	for i := 0; i < b.N; i++ {
		stack.Offer(777)
	}
	for i := 0; i < b.N; i++ {
		stack.Poll()
	}
}

// BenchmarkLinkedQueue 62.66 ns/op in Mac M1 Pro
func BenchmarkLinkedQueue(b *testing.B) {
	stack := NewLinkedListQueue()
	// use b.N for looping
	for i := 0; i < b.N; i++ {
		stack.Offer(777)
	}
	for i := 0; i < b.N; i++ {
		stack.Poll()
	}
}
