1 // Copyright 2022 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "aemu/base/LruCache.h"
16
17 #include <cstdint>
18 #include <string>
19
20 #include <gmock/gmock.h>
21 #include <gtest/gtest.h>
22
23 namespace android {
24 namespace base {
25 namespace {
26
27 using ::testing::IsNull;
28 using ::testing::Pointee;
29 using ::testing::StrEq;
30
TEST(LruCache,Basic)31 TEST(LruCache, Basic) {
32 LruCache<int, std::string> lru(3);
33
34 ASSERT_THAT(lru.get(0), IsNull());
35 ASSERT_THAT(lru.get(1), IsNull());
36 ASSERT_THAT(lru.get(2), IsNull());
37 ASSERT_THAT(lru.get(3), IsNull());
38
39 lru.set(1, "hello");
40 lru.set(2, "world");
41
42 ASSERT_THAT(lru.get(0), IsNull());
43 ASSERT_THAT(lru.get(1), Pointee(StrEq("hello")));
44 ASSERT_THAT(lru.get(2), Pointee(StrEq("world")));
45 ASSERT_THAT(lru.get(3), IsNull());
46
47 lru.set(2, "world");
48 lru.set(2, "world");
49 lru.set(2, "world");
50 lru.set(2, "world");
51
52 ASSERT_THAT(lru.get(0), IsNull());
53 ASSERT_THAT(lru.get(1), Pointee(StrEq("hello")));
54 ASSERT_THAT(lru.get(2), Pointee(StrEq("world")));
55 ASSERT_THAT(lru.get(3), IsNull());
56
57 lru.set(2, "helloworld");
58
59 ASSERT_THAT(lru.get(0), IsNull());
60 ASSERT_THAT(lru.get(1), Pointee(StrEq("hello")));
61 ASSERT_THAT(lru.get(2), Pointee(StrEq("helloworld")));
62 ASSERT_THAT(lru.get(3), IsNull());
63
64 lru.set(3, "foo");
65
66 ASSERT_THAT(lru.get(0), IsNull());
67 ASSERT_THAT(lru.get(1), Pointee(StrEq("hello")));
68 ASSERT_THAT(lru.get(2), Pointee(StrEq("helloworld")));
69 ASSERT_THAT(lru.get(3), Pointee(StrEq("foo")));
70
71 lru.set(0, "bar");
72
73 ASSERT_THAT(lru.get(0), Pointee(StrEq("bar")));
74 ASSERT_THAT(lru.get(1), IsNull());
75 ASSERT_THAT(lru.get(2), Pointee(StrEq("helloworld")));
76 ASSERT_THAT(lru.get(3), Pointee(StrEq("foo")));
77
78 lru.remove(2);
79
80 ASSERT_THAT(lru.get(0), Pointee(StrEq("bar")));
81 ASSERT_THAT(lru.get(1), IsNull());
82 ASSERT_THAT(lru.get(2), IsNull());
83 ASSERT_THAT(lru.get(3), Pointee(StrEq("foo")));
84
85 lru.remove(1);
86 lru.remove(5);
87
88 ASSERT_THAT(lru.get(0), Pointee(StrEq("bar")));
89 ASSERT_THAT(lru.get(1), IsNull());
90 ASSERT_THAT(lru.get(2), IsNull());
91 ASSERT_THAT(lru.get(3), Pointee(StrEq("foo")));
92 }
93
94 } // namespace
95 } // namespace base
96 } // namespace android