@@ -2863,6 +2863,101 @@ class C:
28632863 class D (C ):
28642864 j : int
28652865
2866+ def test_inherit_frozen_mutliple_inheritance (self ):
2867+ @dataclass
2868+ class NotFrozen :
2869+ pass
2870+
2871+ @dataclass (frozen = True )
2872+ class Frozen :
2873+ pass
2874+
2875+ class NotDataclass :
2876+ pass
2877+
2878+ for bases in (
2879+ (NotFrozen , Frozen ),
2880+ (Frozen , NotFrozen ),
2881+ (Frozen , NotDataclass ),
2882+ (NotDataclass , Frozen ),
2883+ ):
2884+ with self .subTest (bases = bases ):
2885+ with self .assertRaisesRegex (
2886+ TypeError ,
2887+ 'cannot inherit non-frozen dataclass from a frozen one' ,
2888+ ):
2889+ @dataclass
2890+ class NotFrozenChild (* bases ):
2891+ pass
2892+
2893+ for bases in (
2894+ (NotFrozen , Frozen ),
2895+ (Frozen , NotFrozen ),
2896+ (NotFrozen , NotDataclass ),
2897+ (NotDataclass , NotFrozen ),
2898+ ):
2899+ with self .subTest (bases = bases ):
2900+ with self .assertRaisesRegex (
2901+ TypeError ,
2902+ 'cannot inherit frozen dataclass from a non-frozen one' ,
2903+ ):
2904+ @dataclass (frozen = True )
2905+ class FrozenChild (* bases ):
2906+ pass
2907+
2908+ def test_inherit_frozen_mutliple_inheritance_regular_mixins (self ):
2909+ @dataclass (frozen = True )
2910+ class Frozen :
2911+ pass
2912+
2913+ class NotDataclass :
2914+ pass
2915+
2916+ class C1 (Frozen , NotDataclass ):
2917+ pass
2918+ self .assertEqual (C1 .__mro__ , (C1 , Frozen , NotDataclass , object ))
2919+
2920+ class C2 (NotDataclass , Frozen ):
2921+ pass
2922+ self .assertEqual (C2 .__mro__ , (C2 , NotDataclass , Frozen , object ))
2923+
2924+ @dataclass (frozen = True )
2925+ class C3 (Frozen , NotDataclass ):
2926+ pass
2927+ self .assertEqual (C3 .__mro__ , (C3 , Frozen , NotDataclass , object ))
2928+
2929+ @dataclass (frozen = True )
2930+ class C4 (NotDataclass , Frozen ):
2931+ pass
2932+ self .assertEqual (C4 .__mro__ , (C4 , NotDataclass , Frozen , object ))
2933+
2934+ def test_multiple_frozen_dataclasses_inheritance (self ):
2935+ @dataclass (frozen = True )
2936+ class FrozenA :
2937+ pass
2938+
2939+ @dataclass (frozen = True )
2940+ class FrozenB :
2941+ pass
2942+
2943+ class C1 (FrozenA , FrozenB ):
2944+ pass
2945+ self .assertEqual (C1 .__mro__ , (C1 , FrozenA , FrozenB , object ))
2946+
2947+ class C2 (FrozenB , FrozenA ):
2948+ pass
2949+ self .assertEqual (C2 .__mro__ , (C2 , FrozenB , FrozenA , object ))
2950+
2951+ @dataclass (frozen = True )
2952+ class C3 (FrozenA , FrozenB ):
2953+ pass
2954+ self .assertEqual (C3 .__mro__ , (C3 , FrozenA , FrozenB , object ))
2955+
2956+ @dataclass (frozen = True )
2957+ class C4 (FrozenB , FrozenA ):
2958+ pass
2959+ self .assertEqual (C4 .__mro__ , (C4 , FrozenB , FrozenA , object ))
2960+
28662961 def test_inherit_nonfrozen_from_empty (self ):
28672962 @dataclass
28682963 class C :
0 commit comments