mirror of
https://github.com/python/cpython
synced 2024-10-14 22:09:35 +00:00
* balance the left/right search for getitem.
* use assertions instead of tests after internal calls that can't fail. * expand test coverage
This commit is contained in:
parent
2b2795ac6d
commit
a435c53e13
|
@ -6,9 +6,14 @@
|
|||
import cPickle as pickle
|
||||
from cStringIO import StringIO
|
||||
import random
|
||||
import os
|
||||
|
||||
BIG = 100000
|
||||
|
||||
def fail():
|
||||
raise SyntaxError
|
||||
yield 1
|
||||
|
||||
class TestBasic(unittest.TestCase):
|
||||
|
||||
def test_basics(self):
|
||||
|
@ -58,6 +63,10 @@ def test_extendleft(self):
|
|||
self.assertRaises(TypeError, d.extendleft, 1)
|
||||
d.extendleft('bcd')
|
||||
self.assertEqual(list(d), list(reversed('abcd')))
|
||||
d = deque()
|
||||
d.extendleft(range(1000))
|
||||
self.assertEqual(list(d), list(reversed(range(1000))))
|
||||
self.assertRaises(SyntaxError, d.extendleft, fail())
|
||||
|
||||
def test_getitem(self):
|
||||
n = 200
|
||||
|
@ -151,6 +160,13 @@ def test_rotate(self):
|
|||
dr()
|
||||
self.assertEqual(tuple(d), tuple(e))
|
||||
|
||||
self.assertRaises(TypeError, d.rotate, 'x') # Wrong arg type
|
||||
self.assertRaises(TypeError, d.rotate, 1, 10) # Too many args
|
||||
|
||||
d = deque()
|
||||
d.rotate() # rotate an empty deque
|
||||
self.assertEqual(d, deque())
|
||||
|
||||
def test_len(self):
|
||||
d = deque('ab')
|
||||
self.assertEqual(len(d), 2)
|
||||
|
@ -178,6 +194,8 @@ def test_clear(self):
|
|||
d.clear()
|
||||
self.assertEqual(len(d), 0)
|
||||
self.assertEqual(list(d), [])
|
||||
d.clear() # clear an emtpy deque
|
||||
self.assertEqual(list(d), [])
|
||||
|
||||
def test_repr(self):
|
||||
d = deque(xrange(200))
|
||||
|
@ -189,10 +207,19 @@ def test_repr(self):
|
|||
def test_print(self):
|
||||
d = deque(xrange(200))
|
||||
d.append(d)
|
||||
f = StringIO()
|
||||
print >> f, d,
|
||||
self.assertEqual(f.getvalue(), repr(d))
|
||||
f.close()
|
||||
try:
|
||||
fo = open(test_support.TESTFN, "wb")
|
||||
print >> fo, d,
|
||||
fo.close()
|
||||
fo = open(test_support.TESTFN, "rb")
|
||||
self.assertEqual(fo.read(), repr(d))
|
||||
finally:
|
||||
fo.close()
|
||||
os.remove(test_support.TESTFN)
|
||||
|
||||
def test_init(self):
|
||||
self.assertRaises(TypeError, deque, 'abc', 2);
|
||||
self.assertRaises(TypeError, deque, 1);
|
||||
|
||||
def test_hash(self):
|
||||
self.assertRaises(TypeError, hash, deque('abc'))
|
||||
|
|
|
@ -245,7 +245,7 @@ deque_extendleft(dequeobject *deque, PyObject *iterable)
|
|||
deque->leftblock->data[deque->leftindex] = item;
|
||||
}
|
||||
Py_DECREF(it);
|
||||
if (PyErr_Occurred())
|
||||
if (PyErr_Occurred())
|
||||
return NULL;
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
@ -274,8 +274,7 @@ deque_rotate(dequeobject *deque, PyObject *args)
|
|||
|
||||
for (i=0 ; i<n ; i++) {
|
||||
item = deque_pop(deque, NULL);
|
||||
if (item == NULL)
|
||||
return NULL;
|
||||
assert (item != NULL);
|
||||
rv = deque_appendleft(deque, item);
|
||||
Py_DECREF(item);
|
||||
if (rv == NULL)
|
||||
|
@ -284,8 +283,7 @@ deque_rotate(dequeobject *deque, PyObject *args)
|
|||
}
|
||||
for (i=0 ; i>n ; i--) {
|
||||
item = deque_popleft(deque, NULL);
|
||||
if (item == NULL)
|
||||
return NULL;
|
||||
assert (item != NULL);
|
||||
rv = deque_append(deque, item);
|
||||
Py_DECREF(item);
|
||||
if (rv == NULL)
|
||||
|
@ -311,8 +309,7 @@ deque_clear(dequeobject *deque)
|
|||
|
||||
while (deque_len(deque)) {
|
||||
item = deque_pop(deque, NULL);
|
||||
if (item == NULL)
|
||||
return -1;
|
||||
assert (item != NULL);
|
||||
Py_DECREF(item);
|
||||
}
|
||||
assert(deque->leftblock == deque->rightblock &&
|
||||
|
@ -388,8 +385,7 @@ deque_del_item(dequeobject *deque, int i)
|
|||
Py_DECREF(item);
|
||||
|
||||
item = deque_popleft(deque, NULL);
|
||||
if (item == NULL)
|
||||
goto fail;
|
||||
assert (item != NULL);
|
||||
Py_DECREF(item);
|
||||
|
||||
item = deque_rotate(deque, plus_i);
|
||||
|
@ -409,9 +405,9 @@ deque_ass_item(dequeobject *deque, int i, PyObject *v)
|
|||
{
|
||||
PyObject *old_value;
|
||||
block *b;
|
||||
int n;
|
||||
int n, len=deque->len, halflen=(len+1)>>1, index=i;
|
||||
|
||||
if (i < 0 || i >= deque->len) {
|
||||
if (i < 0 || i >= len) {
|
||||
PyErr_SetString(PyExc_IndexError,
|
||||
"deque index out of range");
|
||||
return -1;
|
||||
|
@ -422,12 +418,12 @@ deque_ass_item(dequeobject *deque, int i, PyObject *v)
|
|||
i += deque->leftindex;
|
||||
n = i / BLOCKLEN;
|
||||
i %= BLOCKLEN;
|
||||
if (i < (deque->len >> 1)) {
|
||||
if (index <= halflen) {
|
||||
b = deque->leftblock;
|
||||
while (n--)
|
||||
b = b->rightlink;
|
||||
} else {
|
||||
n = (deque->leftindex + deque->len - 1) / BLOCKLEN - n;
|
||||
n = (deque->leftindex + len - 1) / BLOCKLEN - n;
|
||||
b = deque->rightblock;
|
||||
while (n--)
|
||||
b = b->leftlink;
|
||||
|
@ -442,8 +438,10 @@ deque_ass_item(dequeobject *deque, int i, PyObject *v)
|
|||
static PyObject *
|
||||
deque_clearmethod(dequeobject *deque)
|
||||
{
|
||||
if (deque_clear(deque) == -1)
|
||||
return NULL;
|
||||
int rv;
|
||||
|
||||
rv = deque_clear(deque);
|
||||
assert (rv != -1);
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue