|
1 | 1 | import unittest |
2 | 2 | import gc |
| 3 | +from sys import getrefcount |
3 | 4 | from test.support import import_helper |
4 | 5 |
|
5 | 6 | _testcapi = import_helper.import_module('_testcapi') |
6 | 7 | _testlimitedcapi = import_helper.import_module('_testlimitedcapi') |
| 8 | +_testinternalcapi = import_helper.import_module('_testinternalcapi') |
7 | 9 |
|
8 | 10 | NULL = None |
9 | 11 | PY_SSIZE_T_MIN = _testcapi.PY_SSIZE_T_MIN |
@@ -118,6 +120,61 @@ def test_tuple_pack(self): |
118 | 120 | # CRASHES pack(1, NULL) |
119 | 121 | # CRASHES pack(2, [1]) |
120 | 122 |
|
| 123 | + def test_tuple_from_pair(self): |
| 124 | + # Test _PyTuple_FromPair() |
| 125 | + tuple_from_pair = _testinternalcapi._tuple_from_pair |
| 126 | + |
| 127 | + self.assertEqual(tuple_from_pair(1, 2), (1, 2)) |
| 128 | + self.assertEqual(tuple_from_pair(None, None), (None, None)) |
| 129 | + self.assertEqual(tuple_from_pair(True, False), (True, False)) |
| 130 | + |
| 131 | + # user class supports gc |
| 132 | + class Temp: |
| 133 | + pass |
| 134 | + temp = Temp() |
| 135 | + temp_rc = getrefcount(temp) |
| 136 | + self.assertEqual(tuple_from_pair(temp, temp), (temp, temp)) |
| 137 | + self.assertEqual(getrefcount(temp), temp_rc) |
| 138 | + |
| 139 | + self.assertRaises(TypeError, tuple_from_pair, 1, 2, 3) |
| 140 | + self.assertRaises(TypeError, tuple_from_pair, 1) |
| 141 | + self.assertRaises(TypeError, tuple_from_pair) |
| 142 | + |
| 143 | + self.assertFalse(gc.is_tracked(tuple_from_pair(1, 2))) |
| 144 | + self.assertFalse(gc.is_tracked(tuple_from_pair(None, None))) |
| 145 | + self.assertFalse(gc.is_tracked(tuple_from_pair(True, False))) |
| 146 | + self.assertTrue(gc.is_tracked(tuple_from_pair(temp, (1, 2)))) |
| 147 | + self.assertTrue(gc.is_tracked(tuple_from_pair(temp, 1))) |
| 148 | + self.assertTrue(gc.is_tracked(tuple_from_pair([], {}))) |
| 149 | + |
| 150 | + def test_tuple_from_pair_steal(self): |
| 151 | + # Test _PyTuple_FromPairSteal() |
| 152 | + tuple_from_pair = _testinternalcapi._tuple_from_pair_steal |
| 153 | + |
| 154 | + self.assertEqual(tuple_from_pair(1, 2), (1, 2)) |
| 155 | + self.assertEqual(tuple_from_pair(None, None), (None, None)) |
| 156 | + self.assertEqual(tuple_from_pair(True, False), (True, False)) |
| 157 | + |
| 158 | + # user class supports gc |
| 159 | + class Temp: |
| 160 | + pass |
| 161 | + temp = Temp() |
| 162 | + temp_rc = getrefcount(temp) |
| 163 | + self.assertEqual(tuple_from_pair(temp, temp), (temp, temp)) |
| 164 | + self.assertEqual(getrefcount(temp), temp_rc) |
| 165 | + |
| 166 | + self.assertRaises(TypeError, tuple_from_pair, 1, 2, 3) |
| 167 | + self.assertRaises(TypeError, tuple_from_pair, 1) |
| 168 | + self.assertRaises(TypeError, tuple_from_pair) |
| 169 | + |
| 170 | + self.assertFalse(gc.is_tracked(tuple_from_pair(1, 2))) |
| 171 | + self.assertFalse(gc.is_tracked(tuple_from_pair(None, None))) |
| 172 | + self.assertFalse(gc.is_tracked(tuple_from_pair(True, False))) |
| 173 | + self.assertTrue(gc.is_tracked(tuple_from_pair(temp, (1, 2)))) |
| 174 | + self.assertTrue(gc.is_tracked(tuple_from_pair(temp, 1))) |
| 175 | + self.assertTrue(gc.is_tracked(tuple_from_pair([], {}))) |
| 176 | + |
| 177 | + |
121 | 178 | def test_tuple_size(self): |
122 | 179 | # Test PyTuple_Size() |
123 | 180 | size = _testlimitedcapi.tuple_size |
|
0 commit comments