|
7 | 7 | import sys |
8 | 8 | import types |
9 | 9 | import unittest |
| 10 | +import warnings |
10 | 11 | import weakref |
11 | 12 |
|
12 | 13 | from copy import deepcopy |
@@ -1661,6 +1662,75 @@ class D(C): |
1661 | 1662 | self.assertEqual(b.foo, 3) |
1662 | 1663 | self.assertEqual(b.__class__, D) |
1663 | 1664 |
|
| 1665 | + def test_bad_new(self): |
| 1666 | + self.assertRaises(TypeError, object.__new__) |
| 1667 | + self.assertRaises(TypeError, object.__new__, '') |
| 1668 | + self.assertRaises(TypeError, list.__new__, object) |
| 1669 | + self.assertRaises(TypeError, object.__new__, list) |
| 1670 | + class C(object): |
| 1671 | + __new__ = list.__new__ |
| 1672 | + self.assertRaises(TypeError, C) |
| 1673 | + class C(list): |
| 1674 | + __new__ = object.__new__ |
| 1675 | + self.assertRaises(TypeError, C) |
| 1676 | + |
| 1677 | + def test_object_new(self): |
| 1678 | + class A(object): |
| 1679 | + pass |
| 1680 | + object.__new__(A) |
| 1681 | + self.assertRaises(TypeError, object.__new__, A, 5) |
| 1682 | + object.__init__(A()) |
| 1683 | + self.assertRaises(TypeError, object.__init__, A(), 5) |
| 1684 | + |
| 1685 | + class A(object): |
| 1686 | + def __init__(self, foo): |
| 1687 | + self.foo = foo |
| 1688 | + object.__new__(A) |
| 1689 | + object.__new__(A, 5) |
| 1690 | + object.__init__(A(3)) |
| 1691 | + self.assertRaises(TypeError, object.__init__, A(3), 5) |
| 1692 | + |
| 1693 | + class A(object): |
| 1694 | + def __new__(cls, foo): |
| 1695 | + return object.__new__(cls) |
| 1696 | + object.__new__(A) |
| 1697 | + self.assertRaises(TypeError, object.__new__, A, 5) |
| 1698 | + object.__init__(A(3)) |
| 1699 | + object.__init__(A(3), 5) |
| 1700 | + |
| 1701 | + class A(object): |
| 1702 | + def __new__(cls, foo): |
| 1703 | + return object.__new__(cls) |
| 1704 | + def __init__(self, foo): |
| 1705 | + self.foo = foo |
| 1706 | + object.__new__(A) |
| 1707 | + self.assertRaises(TypeError, object.__new__, A, 5) |
| 1708 | + object.__init__(A(3)) |
| 1709 | + self.assertRaises(TypeError, object.__init__, A(3), 5) |
| 1710 | + |
| 1711 | + def test_restored_object_new(self): |
| 1712 | + class A(object): |
| 1713 | + def __new__(cls, *args, **kwargs): |
| 1714 | + raise AssertionError |
| 1715 | + self.assertRaises(AssertionError, A) |
| 1716 | + class B(A): |
| 1717 | + __new__ = object.__new__ |
| 1718 | + def __init__(self, foo): |
| 1719 | + self.foo = foo |
| 1720 | + with warnings.catch_warnings(): |
| 1721 | + warnings.simplefilter('error', DeprecationWarning) |
| 1722 | + b = B(3) |
| 1723 | + self.assertEqual(b.foo, 3) |
| 1724 | + self.assertEqual(b.__class__, B) |
| 1725 | + del B.__new__ |
| 1726 | + self.assertRaises(AssertionError, B) |
| 1727 | + del A.__new__ |
| 1728 | + with warnings.catch_warnings(): |
| 1729 | + warnings.simplefilter('error', DeprecationWarning) |
| 1730 | + b = B(3) |
| 1731 | + self.assertEqual(b.foo, 3) |
| 1732 | + self.assertEqual(b.__class__, B) |
| 1733 | + |
1664 | 1734 | def test_altmro(self): |
1665 | 1735 | # Testing mro() and overriding it... |
1666 | 1736 | class A(object): |
@@ -3522,6 +3592,24 @@ def __init__(self, arg): |
3522 | 3592 | self.assertIsInstance(d, D) |
3523 | 3593 | self.assertEqual(d.foo, 1) |
3524 | 3594 |
|
| 3595 | + class C(object): |
| 3596 | + @staticmethod |
| 3597 | + def __new__(*args): |
| 3598 | + return args |
| 3599 | + self.assertEqual(C(1, 2), (C, 1, 2)) |
| 3600 | + class D(C): |
| 3601 | + pass |
| 3602 | + self.assertEqual(D(1, 2), (D, 1, 2)) |
| 3603 | + |
| 3604 | + class C(object): |
| 3605 | + @classmethod |
| 3606 | + def __new__(*args): |
| 3607 | + return args |
| 3608 | + self.assertEqual(C(1, 2), (C, C, 1, 2)) |
| 3609 | + class D(C): |
| 3610 | + pass |
| 3611 | + self.assertEqual(D(1, 2), (D, D, 1, 2)) |
| 3612 | + |
3525 | 3613 | def test_imul_bug(self): |
3526 | 3614 | # Testing for __imul__ problems... |
3527 | 3615 | # SF bug 544647 |
|
0 commit comments