tests/test-lrucachedict.py
author Martin von Zweigbergk <martinvonz@google.com>
Sun, 14 Jan 2018 00:02:40 -0800
changeset 35710 5cd60b0587a8
parent 29828 79add5a4e857
child 39562 067f7d2c7d60
permissions -rw-r--r--
evolution: make reporting of new unstable changesets optional This makes it possible to turn off the reporting of unstable changesets (e.g. "1 new orphan changesets"), just in case it's too slow for some users. Anyone who's been using the evolve extension has already been accepting the cost of the reporting, so this is just for the few users who have turned on obsmarkers but not been using the evolve extension (as I believe Facebook has). Differential Revision: https://phab.mercurial-scm.org/D1868

from __future__ import absolute_import, print_function

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]))

def test_lrucachedict():
    d = util.lrucachedict(4)
    d['a'] = 'va'
    d['b'] = 'vb'
    d['c'] = 'vc'
    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'
    printifpresent(d, ['a', 'b', 'c', 'd', 'e'])

    assert d.get('a') is None
    assert d.get('e') == 've'

    # 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'
    printifpresent(d, ['b', 'c', 'd', 'e', 'f'])

    d.clear()
    printifpresent(d, ['b', 'c', 'd', 'e', 'f'])

    # 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'])

    # test copy method
    d = util.lrucachedict(4)
    d['a'] = 'va3'
    d['b'] = 'vb3'
    d['c'] = 'vc3'
    d['d'] = 'vd3'

    dc = d.copy()

    # 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
    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
    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]))

if __name__ == '__main__':
    test_lrucachedict()