/*
 * Copyright 2021 CloudWeGo Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package event

import (
	"strconv"
	"testing"

	"github.com/cloudwego/kitex/internal/test"
)

func TestQueueInvalidCapacity(t *testing.T) {
	defer func() {
		e := recover()
		test.Assert(t, e != nil)
	}()
	NewQueue(-1)
}

func TestQueue(t *testing.T) {
	size := 10
	q := NewQueue(size)

	for i := 0; i < size; i++ {
		n := "E." + strconv.Itoa(i)
		q.Push(&Event{
			Name: n,
		})
		es := q.Dump().([]*Event)
		test.Assert(t, len(es) == i+1)
		test.Assert(t, es[0].Name == n)
	}

	for i := 0; i < size; i++ {
		q.Push(&Event{
			Name: strconv.Itoa(i),
		})
		es := q.Dump().([]*Event)
		test.Assert(t, len(es) == size)
	}
}

func BenchmarkQueue(b *testing.B) {
	q := NewQueue(100)
	e := &Event{}
	b.ReportAllocs()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		q.Push(e)
	}
}

func BenchmarkQueueConcurrent(b *testing.B) {
	q := NewQueue(100)
	e := &Event{}
	b.ResetTimer()
	b.RunParallel(func(pb *testing.PB) {
		for pb.Next() {
			q.Push(e)
		}
	})
	b.StopTimer()
}
