]> granicus.if.org Git - python/commitdiff
* balance the left/right search for getitem.
authorRaymond Hettinger <python@rcn.com>
Fri, 9 Jul 2004 04:10:20 +0000 (04:10 +0000)
committerRaymond Hettinger <python@rcn.com>
Fri, 9 Jul 2004 04:10:20 +0000 (04:10 +0000)
* use assertions instead of tests after internal calls that can't fail.
* expand test coverage

Lib/test/test_deque.py
Modules/collectionsmodule.c

index 13800ea215f2879f351d3877be08b8b9378f8e47..dc0cc6f51edb553a945c7f129c3d1a4854b89743 100644 (file)
@@ -6,9 +6,14 @@ import copy
 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 @@ class TestBasic(unittest.TestCase):
         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 @@ class TestBasic(unittest.TestCase):
             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 @@ class TestBasic(unittest.TestCase):
         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 @@ class TestBasic(unittest.TestCase):
     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'))
index da276ce3703cc3cef48415fb2ea4b2cecaaba30a..367b4441e28fc3df1f169f5fe266c222282d812e 100644 (file)
@@ -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;
 }