Commit d73202c5 authored by Raymond Hettinger's avatar Raymond Hettinger

Apply remove's mutation test after every equality test.

parent 4aec61e0
...@@ -19,11 +19,12 @@ class BadCmp: ...@@ -19,11 +19,12 @@ class BadCmp:
raise RuntimeError raise RuntimeError
class MutateCmp: class MutateCmp:
def __init__(self, deque): def __init__(self, deque, result):
self.deque = deque self.deque = deque
self.result = result
def __eq__(self, other): def __eq__(self, other):
self.deque.clear() self.deque.clear()
return True return self.result
class TestBasic(unittest.TestCase): class TestBasic(unittest.TestCase):
...@@ -226,9 +227,9 @@ class TestBasic(unittest.TestCase): ...@@ -226,9 +227,9 @@ class TestBasic(unittest.TestCase):
self.assert_(x is y) self.assert_(x is y)
# Handle evil mutator # Handle evil mutator
for match in (True, False):
d = deque(['ab']) d = deque(['ab'])
d.extend([MutateCmp(d), 'c']) d.extend([MutateCmp(d, match), 'c'])
e = deque(d)
self.assertRaises(IndexError, d.remove, 'c') self.assertRaises(IndexError, d.remove, 'c')
self.assertEqual(d, deque()) self.assertEqual(d, deque())
......
...@@ -376,14 +376,14 @@ deque_remove(dequeobject *deque, PyObject *value) ...@@ -376,14 +376,14 @@ deque_remove(dequeobject *deque, PyObject *value)
for (i=0 ; i<n ; i++) { for (i=0 ; i<n ; i++) {
PyObject *item = deque->leftblock->data[deque->leftindex]; PyObject *item = deque->leftblock->data[deque->leftindex];
int cmp = PyObject_RichCompareBool(item, value, Py_EQ); int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
if (cmp > 0) {
PyObject *tgt;
if (deque->len != n) { if (deque->len != n) {
PyErr_SetString(PyExc_IndexError, PyErr_SetString(PyExc_IndexError,
"deque mutated during remove()."); "deque mutated during remove().");
return NULL; return NULL;
} }
tgt = deque_popleft(deque, NULL); if (cmp > 0) {
PyObject *tgt = deque_popleft(deque, NULL);
assert (tgt != NULL); assert (tgt != NULL);
Py_DECREF(tgt); Py_DECREF(tgt);
if (_deque_rotate(deque, i) == -1) if (_deque_rotate(deque, i) == -1)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment