@@ -775,5 +775,64 @@ def test_popitem(self):
775775 self .assertRaises (KeyError , d .popitem )
776776
777777
778+ class SimpleLRUCache :
779+
780+ def __init__ (self , size ):
781+ super ().__init__ ()
782+ self .size = size
783+
784+ def __getitem__ (self , item ):
785+ value = super ().__getitem__ (item )
786+ self .move_to_end (item )
787+ return value
788+
789+ def __setitem__ (self , key , value ):
790+ while key not in self and len (self ) >= self .size :
791+ self .popitem (last = False )
792+ super ().__setitem__ (key , value )
793+ self .move_to_end (key )
794+
795+
796+ class SimpleLRUCacheTests :
797+
798+ def test_add_after_full (self ):
799+ c = self .type2test (2 )
800+ c ['t1' ] = 1
801+ c ['t2' ] = 2
802+ c ['t3' ] = 3
803+ self .assertEqual (list (c ), ['t2' , 't3' ])
804+
805+ def test_popitem (self ):
806+ c = self .type2test (3 )
807+ for i in range (1 , 4 ):
808+ c [i ] = i
809+ self .assertEqual (c .popitem (last = False ), (1 , 1 ))
810+ self .assertEqual (c .popitem (last = True ), (3 , 3 ))
811+
812+ def test_change_order_on_get (self ):
813+ c = self .type2test (3 )
814+ for i in range (1 , 4 ):
815+ c [i ] = i
816+ self .assertEqual (list (c ), list (range (1 , 4 )))
817+ self .assertEqual (c [2 ], 2 )
818+ self .assertEqual (list (c ), [1 , 3 , 2 ])
819+
820+
821+ class PySimpleLRUCacheTests (SimpleLRUCacheTests , unittest .TestCase ):
822+
823+ class type2test (SimpleLRUCache , py_coll .OrderedDict ):
824+ pass
825+
826+
827+ @unittest .skipUnless (c_coll , 'requires the C version of the collections module' )
828+ class CSimpleLRUCacheTests (SimpleLRUCacheTests , unittest .TestCase ):
829+
830+ @classmethod
831+ def setUpClass (cls ):
832+ class type2test (SimpleLRUCache , c_coll .OrderedDict ):
833+ pass
834+ cls .type2test = type2test
835+
836+
778837if __name__ == "__main__" :
779838 unittest .main ()
0 commit comments