PageRenderTime 45ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/contrib/python-x86_64/lib/python2.7/test/test_enumerate.py

https://gitlab.com/atom-k/android-plus-plus
Python | 255 lines | 217 code | 33 blank | 5 comment | 14 complexity | c710ad1ebbb4f878a9f98da378d172d2 MD5 | raw file
  1. import unittest
  2. import sys
  3. from test import test_support
  4. class G:
  5. 'Sequence using __getitem__'
  6. def __init__(self, seqn):
  7. self.seqn = seqn
  8. def __getitem__(self, i):
  9. return self.seqn[i]
  10. class I:
  11. 'Sequence using iterator protocol'
  12. def __init__(self, seqn):
  13. self.seqn = seqn
  14. self.i = 0
  15. def __iter__(self):
  16. return self
  17. def next(self):
  18. if self.i >= len(self.seqn): raise StopIteration
  19. v = self.seqn[self.i]
  20. self.i += 1
  21. return v
  22. class Ig:
  23. 'Sequence using iterator protocol defined with a generator'
  24. def __init__(self, seqn):
  25. self.seqn = seqn
  26. self.i = 0
  27. def __iter__(self):
  28. for val in self.seqn:
  29. yield val
  30. class X:
  31. 'Missing __getitem__ and __iter__'
  32. def __init__(self, seqn):
  33. self.seqn = seqn
  34. self.i = 0
  35. def next(self):
  36. if self.i >= len(self.seqn): raise StopIteration
  37. v = self.seqn[self.i]
  38. self.i += 1
  39. return v
  40. class E:
  41. 'Test propagation of exceptions'
  42. def __init__(self, seqn):
  43. self.seqn = seqn
  44. self.i = 0
  45. def __iter__(self):
  46. return self
  47. def next(self):
  48. 3 // 0
  49. class N:
  50. 'Iterator missing next()'
  51. def __init__(self, seqn):
  52. self.seqn = seqn
  53. self.i = 0
  54. def __iter__(self):
  55. return self
  56. class EnumerateTestCase(unittest.TestCase):
  57. enum = enumerate
  58. seq, res = 'abc', [(0,'a'), (1,'b'), (2,'c')]
  59. def test_basicfunction(self):
  60. self.assertEqual(type(self.enum(self.seq)), self.enum)
  61. e = self.enum(self.seq)
  62. self.assertEqual(iter(e), e)
  63. self.assertEqual(list(self.enum(self.seq)), self.res)
  64. self.enum.__doc__
  65. def test_getitemseqn(self):
  66. self.assertEqual(list(self.enum(G(self.seq))), self.res)
  67. e = self.enum(G(''))
  68. self.assertRaises(StopIteration, e.next)
  69. def test_iteratorseqn(self):
  70. self.assertEqual(list(self.enum(I(self.seq))), self.res)
  71. e = self.enum(I(''))
  72. self.assertRaises(StopIteration, e.next)
  73. def test_iteratorgenerator(self):
  74. self.assertEqual(list(self.enum(Ig(self.seq))), self.res)
  75. e = self.enum(Ig(''))
  76. self.assertRaises(StopIteration, e.next)
  77. def test_noniterable(self):
  78. self.assertRaises(TypeError, self.enum, X(self.seq))
  79. def test_illformediterable(self):
  80. self.assertRaises(TypeError, list, self.enum(N(self.seq)))
  81. def test_exception_propagation(self):
  82. self.assertRaises(ZeroDivisionError, list, self.enum(E(self.seq)))
  83. def test_argumentcheck(self):
  84. self.assertRaises(TypeError, self.enum) # no arguments
  85. self.assertRaises(TypeError, self.enum, 1) # wrong type (not iterable)
  86. self.assertRaises(TypeError, self.enum, 'abc', 'a') # wrong type
  87. self.assertRaises(TypeError, self.enum, 'abc', 2, 3) # too many arguments
  88. @test_support.cpython_only
  89. def test_tuple_reuse(self):
  90. # Tests an implementation detail where tuple is reused
  91. # whenever nothing else holds a reference to it
  92. self.assertEqual(len(set(map(id, list(enumerate(self.seq))))), len(self.seq))
  93. self.assertEqual(len(set(map(id, enumerate(self.seq)))), min(1,len(self.seq)))
  94. class MyEnum(enumerate):
  95. pass
  96. class SubclassTestCase(EnumerateTestCase):
  97. enum = MyEnum
  98. class TestEmpty(EnumerateTestCase):
  99. seq, res = '', []
  100. class TestBig(EnumerateTestCase):
  101. seq = range(10,20000,2)
  102. res = zip(range(20000), seq)
  103. class TestReversed(unittest.TestCase):
  104. def test_simple(self):
  105. class A:
  106. def __getitem__(self, i):
  107. if i < 5:
  108. return str(i)
  109. raise StopIteration
  110. def __len__(self):
  111. return 5
  112. for data in 'abc', range(5), tuple(enumerate('abc')), A(), xrange(1,17,5):
  113. self.assertEqual(list(data)[::-1], list(reversed(data)))
  114. self.assertRaises(TypeError, reversed, {})
  115. # don't allow keyword arguments
  116. self.assertRaises(TypeError, reversed, [], a=1)
  117. def test_classic_class(self):
  118. class A:
  119. def __reversed__(self):
  120. return [2, 1]
  121. self.assertEqual(list(reversed(A())), [2, 1])
  122. def test_xrange_optimization(self):
  123. x = xrange(1)
  124. self.assertEqual(type(reversed(x)), type(iter(x)))
  125. @test_support.cpython_only
  126. def test_len(self):
  127. # This is an implementation detail, not an interface requirement
  128. from test.test_iterlen import len
  129. for s in ('hello', tuple('hello'), list('hello'), xrange(5)):
  130. self.assertEqual(len(reversed(s)), len(s))
  131. r = reversed(s)
  132. list(r)
  133. self.assertEqual(len(r), 0)
  134. class SeqWithWeirdLen:
  135. called = False
  136. def __len__(self):
  137. if not self.called:
  138. self.called = True
  139. return 10
  140. raise ZeroDivisionError
  141. def __getitem__(self, index):
  142. return index
  143. r = reversed(SeqWithWeirdLen())
  144. self.assertRaises(ZeroDivisionError, len, r)
  145. def test_gc(self):
  146. class Seq:
  147. def __len__(self):
  148. return 10
  149. def __getitem__(self, index):
  150. return index
  151. s = Seq()
  152. r = reversed(s)
  153. s.r = r
  154. def test_args(self):
  155. self.assertRaises(TypeError, reversed)
  156. self.assertRaises(TypeError, reversed, [], 'extra')
  157. def test_bug1229429(self):
  158. # this bug was never in reversed, it was in
  159. # PyObject_CallMethod, and reversed_new calls that sometimes.
  160. if not hasattr(sys, "getrefcount"):
  161. return
  162. def f():
  163. pass
  164. r = f.__reversed__ = object()
  165. rc = sys.getrefcount(r)
  166. for i in range(10):
  167. try:
  168. reversed(f)
  169. except TypeError:
  170. pass
  171. else:
  172. self.fail("non-callable __reversed__ didn't raise!")
  173. self.assertEqual(rc, sys.getrefcount(r))
  174. def test_objmethods(self):
  175. # Objects must have __len__() and __getitem__() implemented.
  176. class NoLen(object):
  177. def __getitem__(self): return 1
  178. nl = NoLen()
  179. self.assertRaises(TypeError, reversed, nl)
  180. class NoGetItem(object):
  181. def __len__(self): return 2
  182. ngi = NoGetItem()
  183. self.assertRaises(TypeError, reversed, ngi)
  184. class EnumerateStartTestCase(EnumerateTestCase):
  185. def test_basicfunction(self):
  186. e = self.enum(self.seq)
  187. self.assertEqual(iter(e), e)
  188. self.assertEqual(list(self.enum(self.seq)), self.res)
  189. class TestStart(EnumerateStartTestCase):
  190. enum = lambda self, i: enumerate(i, start=11)
  191. seq, res = 'abc', [(11, 'a'), (12, 'b'), (13, 'c')]
  192. class TestLongStart(EnumerateStartTestCase):
  193. enum = lambda self, i: enumerate(i, start=sys.maxint+1)
  194. seq, res = 'abc', [(sys.maxint+1,'a'), (sys.maxint+2,'b'),
  195. (sys.maxint+3,'c')]
  196. def test_main(verbose=None):
  197. test_support.run_unittest(__name__)
  198. # verify reference counting
  199. if verbose and hasattr(sys, "gettotalrefcount"):
  200. counts = [None] * 5
  201. for i in xrange(len(counts)):
  202. test_support.run_unittest(__name__)
  203. counts[i] = sys.gettotalrefcount()
  204. print counts
  205. if __name__ == "__main__":
  206. test_main(verbose=True)