@@ -169,4 +169,90 @@ public void whenCacheIsReset() {
169
169
170
170
assertEquals (0 , cache .linkedHashMap .size ());
171
171
}
172
+
173
+ @ Test
174
+ public void testRemoveNonExistentKey () {
175
+ DefaultLRUCache <Integer > cache = new DefaultLRUCache <>(3 , 1000 );
176
+ cache .save ("1" , 100 );
177
+ cache .save ("2" , 200 );
178
+
179
+ cache .remove ("3" ); // Doesn't exist
180
+
181
+ assertEquals (Integer .valueOf (100 ), cache .lookup ("1" ));
182
+ assertEquals (Integer .valueOf (200 ), cache .lookup ("2" ));
183
+ }
184
+
185
+ @ Test
186
+ public void testRemoveExistingKey () {
187
+ DefaultLRUCache <Integer > cache = new DefaultLRUCache <>(3 , 1000 );
188
+
189
+ cache .save ("1" , 100 );
190
+ cache .save ("2" , 200 );
191
+ cache .save ("3" , 300 );
192
+
193
+ assertEquals (Integer .valueOf (100 ), cache .lookup ("1" ));
194
+ assertEquals (Integer .valueOf (200 ), cache .lookup ("2" ));
195
+ assertEquals (Integer .valueOf (300 ), cache .lookup ("3" ));
196
+
197
+ cache .remove ("2" );
198
+
199
+ assertEquals (Integer .valueOf (100 ), cache .lookup ("1" ));
200
+ assertNull (cache .lookup ("2" ));
201
+ assertEquals (Integer .valueOf (300 ), cache .lookup ("3" ));
202
+ }
203
+
204
+ @ Test
205
+ public void testRemoveFromZeroSizedCache () {
206
+ DefaultLRUCache <Integer > cache = new DefaultLRUCache <>(0 , 1000 );
207
+ cache .save ("1" , 100 );
208
+ cache .remove ("1" );
209
+
210
+ assertNull (cache .lookup ("1" ));
211
+ }
212
+
213
+ @ Test
214
+ public void testRemoveAndAddBack () {
215
+ DefaultLRUCache <Integer > cache = new DefaultLRUCache <>(3 , 1000 );
216
+ cache .save ("1" , 100 );
217
+ cache .save ("2" , 200 );
218
+ cache .save ("3" , 300 );
219
+
220
+ cache .remove ("2" );
221
+ cache .save ("2" , 201 );
222
+
223
+ assertEquals (Integer .valueOf (100 ), cache .lookup ("1" ));
224
+ assertEquals (Integer .valueOf (201 ), cache .lookup ("2" ));
225
+ assertEquals (Integer .valueOf (300 ), cache .lookup ("3" ));
226
+ }
227
+
228
+ @ Test
229
+ public void testThreadSafety () throws InterruptedException {
230
+ int maxSize = 100 ;
231
+ DefaultLRUCache <Integer > cache = new DefaultLRUCache <>(maxSize , 1000 );
232
+
233
+ for (int i = 1 ; i <= maxSize ; i ++) {
234
+ cache .save (String .valueOf (i ), i * 100 );
235
+ }
236
+
237
+ Thread [] threads = new Thread [maxSize / 2 ];
238
+ for (int i = 1 ; i <= maxSize / 2 ; i ++) {
239
+ final int key = i ;
240
+ threads [i - 1 ] = new Thread (() -> cache .remove (String .valueOf (key )));
241
+ threads [i - 1 ].start ();
242
+ }
243
+
244
+ for (Thread thread : threads ) {
245
+ thread .join ();
246
+ }
247
+
248
+ for (int i = 1 ; i <= maxSize ; i ++) {
249
+ if (i <= maxSize / 2 ) {
250
+ assertNull (cache .lookup (String .valueOf (i )));
251
+ } else {
252
+ assertEquals (Integer .valueOf (i * 100 ), cache .lookup (String .valueOf (i )));
253
+ }
254
+ }
255
+
256
+ assertEquals (maxSize / 2 , cache .linkedHashMap .size ());
257
+ }
172
258
}
0 commit comments