@@ -169,4 +169,90 @@ public void whenCacheIsReset() {
169169
170170 assertEquals (0 , cache .linkedHashMap .size ());
171171 }
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+ }
172258}
0 commit comments