# SPDX-License-Identifier: MIT """ Tests for `__init_subclass__` related functionality. """ import attr def test_init_subclass_vanilla(slots): """ `super().__init_subclass__` can be used if the subclass is not an attrs class both with dict and slotted classes. """ @attr.s(slots=slots) class Base: def __init_subclass__(cls, param, **kw): super().__init_subclass__(**kw) cls.param = param class Vanilla(Base, param="foo"): pass assert "foo" == Vanilla().param def test_init_subclass_attrs(): """ `__init_subclass__` works with attrs classes as long as slots=False. """ @attr.s(slots=False) class Base: def __init_subclass__(cls, param, **kw): super().__init_subclass__(**kw) cls.param = param @attr.s class Attrs(Base, param="foo"): pass assert "foo" == Attrs().param def test_init_subclass_slots_workaround(): """ `__init_subclass__` works with modern APIs if care is taken around classes existing twice. """ subs = {} @attr.define class Base: def __init_subclass__(cls): subs[cls.__qualname__] = cls @attr.define class Sub1(Base): x: int @attr.define class Sub2(Base): y: int assert (Sub1, Sub2) == tuple(subs.values())