| 1466 | |
| 1467 | @testing.combinations(*all_hascachekey_subclasses()) |
| 1468 | def test_traverse_internals(self, cls: type): |
| 1469 | super_traverse = {} |
| 1470 | # ignore_super = self.ignore_super.get(cls.__name__, set()) |
| 1471 | for s in cls.mro()[1:]: |
| 1472 | for attr in s.__dict__: |
| 1473 | if not attr.endswith("_traverse_internals"): |
| 1474 | continue |
| 1475 | for k, v in s.__dict__[attr]: |
| 1476 | if k not in super_traverse: |
| 1477 | super_traverse[k] = v |
| 1478 | traverse_dict = dict(cls.__dict__["_traverse_internals"]) |
| 1479 | eq_(len(cls.__dict__["_traverse_internals"]), len(traverse_dict)) |
| 1480 | if cls.__name__ in self.custom_traverse: |
| 1481 | eq_(traverse_dict.keys(), self.custom_traverse[cls.__name__]) |
| 1482 | else: |
| 1483 | ignore = self.ignore_keys.get(cls.__name__, set()) |
| 1484 | |
| 1485 | left_keys = traverse_dict.keys() | ignore |
| 1486 | is_true( |
| 1487 | left_keys >= super_traverse.keys(), |
| 1488 | f"{left_keys} >= {super_traverse.keys()} - missing: " |
| 1489 | f"{super_traverse.keys() - left_keys} - ignored {ignore}", |
| 1490 | ) |
| 1491 | |
| 1492 | subset = { |
| 1493 | k: v for k, v in traverse_dict.items() if k in super_traverse |
| 1494 | } |
| 1495 | eq_( |
| 1496 | subset, |
| 1497 | {k: v for k, v in super_traverse.items() if k not in ignore}, |
| 1498 | ) |
| 1499 | |
| 1500 | # name -> (traverse names, init args) |
| 1501 | custom_init = { |