view tests/test-lrucachedict.py @ 28385:3f9e25a42e69

destutil: choose non-closed branch head at first (BC) Before this patch, destupdate() returns the tipmost (descendant) branch head regardless of closed or not. But updating to closed branch head isn't reasonable for ordinary workflow, because: - "hg heads" doesn't show closed heads (= updated parent itself) by default - subsequent committing on it re-opens closed branch even if inactivation of closed head is needed, update destination isn't it, because it should be merged into to another branch in such case. This patch chooses non-closed descendant branch head as default update destination at first. If all descendant branch heads are closed, destupdate() returns the tipmost closed branch head. For simplicity, this patch chooses adding _destupdatebranchfallback() instead largely changing _destupdatebranch(). This patch changes not only normal lookup code path, but also the "no default branch" code path, for consistency.
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
date Mon, 07 Mar 2016 03:14:19 +0900
parents 6cd3044985c2
children e3f01188d439
line wrap: on
line source

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

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