package ttlcache
import (
"fmt"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestPriorityQueuePush(t *testing.T) {
queue := newPriorityQueue()
for i := 0; i < 10; i++ {
queue.push(newItem(fmt.Sprintf("key_%d", i), "data", -1))
}
assert.Equal(t, queue.Len(), 10, "Expected queue to have 10 elements")
}
func TestPriorityQueuePop(t *testing.T) {
queue := newPriorityQueue()
for i := 0; i < 10; i++ {
queue.push(newItem(fmt.Sprintf("key_%d", i), "data", -1))
}
for i := 0; i < 5; i++ {
item := queue.pop()
assert.Equal(t, fmt.Sprintf("%T", item), "*ttlcache.item", "Expected 'item' to be a '*ttlcache.item'")
}
assert.Equal(t, queue.Len(), 5, "Expected queue to have 5 elements")
for i := 0; i < 5; i++ {
item := queue.pop()
assert.Equal(t, fmt.Sprintf("%T", item), "*ttlcache.item", "Expected 'item' to be a '*ttlcache.item'")
}
assert.Equal(t, queue.Len(), 0, "Expected queue to have 0 elements")
item := queue.pop()
assert.Nil(t, item, "*ttlcache.item", "Expected 'item' to be nil")
}
func TestPriorityQueueCheckOrder(t *testing.T) {
queue := newPriorityQueue()
for i := 10; i > 0; i-- {
queue.push(newItem(fmt.Sprintf("key_%d", i), "data", time.Duration(i)*time.Second))
}
for i := 1; i <= 10; i++ {
item := queue.pop()
assert.Equal(t, item.key, fmt.Sprintf("key_%d", i), "error")
}
}
func TestPriorityQueueRemove(t *testing.T) {
queue := newPriorityQueue()
items := make(map[string]*item)
var itemRemove *item
for i := 0; i < 5; i++ {
key := fmt.Sprintf("key_%d", i)
items[key] = newItem(key, "data", time.Duration(i)*time.Second)
queue.push(items[key])
if i == 2 {
itemRemove = items[key]
}
}
assert.Equal(t, queue.Len(), 5, "Expected queue to have 5 elements")
queue.remove(itemRemove)
assert.Equal(t, queue.Len(), 4, "Expected queue to have 4 elements")
for {
item := queue.pop()
if item == nil {
break
}
assert.NotEqual(t, itemRemove.key, item.key, "This element was not supposed to be in the queue")
}
assert.Equal(t, queue.Len(), 0, "The queue is supposed to be with 0 items")
}
func TestPriorityQueueUpdate(t *testing.T) {
queue := newPriorityQueue()
item := newItem("key", "data", 1*time.Second)
queue.push(item)
assert.Equal(t, queue.Len(), 1, "The queue is supposed to be with 1 item")
item.key = "newKey"
queue.update(item)
newItem := queue.pop()
assert.Equal(t, newItem.key, "newKey", "The item key didn't change")
assert.Equal(t, queue.Len(), 0, "The queue is supposed to be with 0 items")
}