| 1106 | @unittest.expectedFailure # TODO: RUSTPYTHON |
| 1107 | @support.thread_unsafe |
| 1108 | def test_slots(self): |
| 1109 | # Testing __slots__... |
| 1110 | class C0(object): |
| 1111 | __slots__ = [] |
| 1112 | x = C0() |
| 1113 | self.assertNotHasAttr(x, "__dict__") |
| 1114 | self.assertNotHasAttr(x, "foo") |
| 1115 | |
| 1116 | class C1(object): |
| 1117 | __slots__ = ['a'] |
| 1118 | x = C1() |
| 1119 | self.assertNotHasAttr(x, "__dict__") |
| 1120 | self.assertNotHasAttr(x, "a") |
| 1121 | x.a = 1 |
| 1122 | self.assertEqual(x.a, 1) |
| 1123 | x.a = None |
| 1124 | self.assertEqual(x.a, None) |
| 1125 | del x.a |
| 1126 | self.assertNotHasAttr(x, "a") |
| 1127 | |
| 1128 | class C3(object): |
| 1129 | __slots__ = ['a', 'b', 'c'] |
| 1130 | x = C3() |
| 1131 | self.assertNotHasAttr(x, "__dict__") |
| 1132 | self.assertNotHasAttr(x, 'a') |
| 1133 | self.assertNotHasAttr(x, 'b') |
| 1134 | self.assertNotHasAttr(x, 'c') |
| 1135 | x.a = 1 |
| 1136 | x.b = 2 |
| 1137 | x.c = 3 |
| 1138 | self.assertEqual(x.a, 1) |
| 1139 | self.assertEqual(x.b, 2) |
| 1140 | self.assertEqual(x.c, 3) |
| 1141 | |
| 1142 | class C4(object): |
| 1143 | """Validate name mangling""" |
| 1144 | __slots__ = ['__a'] |
| 1145 | def __init__(self, value): |
| 1146 | self.__a = value |
| 1147 | def get(self): |
| 1148 | return self.__a |
| 1149 | x = C4(5) |
| 1150 | self.assertNotHasAttr(x, '__dict__') |
| 1151 | self.assertNotHasAttr(x, '__a') |
| 1152 | self.assertEqual(x.get(), 5) |
| 1153 | try: |
| 1154 | x.__a = 6 |
| 1155 | except AttributeError: |
| 1156 | pass |
| 1157 | else: |
| 1158 | self.fail("Double underscored names not mangled") |
| 1159 | |
| 1160 | # Make sure slot names are proper identifiers |
| 1161 | try: |
| 1162 | class C(object): |
| 1163 | __slots__ = [None] |
| 1164 | except TypeError: |
| 1165 | pass |