[pypy-svn] r17474 - pypy/dist/pypy/rpython/test

arigo at codespeak.net arigo at codespeak.net
Sun Sep 11 21:03:11 CEST 2005


Author: arigo
Date: Sun Sep 11 21:03:10 2005
New Revision: 17474

Modified:
   pypy/dist/pypy/rpython/test/test_rdict.py
Log:
A stress test for the dictionary implementation.


Modified: pypy/dist/pypy/rpython/test/test_rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_rdict.py	(original)
+++ pypy/dist/pypy/rpython/test/test_rdict.py	Sun Sep 11 21:03:10 2005
@@ -1,7 +1,7 @@
 
 from pypy.rpython import lltype 
 from pypy.rpython.test.test_llinterp import interpret 
-from pypy.rpython import rstr, rdict
+from pypy.rpython import rstr, rint, rdict
 
 import py
 py.log.setconsumer("rtyper", py.log.STDOUT)
@@ -326,3 +326,59 @@
     assert res == 1000
     res = interpret(func, [524, 1036])
     assert res == -123
+
+# ____________________________________________________________
+
+def not_really_random():
+    """A random-ish generator, which also generates nice patterns from time to time.
+    Could be useful to detect problems associated with specific usage patterns."""
+    import random
+    x = random.random()
+    for i in range(12000):
+        r = 3.4 + i/20000.0
+        x = r*x - x*x
+        assert 0 <= x < 4
+        yield x
+
+def test_stress():
+    dictrepr = rdict.DictRepr(rint.signed_repr, rint.signed_repr)
+    dictrepr.setup()
+    l_dict = rdict.ll_newdict(dictrepr)
+    referencetable = [None] * 400
+    referencelength = 0
+    value = 0
+
+    def complete_check():
+        for n, refvalue in zip(range(len(referencetable)), referencetable):
+            try:
+                gotvalue = rdict.ll_dict_getitem(l_dict, n, dictrepr)
+            except KeyError:
+                assert refvalue is None
+            else:
+                assert gotvalue == refvalue
+
+    for x in not_really_random():
+        n = int(x*100.0)    # 0 <= x < 400
+        op = repr(x)[-1]
+        if op <= '2' and referencetable[n] is not None:
+            rdict.ll_dict_delitem(l_dict, n, dictrepr)
+            referencetable[n] = None
+            referencelength -= 1
+        elif op <= '6':
+            rdict.ll_dict_setitem(l_dict, n, value, dictrepr)
+            if referencetable[n] is None:
+                referencelength += 1
+            referencetable[n] = value
+            value += 1
+        else:
+            try:
+                gotvalue = rdict.ll_dict_getitem(l_dict, n, dictrepr)
+            except KeyError:
+                assert referencetable[n] is None
+            else:
+                assert gotvalue == referencetable[n]
+        if 1.38 <= x <= 1.39:
+            complete_check()
+            print 'current dict length:', referencelength
+        assert l_dict.num_items == referencelength
+    complete_check()



More information about the Pypy-commit mailing list