/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkLRUCache.h" #include "Test.h" struct Value { Value(int value, int* counter) : fValue(value) , fCounter(counter) { (*fCounter)++; } ~Value() { (*fCounter)--; } int fValue; int* fCounter; }; DEF_TEST(LRUCacheSequential, r) { int instances = 0; { static const int kSize = 100; SkLRUCache<int, std::unique_ptr<Value>> test(kSize); for (int i = 1; i < kSize * 2; i++) { REPORTER_ASSERT(r, !test.find(i)); test.insert(i, std::unique_ptr<Value>(new Value(i * i, &instances))); REPORTER_ASSERT(r, test.find(i)); REPORTER_ASSERT(r, i * i == (*test.find(i))->fValue); if (i > kSize) { REPORTER_ASSERT(r, kSize == instances); REPORTER_ASSERT(r, !test.find(i - kSize)); } else { REPORTER_ASSERT(r, i == instances); } REPORTER_ASSERT(r, (int) test.count() == instances); } } REPORTER_ASSERT(r, 0 == instances); } DEF_TEST(LRUCacheRandom, r) { int instances = 0; { int seq[] = { 0, 1, 2, 3, 4, 1, 6, 2, 7, 5, 3, 2, 2, 3, 1, 7 }; int expected[] = { 7, 1, 3, 2, 5 }; static const int kSize = 5; SkLRUCache<int, std::unique_ptr<Value>> test(kSize); for (int i = 0; i < (int) (sizeof(seq) / sizeof(int)); i++) { int k = seq[i]; if (!test.find(k)) { test.insert(k, std::unique_ptr<Value>(new Value(k, &instances))); } } REPORTER_ASSERT(r, kSize == instances); REPORTER_ASSERT(r, kSize == test.count()); for (int i = 0; i < kSize; i++) { int k = expected[i]; REPORTER_ASSERT(r, test.find(k)); REPORTER_ASSERT(r, k == (*test.find(k))->fValue); } } REPORTER_ASSERT(r, 0 == instances); }