1//
2// LRUCacheTest.cpp
3//
4// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
5// and Contributors.
6//
7// SPDX-License-Identifier: BSL-1.0
8//
9
10
11#include "LRUCacheTest.h"
12#include "Poco/CppUnit/TestCaller.h"
13#include "Poco/CppUnit/TestSuite.h"
14#include "Poco/Exception.h"
15#include "Poco/LRUCache.h"
16#include "Poco/Bugcheck.h"
17#include "Poco/Delegate.h"
18
19
20using namespace Poco;
21
22
23LRUCacheTest::LRUCacheTest(const std::string& rName): CppUnit::TestCase(rName)
24{
25}
26
27
28LRUCacheTest::~LRUCacheTest()
29{
30}
31
32
33void LRUCacheTest::testClear()
34{
35 LRUCache<int, int> aCache(3);
36 assertTrue (aCache.size() == 0);
37 assertTrue (aCache.getAllKeys().size() == 0);
38 aCache.add(1, 2);
39 aCache.add(3, 4);
40 aCache.add(5, 6);
41 assertTrue (aCache.size() == 3);
42 assertTrue (aCache.getAllKeys().size() == 3);
43 assertTrue (aCache.has(1));
44 assertTrue (aCache.has(3));
45 assertTrue (aCache.has(5));
46 assertTrue (*aCache.get(1) == 2);
47 assertTrue (*aCache.get(3) == 4);
48 assertTrue (*aCache.get(5) == 6);
49 aCache.clear();
50 assertTrue (!aCache.has(1));
51 assertTrue (!aCache.has(3));
52 assertTrue (!aCache.has(5));
53}
54
55
56void LRUCacheTest::testCacheSize0()
57{
58 // cache size 0 is illegal
59 try
60 {
61 LRUCache<int, int> aCache(0);
62 failmsg ("cache size of 0 is illegal, test should fail");
63 }
64 catch (Poco::InvalidArgumentException&)
65 {
66 }
67}
68
69
70void LRUCacheTest::testCacheSize1()
71{
72 LRUCache<int, int> aCache(1);
73 aCache.add(1, 2);
74 assertTrue (aCache.has(1));
75 assertTrue (*aCache.get(1) == 2);
76
77 aCache.add(3, 4); // replaces 1
78 assertTrue (!aCache.has(1));
79 assertTrue (aCache.has(3));
80 assertTrue (*aCache.get(3) == 4);
81
82 aCache.add(5, 6);
83 assertTrue (!aCache.has(1));
84 assertTrue (!aCache.has(3));
85 assertTrue (aCache.has(5));
86 assertTrue (*aCache.get(5) == 6);
87
88 aCache.remove(5);
89 assertTrue (!aCache.has(5));
90
91 // removing illegal entries should work too
92 aCache.remove(666);
93}
94
95
96void LRUCacheTest::testCacheSize2()
97{
98 // 3-1 represents the cache sorted by pos, elements get replaced at the end of the list
99 // 3-1|5 -> 5 gets removed
100 LRUCache<int, int> aCache(2);
101 aCache.add(1, 2); // 1
102 assertTrue (aCache.has(1));
103 assertTrue (*aCache.get(1) == 2);
104
105 aCache.add(3, 4); // 3-1
106 assertTrue (aCache.has(1));
107 assertTrue (aCache.has(3));
108 assertTrue (*aCache.get(1) == 2); // 1-3
109 assertTrue (*aCache.get(3) == 4); // 3-1
110
111 aCache.add(5, 6); // 5-3|1
112 assertTrue (!aCache.has(1));
113 assertTrue (aCache.has(3));
114 assertTrue (aCache.has(5));
115 assertTrue (*aCache.get(5) == 6); // 5-3
116 assertTrue (*aCache.get(3) == 4); // 3-5
117
118 // test remove from the end and the beginning of the list
119 aCache.remove(5); // 3
120 assertTrue (!aCache.has(5));
121 assertTrue (*aCache.get(3) == 4); // 3
122 aCache.add(5, 6); // 5-3
123 assertTrue (*aCache.get(3) == 4); // 3-5
124 aCache.remove(3); // 5
125 assertTrue (!aCache.has(3));
126 assertTrue (*aCache.get(5) == 6); // 5
127
128 // removing illegal entries should work too
129 aCache.remove(666);
130
131 aCache.clear();
132 assertTrue (!aCache.has(5));
133}
134
135
136void LRUCacheTest::testCacheSizeN()
137{
138 // 3-1 represents the cache sorted by pos, elements get replaced at the end of the list
139 // 3-1|5 -> 5 gets removed
140 LRUCache<int, int> aCache(3);
141 aCache.add(1, 2); // 1
142 assertTrue (aCache.has(1));
143 assertTrue (*aCache.get(1) == 2);
144
145 aCache.add(3, 4); // 3-1
146 assertTrue (aCache.has(1));
147 assertTrue (aCache.has(3));
148 assertTrue (*aCache.get(1) == 2); // 1-3
149 assertTrue (*aCache.get(3) == 4); // 3-1
150
151 aCache.add(5, 6); // 5-3-1
152 assertTrue (aCache.has(1));
153 assertTrue (aCache.has(3));
154 assertTrue (aCache.has(5));
155 assertTrue (*aCache.get(5) == 6); // 5-3-1
156 assertTrue (*aCache.get(3) == 4); // 3-5-1
157
158 aCache.add(7, 8); // 7-5-3|1
159 assertTrue (!aCache.has(1));
160 assertTrue (aCache.has(7));
161 assertTrue (aCache.has(3));
162 assertTrue (aCache.has(5));
163 assertTrue (*aCache.get(5) == 6); // 5-7-3
164 assertTrue (*aCache.get(3) == 4); // 3-5-7
165 assertTrue (*aCache.get(7) == 8); // 7-3-5
166
167 // test remove from the end and the beginning of the list
168 aCache.remove(5); // 7-3
169 assertTrue (!aCache.has(5));
170 assertTrue (*aCache.get(3) == 4); // 3-7
171 aCache.add(5, 6); // 5-3-7
172 assertTrue (*aCache.get(7) == 8); // 7-5-3
173 aCache.remove(7); // 5-3
174 assertTrue (!aCache.has(7));
175 assertTrue (aCache.has(3));
176 assertTrue (*aCache.get(5) == 6); // 5-3
177
178 // removing illegal entries should work too
179 aCache.remove(666);
180
181 aCache.clear();
182 assertTrue (!aCache.has(5));
183 assertTrue (!aCache.has(3));
184}
185
186
187void LRUCacheTest::testDuplicateAdd()
188{
189 LRUCache<int, int> aCache(3);
190 aCache.add(1, 2); // 1
191 assertTrue (aCache.has(1));
192 assertTrue (*aCache.get(1) == 2);
193 aCache.add(1, 3);
194 assertTrue (aCache.has(1));
195 assertTrue (*aCache.get(1) == 3);
196}
197
198
199void LRUCacheTest::testUpdate()
200{
201 addCnt = 0;
202 updateCnt = 0;
203 removeCnt = 0;
204 LRUCache<int, int> aCache(3);
205 aCache.Add += delegate(this, &LRUCacheTest::onAdd);
206 aCache.Remove += delegate(this, &LRUCacheTest::onRemove);
207 aCache.Update += delegate(this, &LRUCacheTest::onUpdate);
208 aCache.add(1, 2); // 1 ,one add event
209 assertTrue (addCnt == 1);
210 assertTrue (updateCnt == 0);
211 assertTrue (removeCnt == 0);
212
213 assertTrue (aCache.has(1));
214 assertTrue (*aCache.get(1) == 2);
215 aCache.update(1, 3); // one update event only!
216 assertTrue (addCnt == 1);
217 assertTrue (updateCnt == 1);
218 assertTrue (removeCnt == 0);
219 assertTrue (aCache.has(1));
220 assertTrue (*aCache.get(1) == 3);
221}
222
223
224void LRUCacheTest::onUpdate(const void* pSender, const Poco::KeyValueArgs<int, int>& args)
225{
226 ++updateCnt;
227}
228
229
230void LRUCacheTest::onAdd(const void* pSender, const Poco::KeyValueArgs<int, int>& args)
231{
232 ++addCnt;
233}
234
235
236void LRUCacheTest::onRemove(const void* pSender, const int& args)
237{
238 ++removeCnt;
239}
240
241
242void LRUCacheTest::setUp()
243{
244}
245
246
247void LRUCacheTest::tearDown()
248{
249}
250
251
252CppUnit::Test* LRUCacheTest::suite()
253{
254 CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("LRUCacheTest");
255
256 CppUnit_addTest(pSuite, LRUCacheTest, testClear);
257 CppUnit_addTest(pSuite, LRUCacheTest, testCacheSize0);
258 CppUnit_addTest(pSuite, LRUCacheTest, testCacheSize1);
259 CppUnit_addTest(pSuite, LRUCacheTest, testCacheSize2);
260 CppUnit_addTest(pSuite, LRUCacheTest, testCacheSizeN);
261 CppUnit_addTest(pSuite, LRUCacheTest, testDuplicateAdd);
262 CppUnit_addTest(pSuite, LRUCacheTest, testUpdate);
263
264 return pSuite;
265}
266