| /* | 
 |  * 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); | 
 | } |