PageRenderTime 46ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/External.LCA_RESTRICTED/Languages/IronPython/27/Lib/test/test_abc.py

http://github.com/IronLanguages/main
Python | 236 lines | 216 code | 15 blank | 5 comment | 1 complexity | 06907ad2bba1803b15e8424ba8947688 MD5 | raw file
Possible License(s): CPL-1.0, BSD-3-Clause, ISC, GPL-2.0, MPL-2.0-no-copyleft-exception
  1. # Copyright 2007 Google, Inc. All Rights Reserved.
  2. # Licensed to PSF under a Contributor Agreement.
  3. """Unit tests for abc.py."""
  4. import unittest, weakref
  5. from test import test_support
  6. import abc
  7. from inspect import isabstract
  8. import sys
  9. class TestABC(unittest.TestCase):
  10. def test_abstractmethod_basics(self):
  11. @abc.abstractmethod
  12. def foo(self): pass
  13. self.assertTrue(foo.__isabstractmethod__)
  14. def bar(self): pass
  15. self.assertFalse(hasattr(bar, "__isabstractmethod__"))
  16. def test_abstractproperty_basics(self):
  17. @abc.abstractproperty
  18. def foo(self): pass
  19. self.assertTrue(foo.__isabstractmethod__)
  20. def bar(self): pass
  21. self.assertFalse(hasattr(bar, "__isabstractmethod__"))
  22. class C:
  23. __metaclass__ = abc.ABCMeta
  24. @abc.abstractproperty
  25. def foo(self): return 3
  26. class D(C):
  27. @property
  28. def foo(self): return super(D, self).foo
  29. self.assertEqual(D().foo, 3)
  30. def test_abstractmethod_integration(self):
  31. for abstractthing in [abc.abstractmethod, abc.abstractproperty]:
  32. class C:
  33. __metaclass__ = abc.ABCMeta
  34. @abstractthing
  35. def foo(self): pass # abstract
  36. def bar(self): pass # concrete
  37. self.assertEqual(C.__abstractmethods__, set(["foo"]))
  38. self.assertRaises(TypeError, C) # because foo is abstract
  39. self.assertTrue(isabstract(C))
  40. class D(C):
  41. def bar(self): pass # concrete override of concrete
  42. self.assertEqual(D.__abstractmethods__, set(["foo"]))
  43. self.assertRaises(TypeError, D) # because foo is still abstract
  44. self.assertTrue(isabstract(D))
  45. class E(D):
  46. def foo(self): pass
  47. self.assertEqual(E.__abstractmethods__, set())
  48. E() # now foo is concrete, too
  49. self.assertFalse(isabstract(E))
  50. class F(E):
  51. @abstractthing
  52. def bar(self): pass # abstract override of concrete
  53. self.assertEqual(F.__abstractmethods__, set(["bar"]))
  54. self.assertRaises(TypeError, F) # because bar is abstract now
  55. self.assertTrue(isabstract(F))
  56. def test_subclass_oldstyle_class(self):
  57. class A:
  58. __metaclass__ = abc.ABCMeta
  59. class OldstyleClass:
  60. pass
  61. self.assertFalse(issubclass(OldstyleClass, A))
  62. self.assertFalse(issubclass(A, OldstyleClass))
  63. def test_isinstance_class(self):
  64. class A:
  65. __metaclass__ = abc.ABCMeta
  66. class OldstyleClass:
  67. pass
  68. self.assertFalse(isinstance(OldstyleClass, A))
  69. self.assertTrue(isinstance(OldstyleClass, type(OldstyleClass)))
  70. self.assertFalse(isinstance(A, OldstyleClass))
  71. # This raises a recursion depth error, but is low-priority:
  72. # self.assertTrue(isinstance(A, abc.ABCMeta))
  73. def test_registration_basics(self):
  74. class A:
  75. __metaclass__ = abc.ABCMeta
  76. class B(object):
  77. pass
  78. b = B()
  79. self.assertFalse(issubclass(B, A))
  80. self.assertFalse(issubclass(B, (A,)))
  81. self.assertNotIsInstance(b, A)
  82. self.assertNotIsInstance(b, (A,))
  83. A.register(B)
  84. self.assertTrue(issubclass(B, A))
  85. self.assertTrue(issubclass(B, (A,)))
  86. self.assertIsInstance(b, A)
  87. self.assertIsInstance(b, (A,))
  88. class C(B):
  89. pass
  90. c = C()
  91. self.assertTrue(issubclass(C, A))
  92. self.assertTrue(issubclass(C, (A,)))
  93. self.assertIsInstance(c, A)
  94. self.assertIsInstance(c, (A,))
  95. def test_isinstance_invalidation(self):
  96. class A:
  97. __metaclass__ = abc.ABCMeta
  98. class B(object):
  99. pass
  100. b = B()
  101. self.assertFalse(isinstance(b, A))
  102. self.assertFalse(isinstance(b, (A,)))
  103. A.register(B)
  104. self.assertTrue(isinstance(b, A))
  105. self.assertTrue(isinstance(b, (A,)))
  106. def test_registration_builtins(self):
  107. class A:
  108. __metaclass__ = abc.ABCMeta
  109. A.register(int)
  110. self.assertIsInstance(42, A)
  111. self.assertIsInstance(42, (A,))
  112. self.assertTrue(issubclass(int, A))
  113. self.assertTrue(issubclass(int, (A,)))
  114. class B(A):
  115. pass
  116. B.register(basestring)
  117. self.assertIsInstance("", A)
  118. self.assertIsInstance("", (A,))
  119. self.assertTrue(issubclass(str, A))
  120. self.assertTrue(issubclass(str, (A,)))
  121. def test_registration_edge_cases(self):
  122. class A:
  123. __metaclass__ = abc.ABCMeta
  124. A.register(A) # should pass silently
  125. class A1(A):
  126. pass
  127. self.assertRaises(RuntimeError, A1.register, A) # cycles not allowed
  128. class B(object):
  129. pass
  130. A1.register(B) # ok
  131. A1.register(B) # should pass silently
  132. class C(A):
  133. pass
  134. A.register(C) # should pass silently
  135. self.assertRaises(RuntimeError, C.register, A) # cycles not allowed
  136. C.register(B) # ok
  137. def test_register_non_class(self):
  138. class A(object):
  139. __metaclass__ = abc.ABCMeta
  140. self.assertRaisesRegexp(TypeError, "Can only register classes",
  141. A.register, 4)
  142. def test_registration_transitiveness(self):
  143. class A:
  144. __metaclass__ = abc.ABCMeta
  145. self.assertTrue(issubclass(A, A))
  146. self.assertTrue(issubclass(A, (A,)))
  147. class B:
  148. __metaclass__ = abc.ABCMeta
  149. self.assertFalse(issubclass(A, B))
  150. self.assertFalse(issubclass(A, (B,)))
  151. self.assertFalse(issubclass(B, A))
  152. self.assertFalse(issubclass(B, (A,)))
  153. class C:
  154. __metaclass__ = abc.ABCMeta
  155. A.register(B)
  156. class B1(B):
  157. pass
  158. self.assertTrue(issubclass(B1, A))
  159. self.assertTrue(issubclass(B1, (A,)))
  160. class C1(C):
  161. pass
  162. B1.register(C1)
  163. self.assertFalse(issubclass(C, B))
  164. self.assertFalse(issubclass(C, (B,)))
  165. self.assertFalse(issubclass(C, B1))
  166. self.assertFalse(issubclass(C, (B1,)))
  167. self.assertTrue(issubclass(C1, A))
  168. self.assertTrue(issubclass(C1, (A,)))
  169. self.assertTrue(issubclass(C1, B))
  170. self.assertTrue(issubclass(C1, (B,)))
  171. self.assertTrue(issubclass(C1, B1))
  172. self.assertTrue(issubclass(C1, (B1,)))
  173. C1.register(int)
  174. class MyInt(int):
  175. pass
  176. self.assertTrue(issubclass(MyInt, A))
  177. self.assertTrue(issubclass(MyInt, (A,)))
  178. self.assertIsInstance(42, A)
  179. self.assertIsInstance(42, (A,))
  180. def test_all_new_methods_are_called(self):
  181. class A:
  182. __metaclass__ = abc.ABCMeta
  183. class B(object):
  184. counter = 0
  185. def __new__(cls):
  186. B.counter += 1
  187. return super(B, cls).__new__(cls)
  188. class C(A, B):
  189. pass
  190. self.assertEqual(B.counter, 0)
  191. C()
  192. self.assertEqual(B.counter, 1)
  193. @unittest.skipIf(sys.platform=='cli', 'GC implementation detail')
  194. def test_cache_leak(self):
  195. # See issue #2521.
  196. class A(object):
  197. __metaclass__ = abc.ABCMeta
  198. @abc.abstractmethod
  199. def f(self):
  200. pass
  201. class C(A):
  202. def f(self):
  203. A.f(self)
  204. r = weakref.ref(C)
  205. # Trigger cache.
  206. C().f()
  207. del C
  208. test_support.gc_collect()
  209. self.assertEqual(r(), None)
  210. def test_main():
  211. test_support.run_unittest(TestABC)
  212. if __name__ == "__main__":
  213. unittest.main()