|
3 | 3 | import sys
|
4 | 4 | import types
|
5 | 5 | import unittest
|
| 6 | +import warnings |
6 | 7 | import weakref
|
7 | 8 |
|
8 | 9 | from copy import deepcopy
|
@@ -1550,6 +1551,84 @@ class D(C):
|
1550 | 1551 | self.assertEqual(b.foo, 3)
|
1551 | 1552 | self.assertEqual(b.__class__, D)
|
1552 | 1553 |
|
| 1554 | + def test_bad_new(self): |
| 1555 | + self.assertRaises(TypeError, object.__new__) |
| 1556 | + self.assertRaises(TypeError, object.__new__, '') |
| 1557 | + self.assertRaises(TypeError, list.__new__, object) |
| 1558 | + self.assertRaises(TypeError, object.__new__, list) |
| 1559 | + class C(object): |
| 1560 | + __new__ = list.__new__ |
| 1561 | + self.assertRaises(TypeError, C) |
| 1562 | + class C(list): |
| 1563 | + __new__ = object.__new__ |
| 1564 | + self.assertRaises(TypeError, C) |
| 1565 | + |
| 1566 | + def test_object_new(self): |
| 1567 | + class A(object): |
| 1568 | + pass |
| 1569 | + object.__new__(A) |
| 1570 | + self.assertRaises(TypeError, object.__new__, A, 5) |
| 1571 | + object.__init__(A()) |
| 1572 | + self.assertRaises(TypeError, object.__init__, A(), 5) |
| 1573 | + |
| 1574 | + class A(object): |
| 1575 | + def __init__(self, foo): |
| 1576 | + self.foo = foo |
| 1577 | + object.__new__(A) |
| 1578 | + object.__new__(A, 5) |
| 1579 | + object.__init__(A(3)) |
| 1580 | + self.assertRaises(TypeError, object.__init__, A(3), 5) |
| 1581 | + |
| 1582 | + class A(object): |
| 1583 | + def __new__(cls, foo): |
| 1584 | + return object.__new__(cls) |
| 1585 | + object.__new__(A) |
| 1586 | + self.assertRaises(TypeError, object.__new__, A, 5) |
| 1587 | + object.__init__(A(3)) |
| 1588 | + object.__init__(A(3), 5) |
| 1589 | + |
| 1590 | + class A(object): |
| 1591 | + def __new__(cls, foo): |
| 1592 | + return object.__new__(cls) |
| 1593 | + def __init__(self, foo): |
| 1594 | + self.foo = foo |
| 1595 | + object.__new__(A) |
| 1596 | + with warnings.catch_warnings(record=True) as w: |
| 1597 | + warnings.simplefilter('always', DeprecationWarning) |
| 1598 | + a = object.__new__(A, 5) |
| 1599 | + self.assertEqual(type(a), A) |
| 1600 | + self.assertEqual(len(w), 1) |
| 1601 | + object.__init__(A(3)) |
| 1602 | + a = A(3) |
| 1603 | + with warnings.catch_warnings(record=True) as w: |
| 1604 | + warnings.simplefilter('always', DeprecationWarning) |
| 1605 | + object.__init__(a, 5) |
| 1606 | + self.assertEqual(a.foo, 3) |
| 1607 | + self.assertEqual(len(w), 1) |
| 1608 | + |
| 1609 | + def test_restored_object_new(self): |
| 1610 | + class A(object): |
| 1611 | + def __new__(cls, *args, **kwargs): |
| 1612 | + raise AssertionError |
| 1613 | + self.assertRaises(AssertionError, A) |
| 1614 | + class B(A): |
| 1615 | + __new__ = object.__new__ |
| 1616 | + def __init__(self, foo): |
| 1617 | + self.foo = foo |
| 1618 | + with warnings.catch_warnings(): |
| 1619 | + warnings.simplefilter('error', DeprecationWarning) |
| 1620 | + b = B(3) |
| 1621 | + self.assertEqual(b.foo, 3) |
| 1622 | + self.assertEqual(b.__class__, B) |
| 1623 | + del B.__new__ |
| 1624 | + self.assertRaises(AssertionError, B) |
| 1625 | + del A.__new__ |
| 1626 | + with warnings.catch_warnings(): |
| 1627 | + warnings.simplefilter('error', DeprecationWarning) |
| 1628 | + b = B(3) |
| 1629 | + self.assertEqual(b.foo, 3) |
| 1630 | + self.assertEqual(b.__class__, B) |
| 1631 | + |
1553 | 1632 | def test_altmro(self):
|
1554 | 1633 | # Testing mro() and overriding it...
|
1555 | 1634 | class A(object):
|
@@ -3756,6 +3835,24 @@ def __init__(self, arg):
|
3756 | 3835 | self.assertEqual(isinstance(d, D), True)
|
3757 | 3836 | self.assertEqual(d.foo, 1)
|
3758 | 3837 |
|
| 3838 | + class C(object): |
| 3839 | + @staticmethod |
| 3840 | + def __new__(*args): |
| 3841 | + return args |
| 3842 | + self.assertEqual(C(1, 2), (C, 1, 2)) |
| 3843 | + class D(C): |
| 3844 | + pass |
| 3845 | + self.assertEqual(D(1, 2), (D, 1, 2)) |
| 3846 | + |
| 3847 | + class C(object): |
| 3848 | + @classmethod |
| 3849 | + def __new__(*args): |
| 3850 | + return args |
| 3851 | + self.assertEqual(C(1, 2), (C, C, 1, 2)) |
| 3852 | + class D(C): |
| 3853 | + pass |
| 3854 | + self.assertEqual(D(1, 2), (D, D, 1, 2)) |
| 3855 | + |
3759 | 3856 | def test_imul_bug(self):
|
3760 | 3857 | # Testing for __imul__ problems...
|
3761 | 3858 | # SF bug 544647
|
|
0 commit comments