| 1572 | |
| 1573 | @testing.combinations(*all_hascachekey_subclasses()) |
| 1574 | def test_traverse_internals(self, cls: type): |
| 1575 | super_traverse = {} |
| 1576 | # ignore_super = self.ignore_super.get(cls.__name__, set()) |
| 1577 | for s in cls.mro()[1:]: |
| 1578 | for attr in s.__dict__: |
| 1579 | if not attr.endswith("_traverse_internals"): |
| 1580 | continue |
| 1581 | for k, v in s.__dict__[attr]: |
| 1582 | if k not in super_traverse: |
| 1583 | super_traverse[k] = v |
| 1584 | traverse_dict = dict(cls.__dict__["_traverse_internals"]) |
| 1585 | eq_(len(cls.__dict__["_traverse_internals"]), len(traverse_dict)) |
| 1586 | if cls.__name__ in self.custom_traverse: |
| 1587 | eq_(traverse_dict.keys(), self.custom_traverse[cls.__name__]) |
| 1588 | else: |
| 1589 | ignore = self.ignore_keys.get(cls.__name__, set()) |
| 1590 | |
| 1591 | left_keys = traverse_dict.keys() | ignore |
| 1592 | is_true( |
| 1593 | left_keys >= super_traverse.keys(), |
| 1594 | f"{left_keys} >= {super_traverse.keys()} - missing: " |
| 1595 | f"{super_traverse.keys() - left_keys} - ignored {ignore}", |
| 1596 | ) |
| 1597 | |
| 1598 | subset = { |
| 1599 | k: v for k, v in traverse_dict.items() if k in super_traverse |
| 1600 | } |
| 1601 | eq_( |
| 1602 | subset, |
| 1603 | {k: v for k, v in super_traverse.items() if k not in ignore}, |
| 1604 | ) |
| 1605 | |
| 1606 | # name -> (traverse names, init args) |
| 1607 | custom_init = { |