[Python-checkins] python/nondist/sandbox/collections dequemodule.c, 1.4, 1.5 test_deque.py, 1.2, 1.3

rhettinger at projects.sourceforge.net rhettinger at projects.sourceforge.net
Tue Jan 27 09:41:32 EST 2004


Update of /cvsroot/python/python/nondist/sandbox/collections
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24657

Modified Files:
	dequemodule.c test_deque.py 
Log Message:
* Change IndexError to LookupError
* Add more tests



Index: dequemodule.c
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/collections/dequemodule.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** dequemodule.c	27 Jan 2004 01:49:25 -0000	1.4
--- dequemodule.c	27 Jan 2004 14:41:30 -0000	1.5
***************
*** 15,19 ****
  } block;
  
! static block *newblock(block *leftlink, block *rightlink){
  	block *b = PyMem_Malloc(sizeof(block));
  	if (b == NULL) {
--- 15,19 ----
  } block;
  
! static block *newblock(block *leftlink, block *rightlink) {
  	block *b = PyMem_Malloc(sizeof(block));
  	if (b == NULL) {
***************
*** 109,113 ****
  	if (deque->leftblock == deque->rightblock &&
  		deque->leftindex > deque->rightindex) {
! 		PyErr_SetString(PyExc_IndexError, "pop from an emtpy deque");
  		return NULL;
  	}
--- 109,113 ----
  	if (deque->leftblock == deque->rightblock &&
  		deque->leftindex > deque->rightindex) {
! 		PyErr_SetString(PyExc_LookupError, "pop from an emtpy deque");
  		return NULL;
  	}
***************
*** 136,140 ****
  	if (deque->leftblock == deque->rightblock &&
  		deque->leftindex > deque->rightindex) {
! 		PyErr_SetString(PyExc_IndexError, "pop from an emtpy deque");
  		return NULL;
  	}
--- 136,140 ----
  	if (deque->leftblock == deque->rightblock &&
  		deque->leftindex > deque->rightindex) {
! 		PyErr_SetString(PyExc_LookupError, "pop from an emtpy deque");
  		return NULL;
  	}

Index: test_deque.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/collections/test_deque.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** test_deque.py	27 Jan 2004 01:49:25 -0000	1.2
--- test_deque.py	27 Jan 2004 14:41:30 -0000	1.3
***************
*** 10,14 ****
  class TestBasic(unittest.TestCase):
  
!     def test_exercise_basics(self):
          d = deque(xrange(100))
          d.__init__(xrange(100, 200))
--- 10,14 ----
  class TestBasic(unittest.TestCase):
  
!     def test_basics(self):
          d = deque(xrange(100))
          d.__init__(xrange(100, 200))
***************
*** 29,36 ****
          self.assertEqual(list(d), range(50, 150))
  
      def test_underflow(self):
          d = deque()
!         self.assertRaises(IndexError, d.pop)  ## XXX should be lookuperror?
!         self.assertRaises(IndexError, d.popleft)
  
      def test_clear(self):
--- 29,52 ----
          self.assertEqual(list(d), range(50, 150))
  
+     def test_len(self):
+         d = deque('ab')
+         self.assertEqual(len(d), 2)
+         d.popleft()
+         self.assertEqual(len(d), 1)
+         d.pop()
+         self.assertEqual(len(d), 0)
+         self.assertRaises(LookupError, d.pop)
+         self.assertEqual(len(d), 0)
+         d.append('c')
+         self.assertEqual(len(d), 1)
+         d.appendleft('d')
+         self.assertEqual(len(d), 2)
+         d.clear()
+         self.assertEqual(len(d), 0)
+ 
      def test_underflow(self):
          d = deque()
!         self.assertRaises(LookupError, d.pop)
!         self.assertRaises(LookupError, d.popleft)
  
      def test_clear(self):
***************
*** 153,156 ****
--- 169,306 ----
          self.assertEqual(list(d), list(e))
  
+ def R(seqn):
+     'Regular generator'
+     for i in seqn:
+         yield i
+ 
+ class G:
+     'Sequence using __getitem__'
+     def __init__(self, seqn):
+         self.seqn = seqn
+     def __getitem__(self, i):
+         return self.seqn[i]
+ 
+ class I:
+     'Sequence using iterator protocol'
+     def __init__(self, seqn):
+         self.seqn = seqn
+         self.i = 0
+     def __iter__(self):
+         return self
+     def next(self):
+         if self.i >= len(self.seqn): raise StopIteration
+         v = self.seqn[self.i]
+         self.i += 1
+         return v
+ 
+ class Ig:
+     'Sequence using iterator protocol defined with a generator'
+     def __init__(self, seqn):
+         self.seqn = seqn
+         self.i = 0
+     def __iter__(self):
+         for val in self.seqn:
+             yield val
+ 
+ class X:
+     'Missing __getitem__ and __iter__'
+     def __init__(self, seqn):
+         self.seqn = seqn
+         self.i = 0
+     def next(self):
+         if self.i >= len(self.seqn): raise StopIteration
+         v = self.seqn[self.i]
+         self.i += 1
+         return v
+ 
+ class N:
+     'Iterator missing next()'
+     def __init__(self, seqn):
+         self.seqn = seqn
+         self.i = 0
+     def __iter__(self):
+         return self
+ 
+ class E:
+     'Test propagation of exceptions'
+     def __init__(self, seqn):
+         self.seqn = seqn
+         self.i = 0
+     def __iter__(self):
+         return self
+     def next(self):
+         3/0
+ 
+ class S:
+     'Test immediate stop'
+     def __init__(self, seqn):
+         pass
+     def __iter__(self):
+         return self
+     def next(self):
+         raise StopIteration
+ 
+ from itertools import chain, imap
+ def L(seqn):
+     'Test multiple tiers of iterators'
+     return chain(imap(lambda x:x, R(Ig(G(seqn)))))
+ 
+ 
+ class TestVariousIteratorArgs(unittest.TestCase):
+ 
+     def test_constructor(self):
+         for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
+             for g in (G, I, Ig, S, L, R):
+                 self.assertEqual(list(deque(g(s))), list(g(s)))
+             self.assertRaises(TypeError, deque, X(s))
+             self.assertRaises(TypeError, deque, N(s))
+             self.assertRaises(ZeroDivisionError, deque, E(s))
+ 
+ class Deque(deque):
+     pass
+ 
+ class TestSubclass(unittest.TestCase):
+ 
+     def test_basics(self):
+         d = Deque(xrange(100))
+         d.__init__(xrange(100, 200))
+         for i in xrange(200, 400):
+             d.append(i)
+         for i in reversed(xrange(-200, 0)):
+             d.appendleft(i)
+         self.assertEqual(list(d), range(-200, 400))
+         self.assertEqual(len(d), 600)
+ 
+         left = [d.popleft() for i in xrange(250)]
+         self.assertEqual(left, range(-200, 50))
+         self.assertEqual(list(d), range(50, 400))
+ 
+         right = [d.pop() for i in xrange(250)]
+         right.reverse()
+         self.assertEqual(right, range(150, 400))
+         self.assertEqual(list(d), range(50, 150))
+ 
+         d.clear()
+         self.assertEqual(len(d), 0)
+ 
+     def test_copy_pickle(self):
+ 
+         d = Deque('abc')
+ 
+         e = d.__copy__()
+         self.assertEqual(type(d), type(e))
+         self.assertEqual(list(d), list(e))
+ 
+         e = Deque(d)
+         self.assertEqual(type(d), type(e))
+         self.assertEqual(list(d), list(e))
+ 
+         s = pickle.dumps(d)
+         e = pickle.loads(s)
+         self.assertNotEqual(id(d), id(e))
+         self.assertEqual(type(d), type(e))
+         self.assertEqual(list(d), list(e))
+ 
+ 
  #==============================================================================
  
***************
*** 160,163 ****
--- 310,315 ----
      test_classes = (
          TestBasic,
+         TestVariousIteratorArgs,
+         TestSubclass,
      )
  




More information about the Python-checkins mailing list