Author: Armin Rigo <ar...@tunes.org>
Branch: rpython-hash
Changeset: r89789:90dc3abfc8f2
Date: 2017-01-26 16:55 +0100
http://bitbucket.org/pypy/pypy/changeset/90dc3abfc8f2/

Log:    Check popitem() in the hypothesis test

diff --git a/rpython/rtyper/test/test_rdict.py 
b/rpython/rtyper/test/test_rdict.py
--- a/rpython/rtyper/test/test_rdict.py
+++ b/rpython/rtyper/test/test_rdict.py
@@ -1155,6 +1155,8 @@
 
 class MappingSpace(object):
     def __init__(self, s_key, s_value):
+        from rpython.rtyper.rtuple import TupleRepr
+
         self.s_key = s_key
         self.s_value = s_value
         rtyper = PseudoRTyper()
@@ -1168,6 +1170,8 @@
         self.reference = self.new_reference()
         self.ll_key = r_key.convert_const
         self.ll_value = r_value.convert_const
+        r_tuple = TupleRepr(rtyper, [r_key, r_value])
+        self.TUPLE = r_tuple.lowleveltype
 
     def setitem(self, key, value):
         ll_key = self.ll_key(key)
@@ -1191,6 +1195,22 @@
         self.reference.clear()
         assert self.ll_len(self.l_dict) == 0
 
+    def popitem(self):
+        try:
+            ll_tuple = self.ll_popitem(self.TUPLE, self.l_dict)
+        except KeyError:
+            assert len(self.reference) == 0
+        else:
+            ll_key = ll_tuple.item0
+            ll_value = ll_tuple.item1
+            for key, value in self.reference.iteritems():
+                if self.ll_key(key) == ll_key:
+                    assert self.ll_value(value) == ll_value
+                    del self.reference[key]
+                    break
+            else:
+                raise AssertionError("popitem() returned unexpected key")
+
     def fullcheck(self):
         assert self.ll_len(self.l_dict) == len(self.reference)
         for key, value in self.reference.iteritems():
@@ -1217,7 +1237,8 @@
     def steps(self):
         if not self.space:
             return builds(Action, just('setup'), tuples(st_keys, st_values))
-        global_actions = [Action('copydict', ()), Action('cleardict', ())]
+        global_actions = [Action('copydict', ()), Action('cleardict', ()),
+                          Action('popitem', ())]
         if self.space.reference:
             return (
                 self.st_setitem() | sampled_from(global_actions) |
@@ -1249,6 +1270,7 @@
     ll_contains = staticmethod(rdict.ll_contains)
     ll_copy = staticmethod(rdict.ll_copy)
     ll_clear = staticmethod(rdict.ll_clear)
+    ll_popitem = staticmethod(rdict.ll_popitem)
 
     def newdict(self, repr):
         return rdict.ll_newdict(repr.DICT)
diff --git a/rpython/rtyper/test/test_rordereddict.py 
b/rpython/rtyper/test/test_rordereddict.py
--- a/rpython/rtyper/test/test_rordereddict.py
+++ b/rpython/rtyper/test/test_rordereddict.py
@@ -345,6 +345,7 @@
     ll_contains = staticmethod(rodct.ll_dict_contains)
     ll_copy = staticmethod(rodct.ll_dict_copy)
     ll_clear = staticmethod(rodct.ll_dict_clear)
+    ll_popitem = staticmethod(rodct.ll_dict_popitem)
 
     def newdict(self, repr):
         return rodct.ll_newdict(repr.DICT)
@@ -363,6 +364,20 @@
                 break
         return keys_ll
 
+    def popitem(self):
+        # overridden to check that we're getting the most recent key,
+        # not a random one
+        try:
+            ll_tuple = self.ll_popitem(self.TUPLE, self.l_dict)
+        except KeyError:
+            assert len(self.reference) == 0
+        else:
+            ll_key = ll_tuple.item0
+            ll_value = ll_tuple.item1
+            key, value = self.reference.popitem()
+            assert self.ll_key(key) == ll_key
+            assert self.ll_value(value) == ll_value
+
     def fullcheck(self):
         # overridden to also check key order
         assert self.ll_len(self.l_dict) == len(self.reference)
@@ -379,4 +394,4 @@
 
 def test_hypothesis():
     run_state_machine_as_test(
-        ODictSM, settings(max_examples=500, stateful_step_count=100))
+        ODictSM, settings(max_examples=50000, stateful_step_count=100))
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to