@@ -226,4 +226,75 @@ describe('LRUCache', () => {
226226 expect ( cache . has ( 'key149' ) ) . toBe ( true ) // recent keys retained
227227 } )
228228 } )
229+
230+ describe ( 'onEvict Callback' , ( ) => {
231+ it ( 'should call onEvict when an entry is evicted' , ( ) => {
232+ const evicted : Array < { key : string ; value : string } > = [ ]
233+ const cache = new LRUCache < string > ( 2 , undefined , ( key , value ) => {
234+ evicted . push ( { key, value } )
235+ } )
236+
237+ cache . set ( 'a' , 'value-a' )
238+ cache . set ( 'b' , 'value-b' )
239+ expect ( evicted . length ) . toBe ( 0 )
240+
241+ cache . set ( 'c' , 'value-c' ) // should evict 'a'
242+ expect ( evicted . length ) . toBe ( 1 )
243+ expect ( evicted [ 0 ] ) . toEqual ( { key : 'a' , value : 'value-a' } )
244+ } )
245+
246+ it ( 'should not call onEvict when updating existing entry' , ( ) => {
247+ const evicted : string [ ] = [ ]
248+ const cache = new LRUCache < string > ( 2 , undefined , ( key ) => {
249+ evicted . push ( key )
250+ } )
251+
252+ cache . set ( 'a' , 'value-a' )
253+ cache . set ( 'a' , 'new-value-a' )
254+ expect ( evicted . length ) . toBe ( 0 )
255+ } )
256+
257+ it ( 'should call onEvict for each evicted entry when multiple are evicted' , ( ) => {
258+ const evicted : string [ ] = [ ]
259+ const cache = new LRUCache < string > (
260+ 10 ,
261+ ( value ) => value . length ,
262+ ( key ) => {
263+ evicted . push ( key )
264+ }
265+ )
266+
267+ cache . set ( 'key1' , 'ab' ) // size 2
268+ cache . set ( 'key2' , 'cd' ) // size 2
269+ cache . set ( 'key3' , 'ef' ) // size 2, total = 6
270+ cache . set ( 'key4' , 'ghijklmno' ) // size 9, should evict key1, key2, key3
271+
272+ expect ( evicted ) . toEqual ( [ 'key1' , 'key2' , 'key3' ] )
273+ } )
274+
275+ it ( 'should work without onEvict callback' , ( ) => {
276+ const cache = new LRUCache < string > ( 2 )
277+ cache . set ( 'a' , 'value-a' )
278+ cache . set ( 'b' , 'value-b' )
279+ cache . set ( 'c' , 'value-c' ) // should evict without error
280+ expect ( cache . has ( 'a' ) ) . toBe ( false )
281+ } )
282+
283+ it ( 'should pass the evicted value to the callback' , ( ) => {
284+ const evicted : Array < { id : number } > = [ ]
285+ const cache = new LRUCache < { id : number } > (
286+ 1 ,
287+ undefined ,
288+ ( _key , value ) => {
289+ evicted . push ( value )
290+ }
291+ )
292+
293+ cache . set ( 'obj1' , { id : 1 } )
294+ cache . set ( 'obj2' , { id : 2 } ) // should evict obj1
295+
296+ expect ( evicted . length ) . toBe ( 1 )
297+ expect ( evicted [ 0 ] ) . toEqual ( { id : 1 } )
298+ } )
299+ } )
229300} )
0 commit comments