Skip to content
Snippets Groups Projects
lru_cache_test.go 1.75 KiB
package datastructure

import (
	"testing"
)

func TestLRUCache(t *testing.T) {
	cache := NewLRUCache(5)

	cache.Contains("test", func(elem interface{}, contains bool) {
		if !contains {
			cache.Set("test", 12)
		}
	})

	if !cache.Contains("test", func(elem interface{}, contains bool) {
		if !contains || elem != 12 {
			t.Error("the cache contains the wrong element")
		}
	}) {
		t.Error("the cache does not contain the added elements")
	}

	if cache.GetSize() != 1 {
		t.Error("the size should be 1")
	}

	if cache.GetCapacity() != 5 {
		t.Error("the capacity should be 5")
	}

	cache.Set("a", 3)
	cache.Set("b", 4)
	cache.Set("c", 5)
	cache.Set("d", 6)

	if cache.GetSize() != 5 {
		t.Error("the size should be 5")
	}

	cache.Set("e", 7)

	if cache.GetSize() != 5 {
		t.Error("the size should be 5")
	}

	if cache.Contains("test") {
		t.Error("'test' should have been dropped")
	}

	cache.Set("a", 6)
	cache.Set("f", 8)

	if cache.GetSize() != 5 {
		t.Error("the size should be 5")
	}

	if !cache.Contains("a") {
		t.Error("'a' should not have been dropped")
	}
	if cache.Contains("b") {
		t.Error("'b' should have been dropped")
	}

	cache.Contains("tust", func(elem interface{}, contains bool) {
		if !contains {
			cache.Set("tust", 1337)
		}
	})
	if cache.GetSize() != 5 {
		t.Error("the size should be 5")
	}

	cache.Contains("a", func(value interface{}, exists bool) {
		if exists {
			cache.Delete("a")
		}
	})
	if cache.GetSize() != 4 {
		t.Error("the size should be 4")
	}

	cache.Delete("f")
	if cache.GetSize() != 3 {
		t.Error("the size should be 3")
	}
}

func BenchmarkLRUCache(b *testing.B) {
	cache := NewLRUCache(10000)

	b.ResetTimer()

	for i := 0; i < b.N; i++ {
		cache.Contains(i, func(val interface{}, exists bool) {
			if !exists {
				cache.Set(i, i)
			}
		})
	}
}