func TestKeyUint64CacheFullOnPurge(t *testing.T) {
	cache := NewLRUCacheKeyUint64(1)
	value := &PurgeCacheValueKeyUint64{}
	k1 := key.KeyUint64(1)
	k2 := key.KeyUint64(2)

	cache.Set(k1, value)                                // after this cache is full
	purgeReasonFlag4TestKeyUint64 = PURGE_REASON_DELETE // init
	cache.Set(k2, value)                                // after this k1 is delete and reason set to  PURGE_REASON_CACHEFULL
	if purgeReasonFlag4TestKeyUint64 != PURGE_REASON_CACHEFULL {
		t.Errorf("after cache.Delete ,purgeReason should be %d ,but get %d", PURGE_REASON_CACHEFULL, purgeReasonFlag4TestKeyUint64)
	}

}
func TestKeyUint64SetUpdatesSize(t *testing.T) {
	cache := NewLRUCacheKeyUint64(100)
	emptyValue := &CacheValue{0}
	k := key.KeyUint64(1)
	cache.Set(k, emptyValue)
	if _, sz, _ := cache.Stats(); sz != 0 {
		t.Errorf("cache.Size() = %v, expected 0", sz)
	}
	someValue := &CacheValue{20}
	k = key.KeyUint64(2)
	cache.Set(k, someValue)
	if _, sz, _ := cache.Stats(); sz != 20 {
		t.Errorf("cache.Size() = %v, expected 20", sz)
	}
}
func TestKeyUint64ClearOnPurge(t *testing.T) {
	cache := NewLRUCacheKeyUint64(1)
	value := &PurgeCacheValueKeyUint64{}
	k1 := key.KeyUint64(1)
	purgeReasonFlag4TestKeyUint64 = PURGE_REASON_DELETE // init
	cache.Set(k1, value)                                // after this cache is full
	cache.Clear()
	if purgeReasonFlag4TestKeyUint64 != PURGE_REASON_CLEAR_ALL {
		t.Errorf("after cache.Delete ,purgeReason should be %d ,but get %d", PURGE_REASON_CLEAR_ALL, purgeReasonFlag4TestKeyUint64)
	}

}
func TestKeyUint64OnMiss(t *testing.T) {
	fun := func(k key.KeyUint64) (Cacheable, bool) {
		return 1, true
	}
	cache := NewLRUCacheKeyUint64(1)
	cache.OnMiss(fun)
	k1 := key.KeyUint64(1)
	v, ok := cache.Get(k1) //
	if ok != true && v != 1 {
		t.Errorf("lru.onMiss is errror")
	}

}
func TestKeyUint64SetWithOldKeyUpdatesValue(t *testing.T) {
	cache := NewLRUCacheKeyUint64(100)
	emptyValue := &CacheValue{0}
	k := key.KeyUint64(1)
	cache.Set(k, emptyValue)
	someValue := &CacheValue{20}
	cache.Set(k, someValue)

	v, ok := cache.Get(k)
	if !ok || v.(*CacheValue) != someValue {
		t.Errorf("Cache has incorrect value: %v != %v", someValue, v)
	}
}
func TestKeyUint64SetWithOldKeyUpdatesSize(t *testing.T) {
	cache := NewLRUCacheKeyUint64(100)
	emptyValue := &CacheValue{0}
	k := key.KeyUint64(1)
	cache.Set(k, emptyValue)

	if _, sz, _ := cache.Stats(); sz != 0 {
		t.Errorf("cache.Size() = %v, expected %v", sz, 0)
	}

	someValue := &CacheValue{20}
	cache.Set(k, someValue)
	expected := int64(someValue.size)
	if _, sz, _ := cache.Stats(); sz != expected {
		t.Errorf("cache.Size() = %v, expected %v", sz, expected)
	}
}