|
1 | 1 | import unittest
|
| 2 | +import sys |
2 | 3 | import warnings
|
3 | 4 |
|
4 | 5 | from test.support import import_helper
|
@@ -129,8 +130,32 @@ def test_power(self):
|
129 | 130 | # Test PyNumber_Power()
|
130 | 131 | power = _testcapi.number_power
|
131 | 132 |
|
132 |
| - self.assertEqual(power(4, 3, None), pow(4, 3)) |
| 133 | + class IntSubclass(int): |
| 134 | + pass |
| 135 | + |
| 136 | + class IntSubclass2(int): |
| 137 | + def __new__(cls, value): |
| 138 | + obj = super().__new__(cls) |
| 139 | + obj.value = value |
| 140 | + return obj |
| 141 | + |
| 142 | + def __rpow__(self, other, mod=None): |
| 143 | + return self.value |
| 144 | + |
| 145 | + self.assertEqual(power(4, 3, NULL), pow(4, 3)) |
| 146 | + self.assertEqual(power(0.5, 2, NULL), pow(0.5, 2)) |
| 147 | + self.assertEqual(power(2, -1.0, NULL), pow(2, -1.0)) |
133 | 148 | self.assertEqual(power(4, 11, 5), pow(4, 11, 5))
|
| 149 | + self.assertEqual(power(4, IntSubclass(11), NULL), pow(4, 11)) |
| 150 | + self.assertEqual(power(4, IntSubclass2(11), NULL), 11) |
| 151 | + self.assertEqual(power(4, IntSubclass2(NotImplemented), NULL), 1) |
| 152 | + |
| 153 | + self.assertRaises(TypeError, power, "spam", 42, NULL) |
| 154 | + self.assertRaises(TypeError, power, object(), 42, NULL) |
| 155 | + self.assertRaises(TypeError, power, 42, "spam", NULL) |
| 156 | + self.assertRaises(TypeError, power, 42, object(), NULL) |
| 157 | + self.assertRaises(TypeError, power, 1, 2, "spam") |
| 158 | + self.assertRaises(TypeError, power, 1, 2, object()) |
134 | 159 |
|
135 | 160 | # CRASHES power(NULL, 42)
|
136 | 161 | # CRASHES power(42, NULL)
|
@@ -190,6 +215,20 @@ def test_rshift(self):
|
190 | 215 |
|
191 | 216 | self.assertEqual(rshift(5, 3), 5 >> 3)
|
192 | 217 |
|
| 218 | + # RHS implements __rrshift__ but returns NotImplemented |
| 219 | + with self.assertRaises(TypeError) as context: |
| 220 | + print >> 42 |
| 221 | + self.assertIn('Did you mean "print(<message>, ' |
| 222 | + 'file=<output_stream>)"?', str(context.exception)) |
| 223 | + |
| 224 | + # Test stream redirection hint is specific to print |
| 225 | + with self.assertRaises(TypeError) as context: |
| 226 | + max >> sys.stderr |
| 227 | + self.assertNotIn('Did you mean ', str(context.exception)) |
| 228 | + |
| 229 | + with self.assertRaises(TypeError) as context: |
| 230 | + 1 >> "spam" |
| 231 | + |
193 | 232 | # CRASHES rshift(NULL, 1)
|
194 | 233 | # CRASHES rshift(1, NULL)
|
195 | 234 |
|
|
0 commit comments