Skip to content

Commit 4b42ea6

Browse files
committed
add specific tests for deprecated overloaded class constructors
1 parent 3b7b986 commit 4b42ea6

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

test-data/unit/check-deprecated.test

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,85 @@ a += "x" # E: function __main__.A.__iadd__ is deprecated: no A += Any
666666
[builtins fixtures/tuple.pyi]
667667

668668

669+
[case testDeprecatedOverloadedClassConstructor]
670+
# flags: --enable-error-code=deprecated --disable-error-code=no-overload-impl
671+
672+
from typing_extensions import TypeAlias, deprecated, overload
673+
674+
class A:
675+
@overload
676+
@deprecated("do not pass int")
677+
def __new__(cls, arg: int) -> A: ...
678+
@overload
679+
def __new__(cls, arg: str) -> A: ...
680+
681+
class B:
682+
@overload
683+
@deprecated("do not pass int")
684+
def __init__(self, arg: int) -> None: ...
685+
@overload
686+
def __init__(self, arg: str) -> None: ...
687+
688+
A_alias: TypeAlias = A
689+
B_alias: TypeAlias = B
690+
691+
A(1) # E: overload def (cls: type[__main__.A], arg: builtins.int) -> __main__.A of function __main__.A.__new__ is deprecated: do not pass int
692+
A_alias(1) # E: overload def (cls: type[__main__.A], arg: builtins.int) -> __main__.A of function __main__.A.__new__ is deprecated: do not pass int
693+
A("")
694+
A_alias("")
695+
class A_child(A):
696+
def __new__(cls) -> A_child:
697+
super().__new__(cls, 1) # E: overload def (cls: type[__main__.A], arg: builtins.int) -> __main__.A of function __main__.A.__new__ is deprecated: do not pass int
698+
super().__new__(cls, "")
699+
return object.__new__(cls)
700+
701+
B(1) # E: overload def (self: __main__.B, arg: builtins.int) of function __main__.B.__init__ is deprecated: do not pass int
702+
B_alias(1) # E: overload def (self: __main__.B, arg: builtins.int) of function __main__.B.__init__ is deprecated: do not pass int
703+
B("")
704+
B_alias("")
705+
class B_child(B):
706+
def __init__(self) -> None:
707+
super().__init__(1) # E: overload def (self: __main__.B, arg: builtins.int) of function __main__.B.__init__ is deprecated: do not pass int
708+
super().__init__("")
709+
710+
[builtins fixtures/tuple.pyi]
711+
712+
713+
[case testDeprecatedOverloadedClassConstructorDecoratingOverloadedFunction]
714+
715+
# flags: --enable-error-code=deprecated --disable-error-code=no-overload-impl
716+
717+
from typing import Callable, Generic, TypeVar
718+
from typing_extensions import deprecated, overload
719+
720+
F = TypeVar("F", bound=Callable[..., object])
721+
722+
class decorator(Generic[F]):
723+
__call__: F
724+
725+
@overload
726+
@deprecated("decorated function must take arguments")
727+
def __init__(self: decorator[Callable[[], None]], f: Callable[[], None]) -> None: ...
728+
@overload
729+
def __init__(self, f: F) -> None: ...
730+
731+
@overload
732+
@decorator
733+
def f(a: str) -> None: ...
734+
@overload # E: overload def (self: __main__.decorator[def ()], f: def ()) of function __main__.decorator.__init__ is deprecated: decorated function must take arguments
735+
@decorator
736+
def f() -> None: ...
737+
738+
f()
739+
f("")
740+
f(1) # E: No overload variant of "f" matches argument type "int" \
741+
# N: Possible overload variants: \
742+
# N: def f(a: str) -> None \
743+
# N: def f() -> None
744+
745+
[builtins fixtures/tuple.pyi]
746+
747+
669748
[case testDeprecatedMethod]
670749
# flags: --enable-error-code=deprecated
671750

0 commit comments

Comments
 (0)