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 "CppUnit/TestCaller.h"
13 #include "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 
20 using namespace Poco;
21 
22 
LRUCacheTest(const std::string & name)23 LRUCacheTest::LRUCacheTest(const std::string& name): CppUnit::TestCase(name)
24 {
25 }
26 
27 
~LRUCacheTest()28 LRUCacheTest::~LRUCacheTest()
29 {
30 }
31 
32 
testClear()33 void 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 
testCacheSize0()56 void 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 
testCacheSize1()70 void 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 
testCacheSize2()96 void 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 
testCacheSizeN()136 void 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 
testDuplicateAdd()187 void 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 
testUpdate()199 void 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 
onUpdate(const void * pSender,const Poco::KeyValueArgs<int,int> & args)224 void LRUCacheTest::onUpdate(const void* pSender, const Poco::KeyValueArgs<int, int>& args)
225 {
226 	++updateCnt;
227 }
228 
229 
onAdd(const void * pSender,const Poco::KeyValueArgs<int,int> & args)230 void LRUCacheTest::onAdd(const void* pSender, const Poco::KeyValueArgs<int, int>& args)
231 {
232 	++addCnt;
233 }
234 
235 
onRemove(const void * pSender,const int & args)236 void LRUCacheTest::onRemove(const void* pSender, const int& args)
237 {
238 	++removeCnt;
239 }
240 
241 
setUp()242 void LRUCacheTest::setUp()
243 {
244 }
245 
246 
tearDown()247 void LRUCacheTest::tearDown()
248 {
249 }
250 
251 
suite()252 CppUnit::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