1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2016 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkLRUCache.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Test.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct Value {
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Value(int value, int* counter)
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    : fValue(value)
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    , fCounter(counter) {
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        (*fCounter)++;
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ~Value() {
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        (*fCounter)--;
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int fValue;
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int* fCounter;
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_TEST(LRUCacheSequential, r) {
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int instances = 0;
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    {
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static const int kSize = 100;
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkLRUCache<int, std::unique_ptr<Value>> test(kSize);
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 1; i < kSize * 2; i++) {
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            REPORTER_ASSERT(r, !test.find(i));
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            test.insert(i, std::unique_ptr<Value>(new Value(i * i, &instances)));
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            REPORTER_ASSERT(r, test.find(i));
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            REPORTER_ASSERT(r, i * i == (*test.find(i))->fValue);
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (i > kSize) {
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                REPORTER_ASSERT(r, kSize == instances);
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                REPORTER_ASSERT(r, !test.find(i - kSize));
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            } else {
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                REPORTER_ASSERT(r, i == instances);
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            REPORTER_ASSERT(r, (int) test.count() == instances);
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    REPORTER_ASSERT(r, 0 == instances);
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_TEST(LRUCacheRandom, r) {
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int instances = 0;
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    {
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int seq[] = { 0, 1, 2, 3, 4, 1, 6, 2, 7, 5, 3, 2, 2, 3, 1, 7 };
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int expected[] = { 7, 1, 3, 2, 5 };
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static const int kSize = 5;
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkLRUCache<int, std::unique_ptr<Value>> test(kSize);
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < (int) (sizeof(seq) / sizeof(int)); i++) {
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            int k = seq[i];
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (!test.find(k)) {
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                test.insert(k, std::unique_ptr<Value>(new Value(k, &instances)));
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        REPORTER_ASSERT(r, kSize == instances);
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        REPORTER_ASSERT(r, kSize == test.count());
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < kSize; i++) {
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            int k = expected[i];
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            REPORTER_ASSERT(r, test.find(k));
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            REPORTER_ASSERT(r, k == (*test.find(k))->fValue);
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    REPORTER_ASSERT(r, 0 == instances);
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
71