[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

AltStyle によって変換されたページ (->オリジナル) /