Mercurial > hg-stable
changeset 39578:067f7d2c7d60
tests: rewrite test-lrucachedict.py to use unittest
This makes the code so much easier to test and debug.
Along the way, I discovered a bug in copy(), which I kind of
added test coverage for.
Differential Revision: https://phab.mercurial-scm.org/D4497
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Thu, 06 Sep 2018 11:27:25 -0700 |
parents | d06834e0f48e |
children | b31b01f93b11 |
files | tests/test-lrucachedict.py tests/test-lrucachedict.py.out |
diffstat | 2 files changed, 84 insertions(+), 118 deletions(-) [+] |
line wrap: on
line diff
--- a/tests/test-lrucachedict.py Wed Aug 29 15:17:11 2018 -0700 +++ b/tests/test-lrucachedict.py Thu Sep 06 11:27:25 2018 -0700 @@ -1,77 +1,105 @@ from __future__ import absolute_import, print_function +import unittest + +import silenttestrunner + from mercurial import ( util, ) -def printifpresent(d, xs, name='d'): - for x in xs: - present = x in d - print("'%s' in %s: %s" % (x, name, present)) - if present: - print("%s['%s']: %s" % (name, x, d[x])) +class testlrucachedict(unittest.TestCase): + def testsimple(self): + d = util.lrucachedict(4) + d['a'] = 'va' + d['b'] = 'vb' + d['c'] = 'vc' + d['d'] = 'vd' -def test_lrucachedict(): - d = util.lrucachedict(4) - d['a'] = 'va' - d['b'] = 'vb' - d['c'] = 'vc' - d['d'] = 'vd' + self.assertEqual(d['a'], 'va') + self.assertEqual(d['b'], 'vb') + self.assertEqual(d['c'], 'vc') + self.assertEqual(d['d'], 'vd') - # all of these should be present - printifpresent(d, ['a', 'b', 'c', 'd']) + # 'a' should be dropped because it was least recently used. + d['e'] = 've' + self.assertNotIn('a', d) + + self.assertIsNone(d.get('a')) - # 'a' should be dropped because it was least recently used - d['e'] = 've' - printifpresent(d, ['a', 'b', 'c', 'd', 'e']) + self.assertEqual(d['b'], 'vb') + self.assertEqual(d['c'], 'vc') + self.assertEqual(d['d'], 'vd') + self.assertEqual(d['e'], 've') - assert d.get('a') is None - assert d.get('e') == 've' + # Touch entries in some order (both get and set). + d['e'] + d['c'] = 'vc2' + d['d'] + d['b'] = 'vb2' - # touch entries in some order (get or set). - d['e'] - d['c'] = 'vc2' - d['d'] - d['b'] = 'vb2' + # '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') - # 'e' should be dropped now - d['f'] = 'vf' - printifpresent(d, ['b', 'c', 'd', 'e', 'f']) + d.clear() + for key in ('a', 'b', 'c', 'd', 'e', 'f'): + self.assertNotIn(key, d) - d.clear() - printifpresent(d, ['b', 'c', 'd', 'e', 'f']) + 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) - # Now test dicts that aren't full. - d = util.lrucachedict(4) - d['a'] = 1 - d['b'] = 2 - d['a'] - d['b'] - printifpresent(d, ['a', 'b']) + def testcopypartial(self): + d = util.lrucachedict(4) + d['a'] = 'va' + d['b'] = 'vb' + + dc = d.copy() + + self.assertEqual(len(dc), 2) + # TODO this fails + return + for key in ('a', 'b'): + self.assertIn(key, dc) + self.assertEqual(dc[key], 'v%s' % key) - # test copy method - d = util.lrucachedict(4) - d['a'] = 'va3' - d['b'] = 'vb3' - d['c'] = 'vc3' - d['d'] = 'vd3' + def testcopyfull(self): + d = util.lrucachedict(4) + d['a'] = 'va' + d['b'] = 'vb' + d['c'] = 'vc' + d['d'] = 'vd' - dc = d.copy() + dc = d.copy() + + for key in ('a', 'b', 'c', 'd'): + self.assertIn(key, dc) + self.assertEqual(dc[key], 'v%s' % key) - # all of these should be present - print("\nAll of these should be present:") - printifpresent(dc, ['a', 'b', 'c', 'd'], 'dc') + # '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) - # 'a' should be dropped because it was least recently used - print("\nAll of these except 'a' should be present:") - dc['e'] = 've3' - printifpresent(dc, ['a', 'b', 'c', 'd', 'e'], 'dc') + # Contents and order of original dict should remain unchanged. + dc['b'] = 'vb_new' - # contents and order of original dict should remain unchanged - print("\nThese should be in reverse alphabetical order and read 'v?3':") - dc['b'] = 'vb3_new' - for k in list(iter(d)): - print("d['%s']: %s" % (k, d[k])) + self.assertEqual(list(iter(d)), ['d', 'c', 'b', 'a']) + for key in ('a', 'b', 'c', 'd'): + self.assertEqual(d[key], 'v%s' % key) if __name__ == '__main__': - test_lrucachedict() + silenttestrunner.main(__name__)
--- a/tests/test-lrucachedict.py.out Wed Aug 29 15:17:11 2018 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -'a' in d: True -d['a']: va -'b' in d: True -d['b']: vb -'c' in d: True -d['c']: vc -'d' in d: True -d['d']: vd -'a' in d: False -'b' in d: True -d['b']: vb -'c' in d: True -d['c']: vc -'d' in d: True -d['d']: vd -'e' in d: True -d['e']: ve -'b' in d: True -d['b']: vb2 -'c' in d: True -d['c']: vc2 -'d' in d: True -d['d']: vd -'e' in d: False -'f' in d: True -d['f']: vf -'b' in d: False -'c' in d: False -'d' in d: False -'e' in d: False -'f' in d: False -'a' in d: True -d['a']: 1 -'b' in d: True -d['b']: 2 - -All of these should be present: -'a' in dc: True -dc['a']: va3 -'b' in dc: True -dc['b']: vb3 -'c' in dc: True -dc['c']: vc3 -'d' in dc: True -dc['d']: vd3 - -All of these except 'a' should be present: -'a' in dc: False -'b' in dc: True -dc['b']: vb3 -'c' in dc: True -dc['c']: vc3 -'d' in dc: True -dc['d']: vd3 -'e' in dc: True -dc['e']: ve3 - -These should be in reverse alphabetical order and read 'v?3': -d['d']: vd3 -d['c']: vc3 -d['b']: vb3 -d['a']: va3