##// END OF EJS Templates
merge default into stable for 5.4 release
merge default into stable for 5.4 release

File last commit:

r43346:2372284d default
r45223:26ce8e75 merge 5.4rc0 stable
Show More
test-lrucachedict.py
367 lines | 10.6 KiB | text/x-python | PythonLexer
/ tests / test-lrucachedict.py
Pulkit Goyal
tests: make test-lrucachedict use print_function
r28931 from __future__ import absolute_import, print_function
Pulkit Goyal
tests: make test-lrucachedict use absolute_import
r28930
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 import unittest
import silenttestrunner
Augie Fackler
formatting: blacken the codebase...
r43346 from mercurial import util
Siddharth Agarwal
util: add an LRU cache dict...
r18603
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 class testlrucachedict(unittest.TestCase):
def testsimple(self):
d = util.lrucachedict(4)
Gregory Szorc
util: make capacity a public attribute on lrucachedict...
r39600 self.assertEqual(d.capacity, 4)
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 d.insert('a', 'va', cost=2)
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 d['b'] = 'vb'
d['c'] = 'vc'
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 d.insert('d', 'vd', cost=42)
Siddharth Agarwal
util: add an LRU cache dict...
r18603
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 self.assertEqual(d['a'], 'va')
self.assertEqual(d['b'], 'vb')
self.assertEqual(d['c'], 'vc')
self.assertEqual(d['d'], 'vd')
Siddharth Agarwal
util: add an LRU cache dict...
r18603
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 self.assertEqual(d.totalcost, 44)
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 # 'a' should be dropped because it was least recently used.
d['e'] = 've'
self.assertNotIn('a', d)
self.assertIsNone(d.get('a'))
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 self.assertEqual(d.totalcost, 42)
Siddharth Agarwal
util: add an LRU cache dict...
r18603
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 self.assertEqual(d['b'], 'vb')
self.assertEqual(d['c'], 'vc')
self.assertEqual(d['d'], 'vd')
self.assertEqual(d['e'], 've')
Siddharth Agarwal
util: add an LRU cache dict...
r18603
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 # Replacing item with different cost adjusts totalcost.
d.insert('e', 've', cost=4)
self.assertEqual(d.totalcost, 46)
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 # Touch entries in some order (both get and set).
d['e']
d['c'] = 'vc2'
d['d']
d['b'] = 'vb2'
Gregory Szorc
util: properly implement lrucachedict.get()...
r29828
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 # 'e' should be dropped now
d['f'] = 'vf'
self.assertNotIn('e', d)
self.assertEqual(d['b'], 'vb2')
self.assertEqual(d['c'], 'vc2')
self.assertEqual(d['d'], 'vd')
self.assertEqual(d['f'], 'vf')
Siddharth Agarwal
util: add an LRU cache dict...
r18603
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 d.clear()
for key in ('a', 'b', 'c', 'd', 'e', 'f'):
self.assertNotIn(key, d)
Siddharth Agarwal
util: add an LRU cache dict...
r18603
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 def testunfull(self):
d = util.lrucachedict(4)
d['a'] = 1
d['b'] = 2
d['a']
d['b']
for key in ('a', 'b'):
self.assertIn(key, d)
Siddharth Agarwal
lrucachedict: implement clear()
r19710
Gregory Szorc
util: update lrucachedict order during get()...
r39607 def testget(self):
d = util.lrucachedict(4)
d['a'] = 'va'
d['b'] = 'vb'
d['c'] = 'vc'
self.assertIsNone(d.get('missing'))
self.assertEqual(list(d), ['c', 'b', 'a'])
self.assertEqual(d.get('a'), 'va')
self.assertEqual(list(d), ['a', 'c', 'b'])
Yuya Nishihara
util: add method to peek item in lrucachedict...
r40915 def testpeek(self):
d = util.lrucachedict(4)
d['a'] = 'va'
d['b'] = 'vb'
d['c'] = 'vc'
with self.assertRaises(KeyError):
d.peek('missing')
self.assertEqual(list(d), ['c', 'b', 'a'])
self.assertIsNone(d.peek('missing', None))
self.assertEqual(list(d), ['c', 'b', 'a'])
self.assertEqual(d.peek('a'), 'va')
self.assertEqual(list(d), ['c', 'b', 'a'])
Yuya Nishihara
util: implement pop() on lrucachedict...
r40916 def testpop(self):
d = util.lrucachedict(4)
d['a'] = 'va'
d['b'] = 'vb'
d['c'] = 'vc'
with self.assertRaises(KeyError):
d.pop('missing')
self.assertEqual(list(d), ['c', 'b', 'a'])
self.assertIsNone(d.pop('missing', None))
self.assertEqual(list(d), ['c', 'b', 'a'])
self.assertEqual(d.pop('b'), 'vb')
self.assertEqual(list(d), ['c', 'a'])
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 def testcopypartial(self):
d = util.lrucachedict(4)
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 d.insert('a', 'va', cost=4)
d.insert('b', 'vb', cost=2)
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598
dc = d.copy()
self.assertEqual(len(dc), 2)
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 self.assertEqual(dc.totalcost, 6)
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 for key in ('a', 'b'):
self.assertIn(key, dc)
self.assertEqual(dc[key], 'v%s' % key)
Gregory Szorc
util: reimplement lrucachedict...
r27371
Gregory Szorc
util: properly copy lrucachedict instances...
r39599 self.assertEqual(len(d), 2)
for key in ('a', 'b'):
self.assertIn(key, d)
self.assertEqual(d[key], 'v%s' % key)
d['c'] = 'vc'
del d['b']
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 self.assertEqual(d.totalcost, 4)
Gregory Szorc
util: properly copy lrucachedict instances...
r39599 dc = d.copy()
self.assertEqual(len(dc), 2)
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 self.assertEqual(dc.totalcost, 4)
Gregory Szorc
util: properly copy lrucachedict instances...
r39599 for key in ('a', 'c'):
self.assertIn(key, dc)
self.assertEqual(dc[key], 'v%s' % key)
def testcopyempty(self):
d = util.lrucachedict(4)
dc = d.copy()
self.assertEqual(len(dc), 0)
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 def testcopyfull(self):
d = util.lrucachedict(4)
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 d.insert('a', 'va', cost=42)
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 d['b'] = 'vb'
d['c'] = 'vc'
d['d'] = 'vd'
Eric Sumner
lrucachedict: add copy method...
r27576
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 dc = d.copy()
for key in ('a', 'b', 'c', 'd'):
self.assertIn(key, dc)
self.assertEqual(dc[key], 'v%s' % key)
Eric Sumner
lrucachedict: add copy method...
r27576
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 self.assertEqual(d.totalcost, 42)
self.assertEqual(dc.totalcost, 42)
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 # 'a' should be dropped because it was least recently used.
dc['e'] = 've'
self.assertNotIn('a', dc)
for key in ('b', 'c', 'd', 'e'):
self.assertIn(key, dc)
self.assertEqual(dc[key], 'v%s' % key)
Eric Sumner
lrucachedict: add copy method...
r27576
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 self.assertEqual(d.totalcost, 42)
self.assertEqual(dc.totalcost, 0)
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 # Contents and order of original dict should remain unchanged.
dc['b'] = 'vb_new'
Eric Sumner
lrucachedict: add copy method...
r27576
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 self.assertEqual(list(iter(d)), ['d', 'c', 'b', 'a'])
for key in ('a', 'b', 'c', 'd'):
self.assertEqual(d[key], 'v%s' % key)
Eric Sumner
lrucachedict: add copy method...
r27576
Gregory Szorc
util: teach lrucachedict to enforce a max total cost...
r39604 d = util.lrucachedict(4, maxcost=42)
d.insert('a', 'va', cost=5)
d.insert('b', 'vb', cost=4)
d.insert('c', 'vc', cost=3)
dc = d.copy()
self.assertEqual(dc.maxcost, 42)
self.assertEqual(len(dc), 3)
# Max cost can be lowered as part of copy.
dc = d.copy(maxcost=10)
self.assertEqual(dc.maxcost, 10)
self.assertEqual(len(dc), 2)
self.assertEqual(dc.totalcost, 7)
self.assertIn('b', dc)
self.assertIn('c', dc)
Gregory Szorc
util: ability to change capacity when copying lrucachedict...
r39601 def testcopydecreasecapacity(self):
d = util.lrucachedict(5)
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 d.insert('a', 'va', cost=4)
d.insert('b', 'vb', cost=2)
Gregory Szorc
util: ability to change capacity when copying lrucachedict...
r39601 d['c'] = 'vc'
d['d'] = 'vd'
dc = d.copy(2)
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 self.assertEqual(dc.totalcost, 0)
Gregory Szorc
util: ability to change capacity when copying lrucachedict...
r39601 for key in ('a', 'b'):
self.assertNotIn(key, dc)
for key in ('c', 'd'):
self.assertIn(key, dc)
self.assertEqual(dc[key], 'v%s' % key)
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 dc.insert('e', 've', cost=7)
self.assertEqual(dc.totalcost, 7)
Gregory Szorc
util: ability to change capacity when copying lrucachedict...
r39601 self.assertNotIn('c', dc)
for key in ('d', 'e'):
self.assertIn(key, dc)
self.assertEqual(dc[key], 'v%s' % key)
# Original should remain unchanged.
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 self.assertEqual(d.totalcost, 6)
Gregory Szorc
util: ability to change capacity when copying lrucachedict...
r39601 for key in ('a', 'b', 'c', 'd'):
self.assertIn(key, d)
self.assertEqual(d[key], 'v%s' % key)
def testcopyincreasecapacity(self):
d = util.lrucachedict(5)
d['a'] = 'va'
d['b'] = 'vb'
d['c'] = 'vc'
d['d'] = 'vd'
dc = d.copy(6)
for key in ('a', 'b', 'c', 'd'):
self.assertIn(key, dc)
self.assertEqual(dc[key], 'v%s' % key)
dc['e'] = 've'
dc['f'] = 'vf'
for key in ('a', 'b', 'c', 'd', 'e', 'f'):
self.assertIn(key, dc)
self.assertEqual(dc[key], 'v%s' % key)
dc['g'] = 'vg'
self.assertNotIn('a', dc)
for key in ('b', 'c', 'd', 'e', 'f', 'g'):
self.assertIn(key, dc)
self.assertEqual(dc[key], 'v%s' % key)
# Original should remain unchanged.
for key in ('a', 'b', 'c', 'd'):
self.assertIn(key, d)
self.assertEqual(d[key], 'v%s' % key)
Gregory Szorc
util: add a popoldest() method to lrucachedict...
r39602 def testpopoldest(self):
d = util.lrucachedict(4)
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 d.insert('a', 'va', cost=10)
d.insert('b', 'vb', cost=5)
Gregory Szorc
util: add a popoldest() method to lrucachedict...
r39602
self.assertEqual(len(d), 2)
self.assertEqual(d.popoldest(), ('a', 'va'))
self.assertEqual(len(d), 1)
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 self.assertEqual(d.totalcost, 5)
Gregory Szorc
util: add a popoldest() method to lrucachedict...
r39602 self.assertEqual(d.popoldest(), ('b', 'vb'))
self.assertEqual(len(d), 0)
Gregory Szorc
util: allow lrucachedict to track cost of entries...
r39603 self.assertEqual(d.totalcost, 0)
Gregory Szorc
util: add a popoldest() method to lrucachedict...
r39602 self.assertIsNone(d.popoldest())
d['a'] = 'va'
d['b'] = 'vb'
d['c'] = 'vc'
d['d'] = 'vd'
self.assertEqual(d.popoldest(), ('a', 'va'))
self.assertEqual(len(d), 3)
for key in ('b', 'c', 'd'):
self.assertEqual(d[key], 'v%s' % key)
d['a'] = 'va'
self.assertEqual(d.popoldest(), ('b', 'vb'))
Gregory Szorc
util: teach lrucachedict to enforce a max total cost...
r39604 def testmaxcost(self):
# Item cost is zero by default.
d = util.lrucachedict(6, maxcost=10)
d['a'] = 'va'
d['b'] = 'vb'
d['c'] = 'vc'
d['d'] = 'vd'
self.assertEqual(len(d), 4)
self.assertEqual(d.totalcost, 0)
d.clear()
# Insertion to exact cost threshold works without eviction.
d.insert('a', 'va', cost=6)
d.insert('b', 'vb', cost=4)
self.assertEqual(len(d), 2)
self.assertEqual(d['a'], 'va')
self.assertEqual(d['b'], 'vb')
# Inserting a new element with 0 cost works.
d['c'] = 'vc'
self.assertEqual(len(d), 3)
# Inserting a new element with cost putting us above high
# water mark evicts oldest single item.
d.insert('d', 'vd', cost=1)
self.assertEqual(len(d), 3)
self.assertEqual(d.totalcost, 5)
self.assertNotIn('a', d)
for key in ('b', 'c', 'd'):
self.assertEqual(d[key], 'v%s' % key)
# Inserting a new element with enough room for just itself
# evicts all items before.
d.insert('e', 've', cost=10)
self.assertEqual(len(d), 1)
self.assertEqual(d.totalcost, 10)
self.assertIn('e', d)
# Inserting a new element with cost greater than threshold
# still retains that item.
d.insert('f', 'vf', cost=11)
self.assertEqual(len(d), 1)
self.assertEqual(d.totalcost, 11)
self.assertIn('f', d)
# Inserting a new element will evict the last item since it is
# too large.
d['g'] = 'vg'
self.assertEqual(len(d), 1)
self.assertEqual(d.totalcost, 0)
self.assertIn('g', d)
d.clear()
d.insert('a', 'va', cost=7)
d.insert('b', 'vb', cost=3)
self.assertEqual(len(d), 2)
# Replacing a value with smaller cost won't result in eviction.
d.insert('b', 'vb2', cost=2)
self.assertEqual(len(d), 2)
# Replacing a value with a higher cost will evict when threshold
# exceeded.
d.insert('b', 'vb3', cost=4)
self.assertEqual(len(d), 1)
self.assertNotIn('a', d)
def testmaxcostcomplex(self):
d = util.lrucachedict(100, maxcost=100)
d.insert('a', 'va', cost=9)
d.insert('b', 'vb', cost=21)
d.insert('c', 'vc', cost=7)
d.insert('d', 'vc', cost=50)
self.assertEqual(d.totalcost, 87)
# Inserting new element should free multiple elements so we hit
# low water mark.
d.insert('e', 'vd', cost=25)
Gregory Szorc
util: lower water mark when removing nodes after cost limit reached...
r39606 self.assertEqual(len(d), 2)
Gregory Szorc
util: teach lrucachedict to enforce a max total cost...
r39604 self.assertNotIn('a', d)
self.assertNotIn('b', d)
Gregory Szorc
util: lower water mark when removing nodes after cost limit reached...
r39606 self.assertNotIn('c', d)
Gregory Szorc
util: teach lrucachedict to enforce a max total cost...
r39604 self.assertIn('d', d)
self.assertIn('e', d)
Augie Fackler
formatting: blacken the codebase...
r43346
Siddharth Agarwal
util: add an LRU cache dict...
r18603 if __name__ == '__main__':
Gregory Szorc
tests: rewrite test-lrucachedict.py to use unittest...
r39598 silenttestrunner.main(__name__)