|
97 | 97 | import astroid.test_utils as test_utils |
98 | 98 |
|
99 | 99 |
|
| 100 | +def assertEqualMro(klass, expected_mro): |
| 101 | + """Check mro names.""" |
| 102 | + assert [member.name for member in klass.mro()] == expected_mro |
| 103 | + |
| 104 | + |
100 | 105 | class HashlibTest(unittest.TestCase): |
101 | 106 | def _assert_hashlib_class(self, class_obj): |
102 | 107 | self.assertIn("update", class_obj) |
@@ -1210,35 +1215,85 @@ def test_typing_alias_type(self): |
1210 | 1215 | Test that the type aliased thanks to typing._alias function are |
1211 | 1216 | correctly inferred. |
1212 | 1217 | """ |
| 1218 | + |
| 1219 | + def check_metaclass(node: nodes.ClassDef): |
| 1220 | + meta = node.metaclass() |
| 1221 | + assert ( |
| 1222 | + isinstance(meta, nodes.ClassDef) |
| 1223 | + and meta.name == "ABCMeta_typing" |
| 1224 | + and "ABCMeta" == meta.basenames[0] |
| 1225 | + and meta.locals.get("__getitem__") is not None |
| 1226 | + ) |
| 1227 | + abc_meta = next(meta.bases[0].infer()) |
| 1228 | + assert ( |
| 1229 | + isinstance(abc_meta, nodes.ClassDef) |
| 1230 | + and abc_meta.name == "ABCMeta" |
| 1231 | + and abc_meta.locals.get("__getitem__") is None |
| 1232 | + ) |
| 1233 | + |
1213 | 1234 | node = builder.extract_node( |
1214 | 1235 | """ |
1215 | 1236 | from typing import TypeVar, MutableSet |
1216 | 1237 |
|
1217 | 1238 | T = TypeVar("T") |
1218 | 1239 | MutableSet[T] |
1219 | 1240 |
|
1220 | | - class V(MutableSet[T]): |
| 1241 | + class Derived(MutableSet[T]): |
1221 | 1242 | pass |
1222 | 1243 | """ |
1223 | 1244 | ) |
1224 | 1245 | inferred = next(node.infer()) |
1225 | | - mro_entries = list(inferred.mro()) |
1226 | | - self.assertIsInstance(mro_entries[0], astroid.ClassDef) |
1227 | | - self.assertEqual(mro_entries[0].name, "V") |
1228 | | - self.assertIsInstance(mro_entries[1], astroid.ClassDef) |
1229 | | - self.assertEqual(mro_entries[1].name, "MutableSet") |
1230 | | - self.assertIsInstance(mro_entries[2], astroid.ClassDef) |
1231 | | - self.assertEqual(mro_entries[2].name, "Set") |
1232 | | - self.assertIsInstance(mro_entries[3], astroid.ClassDef) |
1233 | | - self.assertEqual(mro_entries[3].name, "Collection") |
1234 | | - self.assertIsInstance(mro_entries[4], astroid.ClassDef) |
1235 | | - self.assertEqual(mro_entries[4].name, "Sized") |
1236 | | - self.assertIsInstance(mro_entries[5], astroid.ClassDef) |
1237 | | - self.assertEqual(mro_entries[5].name, "Iterable") |
1238 | | - self.assertIsInstance(mro_entries[6], astroid.ClassDef) |
1239 | | - self.assertEqual(mro_entries[6].name, "Container") |
1240 | | - self.assertIsInstance(mro_entries[7], astroid.ClassDef) |
1241 | | - self.assertEqual(mro_entries[7].name, "object") |
| 1246 | + check_metaclass(inferred) |
| 1247 | + assertEqualMro( |
| 1248 | + inferred, |
| 1249 | + [ |
| 1250 | + "Derived", |
| 1251 | + "MutableSet", |
| 1252 | + "Set", |
| 1253 | + "Collection", |
| 1254 | + "Sized", |
| 1255 | + "Iterable", |
| 1256 | + "Container", |
| 1257 | + "object", |
| 1258 | + ], |
| 1259 | + ) |
| 1260 | + |
| 1261 | + node = builder.extract_node( |
| 1262 | + """ |
| 1263 | + import typing |
| 1264 | + class Derived(typing.OrderedDict[int, str]): |
| 1265 | + pass |
| 1266 | + """ |
| 1267 | + ) |
| 1268 | + inferred = next(node.infer()) |
| 1269 | + check_metaclass(inferred) |
| 1270 | + assertEqualMro( |
| 1271 | + inferred, |
| 1272 | + [ |
| 1273 | + "Derived", |
| 1274 | + "OrderedDict", |
| 1275 | + "dict", |
| 1276 | + "object", |
| 1277 | + ], |
| 1278 | + ) |
| 1279 | + |
| 1280 | + node = builder.extract_node( |
| 1281 | + """ |
| 1282 | + import typing |
| 1283 | + class Derived(typing.Pattern[str]): |
| 1284 | + pass |
| 1285 | + """ |
| 1286 | + ) |
| 1287 | + inferred = next(node.infer()) |
| 1288 | + check_metaclass(inferred) |
| 1289 | + assertEqualMro( |
| 1290 | + inferred, |
| 1291 | + [ |
| 1292 | + "Derived", |
| 1293 | + "Pattern", |
| 1294 | + "object", |
| 1295 | + ], |
| 1296 | + ) |
1242 | 1297 |
|
1243 | 1298 |
|
1244 | 1299 | class ReBrainTest(unittest.TestCase): |
|
0 commit comments