python/nondist/sandbox/collections dequemodule.c, 1.4, 1.5 test_deque.py, 1.2, 1.3

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, )
participants (1)
-
rhettingerï¼ projects.sourceforge.net