from __future__ import absolute_import, print_function from edenscm.mercurial import util from hghave import require 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()