test_abc.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. # Copyright 2007 Google, Inc. All Rights Reserved.
  2. # Licensed to PSF under a Contributor Agreement.
  3. # Note: each test is run with Python and C versions of ABCMeta. Except for
  4. # test_ABC_helper(), which assures that abc.ABC is an instance of abc.ABCMeta.
  5. """Unit tests for abc.py."""
  6. import unittest
  7. import abc
  8. import _py_abc
  9. from inspect import isabstract
  10. def test_factory(abc_ABCMeta, abc_get_cache_token):
  11. class TestLegacyAPI(unittest.TestCase):
  12. def test_abstractproperty_basics(self):
  13. @abc.abstractproperty
  14. def foo(self): pass
  15. self.assertTrue(foo.__isabstractmethod__)
  16. def bar(self): pass
  17. self.assertFalse(hasattr(bar, "__isabstractmethod__"))
  18. class C(metaclass=abc_ABCMeta):
  19. @abc.abstractproperty
  20. def foo(self): return 3
  21. self.assertRaises(TypeError, C)
  22. class D(C):
  23. @property
  24. def foo(self): return super().foo
  25. self.assertEqual(D().foo, 3)
  26. self.assertFalse(getattr(D.foo, "__isabstractmethod__", False))
  27. def test_abstractclassmethod_basics(self):
  28. @abc.abstractclassmethod
  29. def foo(cls): pass
  30. self.assertTrue(foo.__isabstractmethod__)
  31. @classmethod
  32. def bar(cls): pass
  33. self.assertFalse(getattr(bar, "__isabstractmethod__", False))
  34. class C(metaclass=abc_ABCMeta):
  35. @abc.abstractclassmethod
  36. def foo(cls): return cls.__name__
  37. self.assertRaises(TypeError, C)
  38. class D(C):
  39. @classmethod
  40. def foo(cls): return super().foo()
  41. self.assertEqual(D.foo(), 'D')
  42. self.assertEqual(D().foo(), 'D')
  43. def test_abstractstaticmethod_basics(self):
  44. @abc.abstractstaticmethod
  45. def foo(): pass
  46. self.assertTrue(foo.__isabstractmethod__)
  47. @staticmethod
  48. def bar(): pass
  49. self.assertFalse(getattr(bar, "__isabstractmethod__", False))
  50. class C(metaclass=abc_ABCMeta):
  51. @abc.abstractstaticmethod
  52. def foo(): return 3
  53. self.assertRaises(TypeError, C)
  54. class D(C):
  55. @staticmethod
  56. def foo(): return 4
  57. self.assertEqual(D.foo(), 4)
  58. self.assertEqual(D().foo(), 4)
  59. class TestABC(unittest.TestCase):
  60. def test_ABC_helper(self):
  61. # create an ABC using the helper class and perform basic checks
  62. class C(abc.ABC):
  63. @classmethod
  64. @abc.abstractmethod
  65. def foo(cls): return cls.__name__
  66. self.assertEqual(type(C), abc.ABCMeta)
  67. self.assertRaises(TypeError, C)
  68. class D(C):
  69. @classmethod
  70. def foo(cls): return super().foo()
  71. self.assertEqual(D.foo(), 'D')
  72. def test_abstractmethod_basics(self):
  73. @abc.abstractmethod
  74. def foo(self): pass
  75. self.assertTrue(foo.__isabstractmethod__)
  76. def bar(self): pass
  77. self.assertFalse(hasattr(bar, "__isabstractmethod__"))
  78. def test_abstractproperty_basics(self):
  79. @property
  80. @abc.abstractmethod
  81. def foo(self): pass
  82. self.assertTrue(foo.__isabstractmethod__)
  83. def bar(self): pass
  84. self.assertFalse(getattr(bar, "__isabstractmethod__", False))
  85. class C(metaclass=abc_ABCMeta):
  86. @property
  87. @abc.abstractmethod
  88. def foo(self): return 3
  89. self.assertRaises(TypeError, C)
  90. class D(C):
  91. @C.foo.getter
  92. def foo(self): return super().foo
  93. self.assertEqual(D().foo, 3)
  94. def test_abstractclassmethod_basics(self):
  95. @classmethod
  96. @abc.abstractmethod
  97. def foo(cls): pass
  98. self.assertTrue(foo.__isabstractmethod__)
  99. @classmethod
  100. def bar(cls): pass
  101. self.assertFalse(getattr(bar, "__isabstractmethod__", False))
  102. class C(metaclass=abc_ABCMeta):
  103. @classmethod
  104. @abc.abstractmethod
  105. def foo(cls): return cls.__name__
  106. self.assertRaises(TypeError, C)
  107. class D(C):
  108. @classmethod
  109. def foo(cls): return super().foo()
  110. self.assertEqual(D.foo(), 'D')
  111. self.assertEqual(D().foo(), 'D')
  112. def test_abstractstaticmethod_basics(self):
  113. @staticmethod
  114. @abc.abstractmethod
  115. def foo(): pass
  116. self.assertTrue(foo.__isabstractmethod__)
  117. @staticmethod
  118. def bar(): pass
  119. self.assertFalse(getattr(bar, "__isabstractmethod__", False))
  120. class C(metaclass=abc_ABCMeta):
  121. @staticmethod
  122. @abc.abstractmethod
  123. def foo(): return 3
  124. self.assertRaises(TypeError, C)
  125. class D(C):
  126. @staticmethod
  127. def foo(): return 4
  128. self.assertEqual(D.foo(), 4)
  129. self.assertEqual(D().foo(), 4)
  130. def test_object_new_with_one_abstractmethod(self):
  131. class C(metaclass=abc_ABCMeta):
  132. @abc.abstractmethod
  133. def method_one(self):
  134. pass
  135. msg = r"class C with abstract method method_one"
  136. self.assertRaisesRegex(TypeError, msg, C)
  137. def test_object_new_with_many_abstractmethods(self):
  138. class C(metaclass=abc_ABCMeta):
  139. @abc.abstractmethod
  140. def method_one(self):
  141. pass
  142. @abc.abstractmethod
  143. def method_two(self):
  144. pass
  145. msg = r"class C with abstract methods method_one, method_two"
  146. self.assertRaisesRegex(TypeError, msg, C)
  147. def test_abstractmethod_integration(self):
  148. for abstractthing in [abc.abstractmethod, abc.abstractproperty,
  149. abc.abstractclassmethod,
  150. abc.abstractstaticmethod]:
  151. class C(metaclass=abc_ABCMeta):
  152. @abstractthing
  153. def foo(self): pass # abstract
  154. def bar(self): pass # concrete
  155. self.assertEqual(C.__abstractmethods__, {"foo"})
  156. self.assertRaises(TypeError, C) # because foo is abstract
  157. self.assertTrue(isabstract(C))
  158. class D(C):
  159. def bar(self): pass # concrete override of concrete
  160. self.assertEqual(D.__abstractmethods__, {"foo"})
  161. self.assertRaises(TypeError, D) # because foo is still abstract
  162. self.assertTrue(isabstract(D))
  163. class E(D):
  164. def foo(self): pass
  165. self.assertEqual(E.__abstractmethods__, set())
  166. E() # now foo is concrete, too
  167. self.assertFalse(isabstract(E))
  168. class F(E):
  169. @abstractthing
  170. def bar(self): pass # abstract override of concrete
  171. self.assertEqual(F.__abstractmethods__, {"bar"})
  172. self.assertRaises(TypeError, F) # because bar is abstract now
  173. self.assertTrue(isabstract(F))
  174. def test_descriptors_with_abstractmethod(self):
  175. class C(metaclass=abc_ABCMeta):
  176. @property
  177. @abc.abstractmethod
  178. def foo(self): return 3
  179. @foo.setter
  180. @abc.abstractmethod
  181. def foo(self, val): pass
  182. self.assertRaises(TypeError, C)
  183. class D(C):
  184. @C.foo.getter
  185. def foo(self): return super().foo
  186. self.assertRaises(TypeError, D)
  187. class E(D):
  188. @D.foo.setter
  189. def foo(self, val): pass
  190. self.assertEqual(E().foo, 3)
  191. # check that the property's __isabstractmethod__ descriptor does the
  192. # right thing when presented with a value that fails truth testing:
  193. class NotBool(object):
  194. def __bool__(self):
  195. raise ValueError()
  196. __len__ = __bool__
  197. with self.assertRaises(ValueError):
  198. class F(C):
  199. def bar(self):
  200. pass
  201. bar.__isabstractmethod__ = NotBool()
  202. foo = property(bar)
  203. def test_customdescriptors_with_abstractmethod(self):
  204. class Descriptor:
  205. def __init__(self, fget, fset=None):
  206. self._fget = fget
  207. self._fset = fset
  208. def getter(self, callable):
  209. return Descriptor(callable, self._fget)
  210. def setter(self, callable):
  211. return Descriptor(self._fget, callable)
  212. @property
  213. def __isabstractmethod__(self):
  214. return (getattr(self._fget, '__isabstractmethod__', False)
  215. or getattr(self._fset, '__isabstractmethod__', False))
  216. class C(metaclass=abc_ABCMeta):
  217. @Descriptor
  218. @abc.abstractmethod
  219. def foo(self): return 3
  220. @foo.setter
  221. @abc.abstractmethod
  222. def foo(self, val): pass
  223. self.assertRaises(TypeError, C)
  224. class D(C):
  225. @C.foo.getter
  226. def foo(self): return super().foo
  227. self.assertRaises(TypeError, D)
  228. class E(D):
  229. @D.foo.setter
  230. def foo(self, val): pass
  231. self.assertFalse(E.foo.__isabstractmethod__)
  232. def test_metaclass_abc(self):
  233. # Metaclasses can be ABCs, too.
  234. class A(metaclass=abc_ABCMeta):
  235. @abc.abstractmethod
  236. def x(self):
  237. pass
  238. self.assertEqual(A.__abstractmethods__, {"x"})
  239. class meta(type, A):
  240. def x(self):
  241. return 1
  242. class C(metaclass=meta):
  243. pass
  244. def test_registration_basics(self):
  245. class A(metaclass=abc_ABCMeta):
  246. pass
  247. class B(object):
  248. pass
  249. b = B()
  250. self.assertFalse(issubclass(B, A))
  251. self.assertFalse(issubclass(B, (A,)))
  252. self.assertNotIsInstance(b, A)
  253. self.assertNotIsInstance(b, (A,))
  254. B1 = A.register(B)
  255. self.assertTrue(issubclass(B, A))
  256. self.assertTrue(issubclass(B, (A,)))
  257. self.assertIsInstance(b, A)
  258. self.assertIsInstance(b, (A,))
  259. self.assertIs(B1, B)
  260. class C(B):
  261. pass
  262. c = C()
  263. self.assertTrue(issubclass(C, A))
  264. self.assertTrue(issubclass(C, (A,)))
  265. self.assertIsInstance(c, A)
  266. self.assertIsInstance(c, (A,))
  267. def test_register_as_class_deco(self):
  268. class A(metaclass=abc_ABCMeta):
  269. pass
  270. @A.register
  271. class B(object):
  272. pass
  273. b = B()
  274. self.assertTrue(issubclass(B, A))
  275. self.assertTrue(issubclass(B, (A,)))
  276. self.assertIsInstance(b, A)
  277. self.assertIsInstance(b, (A,))
  278. @A.register
  279. class C(B):
  280. pass
  281. c = C()
  282. self.assertTrue(issubclass(C, A))
  283. self.assertTrue(issubclass(C, (A,)))
  284. self.assertIsInstance(c, A)
  285. self.assertIsInstance(c, (A,))
  286. self.assertIs(C, A.register(C))
  287. def test_isinstance_invalidation(self):
  288. class A(metaclass=abc_ABCMeta):
  289. pass
  290. class B:
  291. pass
  292. b = B()
  293. self.assertFalse(isinstance(b, A))
  294. self.assertFalse(isinstance(b, (A,)))
  295. token_old = abc_get_cache_token()
  296. A.register(B)
  297. token_new = abc_get_cache_token()
  298. self.assertGreater(token_new, token_old)
  299. self.assertTrue(isinstance(b, A))
  300. self.assertTrue(isinstance(b, (A,)))
  301. def test_registration_builtins(self):
  302. class A(metaclass=abc_ABCMeta):
  303. pass
  304. A.register(int)
  305. self.assertIsInstance(42, A)
  306. self.assertIsInstance(42, (A,))
  307. self.assertTrue(issubclass(int, A))
  308. self.assertTrue(issubclass(int, (A,)))
  309. class B(A):
  310. pass
  311. B.register(str)
  312. class C(str): pass
  313. self.assertIsInstance("", A)
  314. self.assertIsInstance("", (A,))
  315. self.assertTrue(issubclass(str, A))
  316. self.assertTrue(issubclass(str, (A,)))
  317. self.assertTrue(issubclass(C, A))
  318. self.assertTrue(issubclass(C, (A,)))
  319. def test_registration_edge_cases(self):
  320. class A(metaclass=abc_ABCMeta):
  321. pass
  322. A.register(A) # should pass silently
  323. class A1(A):
  324. pass
  325. self.assertRaises(RuntimeError, A1.register, A) # cycles not allowed
  326. class B(object):
  327. pass
  328. A1.register(B) # ok
  329. A1.register(B) # should pass silently
  330. class C(A):
  331. pass
  332. A.register(C) # should pass silently
  333. self.assertRaises(RuntimeError, C.register, A) # cycles not allowed
  334. C.register(B) # ok
  335. def test_register_non_class(self):
  336. class A(metaclass=abc_ABCMeta):
  337. pass
  338. self.assertRaisesRegex(TypeError, "Can only register classes",
  339. A.register, 4)
  340. def test_registration_transitiveness(self):
  341. class A(metaclass=abc_ABCMeta):
  342. pass
  343. self.assertTrue(issubclass(A, A))
  344. self.assertTrue(issubclass(A, (A,)))
  345. class B(metaclass=abc_ABCMeta):
  346. pass
  347. self.assertFalse(issubclass(A, B))
  348. self.assertFalse(issubclass(A, (B,)))
  349. self.assertFalse(issubclass(B, A))
  350. self.assertFalse(issubclass(B, (A,)))
  351. class C(metaclass=abc_ABCMeta):
  352. pass
  353. A.register(B)
  354. class B1(B):
  355. pass
  356. self.assertTrue(issubclass(B1, A))
  357. self.assertTrue(issubclass(B1, (A,)))
  358. class C1(C):
  359. pass
  360. B1.register(C1)
  361. self.assertFalse(issubclass(C, B))
  362. self.assertFalse(issubclass(C, (B,)))
  363. self.assertFalse(issubclass(C, B1))
  364. self.assertFalse(issubclass(C, (B1,)))
  365. self.assertTrue(issubclass(C1, A))
  366. self.assertTrue(issubclass(C1, (A,)))
  367. self.assertTrue(issubclass(C1, B))
  368. self.assertTrue(issubclass(C1, (B,)))
  369. self.assertTrue(issubclass(C1, B1))
  370. self.assertTrue(issubclass(C1, (B1,)))
  371. C1.register(int)
  372. class MyInt(int):
  373. pass
  374. self.assertTrue(issubclass(MyInt, A))
  375. self.assertTrue(issubclass(MyInt, (A,)))
  376. self.assertIsInstance(42, A)
  377. self.assertIsInstance(42, (A,))
  378. def test_issubclass_bad_arguments(self):
  379. class A(metaclass=abc_ABCMeta):
  380. pass
  381. with self.assertRaises(TypeError):
  382. issubclass({}, A) # unhashable
  383. with self.assertRaises(TypeError):
  384. issubclass(42, A) # No __mro__
  385. # Python version supports any iterable as __mro__.
  386. # But it's implementation detail and don't emulate it in C version.
  387. class C:
  388. __mro__ = 42 # __mro__ is not tuple
  389. with self.assertRaises(TypeError):
  390. issubclass(C(), A)
  391. # bpo-34441: Check that issubclass() doesn't crash on bogus
  392. # classes.
  393. bogus_subclasses = [
  394. None,
  395. lambda x: [],
  396. lambda: 42,
  397. lambda: [42],
  398. ]
  399. for i, func in enumerate(bogus_subclasses):
  400. class S(metaclass=abc_ABCMeta):
  401. __subclasses__ = func
  402. with self.subTest(i=i):
  403. with self.assertRaises(TypeError):
  404. issubclass(int, S)
  405. # Also check that issubclass() propagates exceptions raised by
  406. # __subclasses__.
  407. exc_msg = "exception from __subclasses__"
  408. def raise_exc():
  409. raise Exception(exc_msg)
  410. class S(metaclass=abc_ABCMeta):
  411. __subclasses__ = raise_exc
  412. with self.assertRaisesRegex(Exception, exc_msg):
  413. issubclass(int, S)
  414. def test_subclasshook(self):
  415. class A(metaclass=abc.ABCMeta):
  416. @classmethod
  417. def __subclasshook__(cls, C):
  418. if cls is A:
  419. return 'foo' in C.__dict__
  420. return NotImplemented
  421. self.assertFalse(issubclass(A, A))
  422. self.assertFalse(issubclass(A, (A,)))
  423. class B:
  424. foo = 42
  425. self.assertTrue(issubclass(B, A))
  426. self.assertTrue(issubclass(B, (A,)))
  427. class C:
  428. spam = 42
  429. self.assertFalse(issubclass(C, A))
  430. self.assertFalse(issubclass(C, (A,)))
  431. def test_all_new_methods_are_called(self):
  432. class A(metaclass=abc_ABCMeta):
  433. pass
  434. class B(object):
  435. counter = 0
  436. def __new__(cls):
  437. B.counter += 1
  438. return super().__new__(cls)
  439. class C(A, B):
  440. pass
  441. self.assertEqual(B.counter, 0)
  442. C()
  443. self.assertEqual(B.counter, 1)
  444. def test_ABC_has___slots__(self):
  445. self.assertTrue(hasattr(abc.ABC, '__slots__'))
  446. def test_tricky_new_works(self):
  447. def with_metaclass(meta, *bases):
  448. class metaclass(type):
  449. def __new__(cls, name, this_bases, d):
  450. return meta(name, bases, d)
  451. return type.__new__(metaclass, 'temporary_class', (), {})
  452. class A: ...
  453. class B: ...
  454. class C(with_metaclass(abc_ABCMeta, A, B)):
  455. pass
  456. self.assertEqual(C.__class__, abc_ABCMeta)
  457. def test_update_del(self):
  458. class A(metaclass=abc_ABCMeta):
  459. @abc.abstractmethod
  460. def foo(self):
  461. pass
  462. del A.foo
  463. self.assertEqual(A.__abstractmethods__, {'foo'})
  464. self.assertFalse(hasattr(A, 'foo'))
  465. abc.update_abstractmethods(A)
  466. self.assertEqual(A.__abstractmethods__, set())
  467. A()
  468. def test_update_new_abstractmethods(self):
  469. class A(metaclass=abc_ABCMeta):
  470. @abc.abstractmethod
  471. def bar(self):
  472. pass
  473. @abc.abstractmethod
  474. def updated_foo(self):
  475. pass
  476. A.foo = updated_foo
  477. abc.update_abstractmethods(A)
  478. self.assertEqual(A.__abstractmethods__, {'foo', 'bar'})
  479. msg = "class A with abstract methods bar, foo"
  480. self.assertRaisesRegex(TypeError, msg, A)
  481. def test_update_implementation(self):
  482. class A(metaclass=abc_ABCMeta):
  483. @abc.abstractmethod
  484. def foo(self):
  485. pass
  486. class B(A):
  487. pass
  488. msg = "class B with abstract method foo"
  489. self.assertRaisesRegex(TypeError, msg, B)
  490. self.assertEqual(B.__abstractmethods__, {'foo'})
  491. B.foo = lambda self: None
  492. abc.update_abstractmethods(B)
  493. B()
  494. self.assertEqual(B.__abstractmethods__, set())
  495. def test_update_as_decorator(self):
  496. class A(metaclass=abc_ABCMeta):
  497. @abc.abstractmethod
  498. def foo(self):
  499. pass
  500. def class_decorator(cls):
  501. cls.foo = lambda self: None
  502. return cls
  503. @abc.update_abstractmethods
  504. @class_decorator
  505. class B(A):
  506. pass
  507. B()
  508. self.assertEqual(B.__abstractmethods__, set())
  509. def test_update_non_abc(self):
  510. class A:
  511. pass
  512. @abc.abstractmethod
  513. def updated_foo(self):
  514. pass
  515. A.foo = updated_foo
  516. abc.update_abstractmethods(A)
  517. A()
  518. self.assertFalse(hasattr(A, '__abstractmethods__'))
  519. def test_update_del_implementation(self):
  520. class A(metaclass=abc_ABCMeta):
  521. @abc.abstractmethod
  522. def foo(self):
  523. pass
  524. class B(A):
  525. def foo(self):
  526. pass
  527. B()
  528. del B.foo
  529. abc.update_abstractmethods(B)
  530. msg = "class B with abstract method foo"
  531. self.assertRaisesRegex(TypeError, msg, B)
  532. def test_update_layered_implementation(self):
  533. class A(metaclass=abc_ABCMeta):
  534. @abc.abstractmethod
  535. def foo(self):
  536. pass
  537. class B(A):
  538. pass
  539. class C(B):
  540. def foo(self):
  541. pass
  542. C()
  543. del C.foo
  544. abc.update_abstractmethods(C)
  545. msg = "class C with abstract method foo"
  546. self.assertRaisesRegex(TypeError, msg, C)
  547. def test_update_multi_inheritance(self):
  548. class A(metaclass=abc_ABCMeta):
  549. @abc.abstractmethod
  550. def foo(self):
  551. pass
  552. class B(metaclass=abc_ABCMeta):
  553. def foo(self):
  554. pass
  555. class C(B, A):
  556. @abc.abstractmethod
  557. def foo(self):
  558. pass
  559. self.assertEqual(C.__abstractmethods__, {'foo'})
  560. del C.foo
  561. abc.update_abstractmethods(C)
  562. self.assertEqual(C.__abstractmethods__, set())
  563. C()
  564. class TestABCWithInitSubclass(unittest.TestCase):
  565. def test_works_with_init_subclass(self):
  566. class abc_ABC(metaclass=abc_ABCMeta):
  567. __slots__ = ()
  568. saved_kwargs = {}
  569. class ReceivesClassKwargs:
  570. def __init_subclass__(cls, **kwargs):
  571. super().__init_subclass__()
  572. saved_kwargs.update(kwargs)
  573. class Receiver(ReceivesClassKwargs, abc_ABC, x=1, y=2, z=3):
  574. pass
  575. self.assertEqual(saved_kwargs, dict(x=1, y=2, z=3))
  576. def test_positional_only_and_kwonlyargs_with_init_subclass(self):
  577. saved_kwargs = {}
  578. class A:
  579. def __init_subclass__(cls, **kwargs):
  580. super().__init_subclass__()
  581. saved_kwargs.update(kwargs)
  582. class B(A, metaclass=abc_ABCMeta, name="test"):
  583. pass
  584. self.assertEqual(saved_kwargs, dict(name="test"))
  585. return TestLegacyAPI, TestABC, TestABCWithInitSubclass
  586. TestLegacyAPI_Py, TestABC_Py, TestABCWithInitSubclass_Py = test_factory(abc.ABCMeta,
  587. abc.get_cache_token)
  588. TestLegacyAPI_C, TestABC_C, TestABCWithInitSubclass_C = test_factory(_py_abc.ABCMeta,
  589. _py_abc.get_cache_token)
  590. if __name__ == "__main__":
  591. unittest.main()