| -- Serialization test cases (incremental type checking) |
| -- |
| -- These test that modules deserialized from cache files behave |
| -- identically to modules that have undergone full type checking. |
| -- |
| -- These tests are written using the same syntax as test cases in |
| -- check-incremental.test. Look at the comment at that the top of |
| -- that file for the details of how these tests work. |
| -- |
| -- There is probably some overlap with check-incremental.test, but it |
| -- is perhaps not worth trying to simplify these, since a few redundant |
| -- test cases are cheap but accidentally losing test coverage is bad. |
| -- |
| -- These are intended to be straightforward, and do not test import |
| -- cycles and other tricky business. Add test cases for complex things |
| -- to check-incremental.test. |
| |
| -- |
| -- Basic things |
| -- |
| |
| [case testSerializeModuleAttribute] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| y = b.x # type: int |
| [file b.py] |
| x = '' |
| -- We only do the following two sections once here to avoid repetition. |
| -- Most other test cases are similar. |
| [rechecked a] |
| [stale] |
| [out2] |
| tmp/a.py:2: error: Incompatible types in assignment (expression has type "str", variable has type "int") |
| |
| -- |
| -- Functions |
| -- |
| |
| [case testSerializeAnnotatedFunction] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| b.f(1) |
| x = b.f('') # type: str |
| [file b.py] |
| def f(x: str) -> int: pass |
| [out2] |
| tmp/a.py:2: error: Argument 1 to "f" has incompatible type "int"; expected "str" |
| tmp/a.py:3: error: Incompatible types in assignment (expression has type "int", variable has type "str") |
| |
| [case testSerializeUnannotatedFunction] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| b.f(x=1) |
| b.f() |
| [file b.py] |
| def f(x): pass |
| [out2] |
| tmp/a.py:3: error: Missing positional argument "x" in call to "f" |
| |
| [case testSerializeGenericFunction] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import f |
| reveal_type(f(1)) |
| reveal_type(f(x='')) |
| [file b.py] |
| from typing import TypeVar |
| |
| T = TypeVar('T') |
| |
| def f(x: T) -> T: return x |
| [out2] |
| tmp/a.py:2: note: Revealed type is "builtins.int" |
| tmp/a.py:3: note: Revealed type is "builtins.str" |
| |
| [case testSerializeFunctionReturningGenericFunction] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| reveal_type(b.f) |
| reveal_type(b.f()('')) |
| [file b.py] |
| from typing import TypeVar, Callable |
| |
| T = TypeVar('T') |
| |
| def f() -> Callable[[T], T]: pass |
| [out2] |
| tmp/a.py:2: note: Revealed type is "def () -> def [T] (T`-1) -> T`-1" |
| tmp/a.py:3: note: Revealed type is "builtins.str" |
| |
| [case testSerializeArgumentKinds] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import f |
| f(1, z=1) |
| f(1, '', z=1) |
| f(1, y='', z=1) |
| f(1, '', 2, 3, z=1) |
| f(1, '', zz=1, z=1) |
| f(1, '', foo='', z=1) |
| [file b.py] |
| def f(x: int, |
| y: str = '', |
| *args: int, |
| z: int, |
| zz: int = 1, |
| **kw: str) -> None: pass |
| [builtins fixtures/dict.pyi] |
| [out2] |
| |
| [case testSerializeCallableWithBoundTypeArguments] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| x = b.f |
| [file b.py] |
| from typing import TypeVar, Generic |
| |
| T = TypeVar('T') |
| |
| class C(Generic[T]): |
| def f(self, x: T) -> None: pass |
| |
| c: C[int] |
| f = c.f |
| [out] |
| [out2] |
| |
| [case testSerializePositionalOnlyArgument] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| b.f(1) |
| b.f('') |
| b.f(__x=1) |
| [file b.py] |
| def f(__x: int) -> None: pass |
| [out2] |
| tmp/a.py:3: error: Argument 1 to "f" has incompatible type "str"; expected "int" |
| tmp/a.py:4: error: Unexpected keyword argument "__x" for "f" |
| |
| [case testSerializeArgumentKindsErrors] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import f |
| f('', z=1) # Line 2 |
| f(1, 2, z=1) # 3 |
| f(1, y=1, z=1) # 4 |
| f(1, '', 2, '', z=1) # 5 |
| f(1, '', z='') # 6 |
| f(1, '', zz='', z=1) # 7 |
| f(1, '', z=1, foo=1) # 8 |
| [file b.py] |
| def f(x: int, |
| y: str = '', |
| *args: int, |
| z: int, |
| zz: int = 1, |
| **kw: str) -> None: pass |
| [builtins fixtures/dict.pyi] |
| [out2] |
| tmp/a.py:2: error: Argument 1 to "f" has incompatible type "str"; expected "int" |
| tmp/a.py:3: error: Argument 2 to "f" has incompatible type "int"; expected "str" |
| tmp/a.py:4: error: Argument "y" to "f" has incompatible type "int"; expected "str" |
| tmp/a.py:5: error: Argument 4 to "f" has incompatible type "str"; expected "int" |
| tmp/a.py:6: error: Argument "z" to "f" has incompatible type "str"; expected "int" |
| tmp/a.py:7: error: Argument "zz" to "f" has incompatible type "str"; expected "int" |
| tmp/a.py:8: error: Argument "foo" to "f" has incompatible type "int"; expected "str" |
| |
| [case testSerializeOverloadedFunction] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| reveal_type(b.f(1)) |
| reveal_type(b.f('')) |
| [file b.pyi] |
| from typing import overload |
| @overload |
| def f(x: int) -> int: pass |
| @overload |
| def f(x: str) -> str: pass |
| [out2] |
| tmp/a.py:2: note: Revealed type is "builtins.int" |
| tmp/a.py:3: note: Revealed type is "builtins.str" |
| |
| [case testSerializeDecoratedFunction] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| reveal_type(b.f('')) |
| b.f(x=1) |
| [file b.py] |
| from typing import Callable |
| def dec(f: Callable[[int], int]) -> Callable[[str], str]: pass |
| @dec |
| def f(x: int) -> int: pass |
| [out2] |
| tmp/a.py:2: note: Revealed type is "builtins.str" |
| tmp/a.py:3: error: Unexpected keyword argument "x" for "f" |
| |
| [case testSerializeTypeGuardFunction] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| reveal_type(b.guard('')) |
| reveal_type(b.guard) |
| [file b.py] |
| from typing_extensions import TypeGuard |
| def guard(a: object) -> TypeGuard[str]: pass |
| [builtins fixtures/tuple.pyi] |
| [out2] |
| tmp/a.py:2: note: Revealed type is "builtins.bool" |
| tmp/a.py:3: note: Revealed type is "def (a: builtins.object) -> TypeGuard[builtins.str]" |
| -- |
| -- Classes |
| -- |
| |
| [case testSerializeClassAttribute] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| b.A().x = '' |
| [file b.py] |
| class A: |
| x = 1 |
| [out2] |
| tmp/a.py:2: error: Incompatible types in assignment (expression has type "str", variable has type "int") |
| |
| [case testSerializeMethod] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| b.A().f('') |
| [file b.py] |
| class A: |
| def f(self, x: int) -> None: pass |
| [out2] |
| tmp/a.py:2: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int" |
| |
| [case testSerialize__init__] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| A('') |
| class B(A): |
| def f(self) -> None: |
| super().__init__('') |
| [file b.py] |
| class A: |
| def __init__(self, x: int) -> None: pass |
| [out2] |
| tmp/a.py:2: error: Argument 1 to "A" has incompatible type "str"; expected "int" |
| tmp/a.py:5: error: Argument 1 to "__init__" of "A" has incompatible type "str"; expected "int" |
| |
| [case testSerializeOverloaded__init__] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| A(object()) # E |
| A(x='') |
| A(0) |
| class B(A): |
| def f(self) -> None: |
| super().__init__(object()) # E |
| super().__init__('') |
| super().__init__(0) |
| [file b.pyi] |
| from typing import overload |
| class A: |
| @overload |
| def __init__(self, x: int) -> None: pass |
| @overload |
| def __init__(self, x: str) -> None: pass |
| [out2] |
| tmp/a.py:2: error: No overload variant of "A" matches argument type "object" |
| tmp/a.py:2: note: Possible overload variants: |
| tmp/a.py:2: note: def A(self, x: int) -> A |
| tmp/a.py:2: note: def A(self, x: str) -> A |
| tmp/a.py:7: error: No overload variant of "__init__" of "A" matches argument type "object" |
| tmp/a.py:7: note: Possible overload variants: |
| tmp/a.py:7: note: def __init__(self, x: int) -> None |
| tmp/a.py:7: note: def __init__(self, x: str) -> None |
| |
| [case testSerialize__new__] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| A('') |
| [file b.py] |
| class A: |
| def __new__(cls, x: int) -> 'A': pass |
| [out2] |
| tmp/a.py:2: error: Argument 1 to "A" has incompatible type "str"; expected "int" |
| |
| [case testSerializeClassVar] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| A.x = '' |
| A().x = 1 |
| [file b.py] |
| from typing import ClassVar |
| class A: |
| x: ClassVar[int] |
| [out2] |
| tmp/a.py:2: error: Incompatible types in assignment (expression has type "str", variable has type "int") |
| tmp/a.py:3: error: Cannot assign to class variable "x" via instance |
| |
| [case testSerializeGenericClass] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| a1: A[int, str] = A(1) |
| a2: A[int, str] = A('') |
| reveal_type(a1.y) |
| reveal_type(a1.f()) |
| [file b.py] |
| from typing import TypeVar, Generic |
| T = TypeVar('T') |
| S = TypeVar('S') |
| class A(Generic[T, S]): |
| x: T |
| y: S |
| def __init__(self, x: T) -> None: |
| self.x = x |
| def f(self) -> T: |
| return self.x |
| [out2] |
| tmp/a.py:3: error: Argument 1 to "A" has incompatible type "str"; expected "int" |
| tmp/a.py:4: note: Revealed type is "builtins.str" |
| tmp/a.py:5: note: Revealed type is "builtins.int" |
| |
| [case testSerializeAbstractClass] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| A() |
| class B(A): |
| def f(self) -> None: pass |
| x: int |
| B() |
| a: A |
| a.f() |
| a.x = 1 |
| [file b.py] |
| from abc import ABCMeta, abstractmethod, abstractproperty |
| class A(metaclass=ABCMeta): |
| @abstractmethod |
| def f(self) -> None: pass |
| @abstractproperty |
| def x(self) -> int: return 0 |
| [typing fixtures/typing-medium.pyi] |
| [out2] |
| tmp/a.py:2: error: Cannot instantiate abstract class "A" with abstract attributes "f" and "x" |
| tmp/a.py:9: error: Property "x" defined in "A" is read-only |
| |
| [case testSerializeStaticMethod] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| A.f(1) |
| A.f() |
| A().f() |
| [file b.py] |
| class A: |
| @staticmethod |
| def f() -> None: pass |
| [builtins fixtures/staticmethod.pyi] |
| [out2] |
| tmp/a.py:2: error: Too many arguments for "f" of "A" |
| |
| [case testSerializeClassMethod] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| A.f(1) |
| A.f() |
| A().f() |
| [file b.py] |
| class A: |
| @classmethod |
| def f(cls) -> None: pass |
| [builtins fixtures/classmethod.pyi] |
| [out2] |
| tmp/a.py:2: error: Too many arguments for "f" of "A" |
| |
| [case testSerializeReadOnlyProperty] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| reveal_type(A().x) |
| A().x = 0 |
| [file b.py] |
| class A: |
| @property |
| def x(self) -> int: return 0 |
| [builtins fixtures/property.pyi] |
| [out2] |
| tmp/a.py:2: note: Revealed type is "builtins.int" |
| tmp/a.py:3: error: Property "x" defined in "A" is read-only |
| |
| [case testSerializeReadWriteProperty] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| reveal_type(A().x) |
| A().x = '' |
| A().x = 0 |
| [file b.py] |
| class A: |
| @property |
| def x(self) -> int: return 0 |
| @x.setter |
| def x(self, v: int) -> None: pass |
| [builtins fixtures/property.pyi] |
| [out2] |
| tmp/a.py:2: note: Revealed type is "builtins.int" |
| tmp/a.py:3: error: Incompatible types in assignment (expression has type "str", variable has type "int") |
| |
| [case testSerializeSelfType] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| reveal_type(A().f()) |
| class B(A): pass |
| reveal_type(B().f()) |
| [file b.py] |
| from typing import TypeVar |
| T = TypeVar('T', bound='A') |
| class A: |
| def f(self: T) -> T: return self |
| [out2] |
| tmp/a.py:2: note: Revealed type is "b.A" |
| tmp/a.py:4: note: Revealed type is "a.B" |
| |
| [case testSerializeInheritance] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A, B, C |
| C().f(1) # E |
| C().g(1) # E |
| reveal_type(C().h()) |
| a: A = C() |
| b: B = C() |
| i: int = C() # E |
| [file b.py] |
| class A: |
| def f(self) -> int: pass |
| class B: |
| def g(self) -> str: pass |
| def h(self) -> object: pass |
| class C(A, B): |
| def h(self) -> int: pass |
| [out2] |
| tmp/a.py:2: error: Too many arguments for "f" of "A" |
| tmp/a.py:3: error: Too many arguments for "g" of "B" |
| tmp/a.py:4: note: Revealed type is "builtins.int" |
| tmp/a.py:7: error: Incompatible types in assignment (expression has type "C", variable has type "int") |
| |
| [case testSerializeGenericInheritance] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import B |
| b: B[int] |
| reveal_type(b.f()) |
| [file b.py] |
| from typing import TypeVar, Generic |
| T = TypeVar('T') |
| class A(Generic[T]): |
| def f(self) -> T: pass |
| class B(A[A[T]]): |
| pass |
| [out2] |
| tmp/a.py:3: note: Revealed type is "b.A[builtins.int]" |
| |
| [case testSerializeFixedLengthTupleBaseClass] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| a: A |
| a.f(1) |
| reveal_type((a[0], a[1])) |
| [file b.py] |
| from typing import Tuple |
| class A(Tuple[int, str]): |
| def f(self) -> None: pass |
| [builtins fixtures/tuple.pyi] |
| [out2] |
| tmp/a.py:3: error: Too many arguments for "f" of "A" |
| tmp/a.py:4: note: Revealed type is "Tuple[builtins.int, builtins.str]" |
| |
| [case testSerializeVariableLengthTupleBaseClass] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| a: A |
| a.f(1) |
| reveal_type((a[0], a[1])) |
| [file b.py] |
| from typing import Tuple |
| class A(Tuple[int, ...]): |
| def f(self) -> None: pass |
| [builtins fixtures/tuple.pyi] |
| [out2] |
| tmp/a.py:3: error: Too many arguments for "f" of "A" |
| tmp/a.py:4: note: Revealed type is "Tuple[builtins.int, builtins.int]" |
| |
| [case testSerializePlainTupleBaseClass] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| a: A |
| a.f(1) |
| reveal_type((a[0], a[1])) |
| [file b.py] |
| from typing import Tuple |
| class A(tuple): |
| def f(self) -> None: pass |
| [builtins fixtures/tuple.pyi] |
| [out2] |
| tmp/a.py:3: error: Too many arguments for "f" of "A" |
| tmp/a.py:4: note: Revealed type is "Tuple[Any, Any]" |
| |
| [case testSerializeNamedTupleBaseClass] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| a: A |
| a.f(1) |
| reveal_type((a[0], a[1])) |
| reveal_type((a.x, a.y)) |
| [file b.py] |
| from typing import NamedTuple |
| class A(NamedTuple('N', [('x', int), ('y', str)])): |
| def f(self) -> None: pass |
| [builtins fixtures/tuple.pyi] |
| [out2] |
| tmp/a.py:3: error: Too many arguments for "f" of "A" |
| tmp/a.py:4: note: Revealed type is "Tuple[builtins.int, builtins.str]" |
| tmp/a.py:5: note: Revealed type is "Tuple[builtins.int, builtins.str]" |
| |
| [case testSerializeAnyBaseClass] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import B |
| B().f(1) |
| reveal_type(B().xyz) |
| [file b.py] |
| from typing import Any |
| A: Any |
| class B(A): |
| def f(self) -> None: pass |
| [builtins fixtures/tuple.pyi] |
| [out2] |
| tmp/a.py:2: error: Too many arguments for "f" of "B" |
| tmp/a.py:3: note: Revealed type is "Any" |
| |
| [case testSerializeIndirectAnyBaseClass] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import C |
| C().f(1) |
| C().g(1) |
| reveal_type(C().xyz) |
| [file b.py] |
| from typing import Any |
| A: Any |
| class B(A): |
| def f(self) -> None: pass |
| class C(B): |
| def g(self) -> None: pass |
| [builtins fixtures/tuple.pyi] |
| [out2] |
| tmp/a.py:2: error: Too many arguments for "f" of "B" |
| tmp/a.py:3: error: Too many arguments for "g" of "C" |
| tmp/a.py:4: note: Revealed type is "Any" |
| |
| [case testSerializeNestedClass] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| b.A.B().f(1) |
| b.A.B.C().g(1) |
| b.b.f(1) |
| b.c.g(1) |
| [file b.py] |
| class A: |
| class B: |
| def f(self) -> None: pass |
| class C: |
| def g(self) -> None: pass |
| b: A.B |
| c: A.B.C |
| [builtins fixtures/tuple.pyi] |
| [out2] |
| tmp/a.py:2: error: Too many arguments for "f" of "B" |
| tmp/a.py:3: error: Too many arguments for "g" of "C" |
| tmp/a.py:4: error: Too many arguments for "f" of "B" |
| tmp/a.py:5: error: Too many arguments for "g" of "C" |
| |
| [case testSerializeCallableVsTypeObjectDistinction] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| t: type |
| t = b.A |
| if int(): |
| t = b.f # E |
| [file b.py] |
| class A: pass |
| def f() -> None: pass |
| [builtins fixtures/tuple.pyi] |
| [out2] |
| tmp/a.py:5: error: Incompatible types in assignment (expression has type "Callable[[], None]", variable has type "type") |
| |
| [case testSerializeOverloadedVsTypeObjectDistinction] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| t: type |
| t = b.A |
| if int(): |
| t = b.f # E |
| [file b.pyi] |
| from typing import overload |
| class A: |
| @overload |
| def __init__(self) -> None: pass |
| @overload |
| def __init__(self, x: int) -> None: pass |
| @overload |
| def f() -> None: pass |
| @overload |
| def f(x: int) -> None: pass |
| [builtins fixtures/tuple.pyi] |
| [out2] |
| tmp/a.py:5: error: Incompatible types in assignment (expression has type overloaded function, variable has type "type") |
| |
| [case testSerializeNamedTupleInMethod4] |
| from ntcrash import C |
| reveal_type(C().a) |
| reveal_type(C().b) |
| reveal_type(C().c) |
| [file ntcrash.py] |
| from typing import NamedTuple |
| class C: |
| def __init__(self) -> None: |
| A = NamedTuple('A', [('x', int)]) |
| self.a = A(0) |
| self.b = A(0) # type: A |
| self.c = A |
| [builtins fixtures/tuple.pyi] |
| [out1] |
| main:2: note: Revealed type is "Tuple[builtins.int, fallback=ntcrash.C.A@4]" |
| main:3: note: Revealed type is "Tuple[builtins.int, fallback=ntcrash.C.A@4]" |
| main:4: note: Revealed type is "def (x: builtins.int) -> Tuple[builtins.int, fallback=ntcrash.C.A@4]" |
| [out2] |
| main:2: note: Revealed type is "Tuple[builtins.int, fallback=ntcrash.C.A@4]" |
| main:3: note: Revealed type is "Tuple[builtins.int, fallback=ntcrash.C.A@4]" |
| main:4: note: Revealed type is "def (x: builtins.int) -> Tuple[builtins.int, fallback=ntcrash.C.A@4]" |
| |
| -- |
| -- Strict optional |
| -- |
| |
| [case testSerializeOptionalType] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| reveal_type(b.x) |
| b.f(b.x) |
| [file b.py] |
| from typing import Optional |
| x: Optional[int] |
| def f(x: int) -> None: pass |
| [out2] |
| tmp/a.py:2: note: Revealed type is "Union[builtins.int, None]" |
| tmp/a.py:3: error: Argument 1 to "f" has incompatible type "Optional[int]"; expected "int" |
| |
| -- |
| -- # type: ignore |
| -- |
| |
| [case testSerializeIgnoredUndefinedType] |
| import b |
| reveal_type(b.x) |
| [file b.py] |
| x: NonExistent # type: ignore |
| [out1] |
| main:2: note: Revealed type is "Any" |
| [out2] |
| main:2: note: Revealed type is "Any" |
| |
| [case testSerializeIgnoredInvalidType] |
| import b |
| reveal_type(b.x) |
| [file b.py] |
| A = 0 |
| x: A # type: ignore |
| [out1] |
| main:2: note: Revealed type is "A?" |
| [out2] |
| main:2: note: Revealed type is "A?" |
| |
| [case testSerializeIgnoredMissingBaseClass] |
| import b |
| reveal_type(b.B()) |
| reveal_type(b.B().x) |
| [file b.py] |
| class B(A): pass # type: ignore |
| [out1] |
| main:2: note: Revealed type is "b.B" |
| main:3: note: Revealed type is "Any" |
| [out2] |
| main:2: note: Revealed type is "b.B" |
| main:3: note: Revealed type is "Any" |
| |
| [case testSerializeIgnoredInvalidBaseClass] |
| import b |
| reveal_type(b.B()) |
| reveal_type(b.B().x) |
| [file b.py] |
| A = 0 |
| class B(A): pass # type: ignore |
| [out1] |
| main:2: note: Revealed type is "b.B" |
| main:3: note: Revealed type is "Any" |
| [out2] |
| main:2: note: Revealed type is "b.B" |
| main:3: note: Revealed type is "Any" |
| |
| [case testSerializeIgnoredImport] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| reveal_type(b.m) |
| reveal_type(b.x) |
| [file b.py] |
| import m # type: ignore |
| from m import x # type: ignore |
| [out2] |
| tmp/a.py:2: note: Revealed type is "Any" |
| tmp/a.py:3: note: Revealed type is "Any" |
| |
| -- |
| -- TypeVar |
| -- |
| |
| [case testSerializeSimpleTypeVar] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| def f(x: b.T) -> b.T: return x |
| reveal_type(f) |
| [file b.py] |
| from typing import TypeVar |
| T = TypeVar('T') |
| [out2] |
| tmp/a.py:3: note: Revealed type is "def [b.T] (x: b.T`-1) -> b.T`-1" |
| |
| [case testSerializeBoundedTypeVar] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| def f(x: b.T) -> b.T: return x |
| reveal_type(f) |
| reveal_type(b.g) |
| [file b.py] |
| from typing import TypeVar |
| T = TypeVar('T', bound=int) |
| def g(x: T) -> T: return x |
| [out2] |
| tmp/a.py:3: note: Revealed type is "def [b.T <: builtins.int] (x: b.T`-1) -> b.T`-1" |
| tmp/a.py:4: note: Revealed type is "def [T <: builtins.int] (x: T`-1) -> T`-1" |
| |
| [case testSerializeTypeVarWithValues] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| def f(x: b.T) -> b.T: return x |
| reveal_type(f) |
| reveal_type(b.g) |
| [file b.py] |
| from typing import TypeVar |
| T = TypeVar('T', int, str) |
| def g(x: T) -> T: return x |
| [out2] |
| tmp/a.py:3: note: Revealed type is "def [b.T in (builtins.int, builtins.str)] (x: b.T`-1) -> b.T`-1" |
| tmp/a.py:4: note: Revealed type is "def [T in (builtins.int, builtins.str)] (x: T`-1) -> T`-1" |
| |
| [case testSerializeTypeVarInClassBody] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| from b import A |
| def f(x: A.T) -> A.T: return x |
| reveal_type(f) |
| [file b.py] |
| from typing import TypeVar |
| class A: |
| T = TypeVar('T', int, str) |
| [out2] |
| tmp/a.py:3: note: Revealed type is "def [A.T in (builtins.int, builtins.str)] (x: A.T`-1) -> A.T`-1" |
| |
| -- |
| -- NewType |
| -- |
| |
| [case testSerializeNewType] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| y: b.N |
| y = 1 |
| i = y |
| b.x = 1 |
| b.x = y |
| y = b.N(1) |
| y = b.N('') |
| [file b.py] |
| from typing import NewType |
| N = NewType('N', int) |
| x: N |
| [out2] |
| tmp/a.py:3: error: Incompatible types in assignment (expression has type "int", variable has type "N") |
| tmp/a.py:5: error: Incompatible types in assignment (expression has type "int", variable has type "N") |
| tmp/a.py:8: error: Argument 1 to "N" has incompatible type "str"; expected "int" |
| |
| -- |
| -- Named tuples |
| -- |
| |
| [case testSerializeNamedTuple] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| from typing import Tuple |
| y: b.N |
| t: Tuple[int] |
| y = t |
| b.x = t |
| t = y |
| b.x = t |
| reveal_type(b.N(x=1)) |
| reveal_type(y[0]) |
| b.N(x='') |
| [file b.py] |
| from typing import NamedTuple |
| N = NamedTuple('N', [('x', int)]) |
| x: N |
| [builtins fixtures/tuple.pyi] |
| [out2] |
| tmp/a.py:5: error: Incompatible types in assignment (expression has type "Tuple[int]", variable has type "N") |
| tmp/a.py:6: error: Incompatible types in assignment (expression has type "Tuple[int]", variable has type "N") |
| tmp/a.py:9: note: Revealed type is "Tuple[builtins.int, fallback=b.N]" |
| tmp/a.py:10: note: Revealed type is "builtins.int" |
| tmp/a.py:11: error: Argument "x" to "N" has incompatible type "str"; expected "int" |
| |
| -- |
| -- Types and type aliases |
| -- |
| |
| [case testSerializeTypeAliases] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| d: b.D |
| a: b.A |
| u: b.U |
| l: b.L |
| t: b.T |
| c: b.C |
| ty: b.Ty |
| reveal_type(d) |
| reveal_type(a) |
| reveal_type(u) |
| reveal_type(l) |
| reveal_type(t) |
| reveal_type(c) |
| reveal_type(ty) |
| c2: b.C2 |
| reveal_type(c2) |
| ty2: b.Ty2 |
| reveal_type(ty2) |
| [file b.py] |
| from typing import Any, Union, List, Tuple, Callable, Type |
| class DD: pass |
| D = DD |
| A = Any |
| U = Union[int, str] |
| L = List[int] |
| T = Tuple[int, str] |
| C = Callable[[int], str] |
| C2 = Callable[..., str] |
| Ty = Type[int] |
| Ty2 = type |
| [builtins fixtures/list.pyi] |
| [out2] |
| tmp/a.py:9: note: Revealed type is "b.DD" |
| tmp/a.py:10: note: Revealed type is "Any" |
| tmp/a.py:11: note: Revealed type is "Union[builtins.int, builtins.str]" |
| tmp/a.py:12: note: Revealed type is "builtins.list[builtins.int]" |
| tmp/a.py:13: note: Revealed type is "Tuple[builtins.int, builtins.str]" |
| tmp/a.py:14: note: Revealed type is "def (builtins.int) -> builtins.str" |
| tmp/a.py:15: note: Revealed type is "Type[builtins.int]" |
| tmp/a.py:17: note: Revealed type is "def (*Any, **Any) -> builtins.str" |
| tmp/a.py:19: note: Revealed type is "builtins.type" |
| |
| [case testSerializeGenericTypeAlias] |
| import b |
| from b import X # Work around https://github.com/python/mypy/issues/2887 |
| t: b.Y[int] |
| reveal_type(t) |
| [file b.py] |
| from typing import TypeVar, Tuple |
| X = TypeVar('X') |
| Y = Tuple[X, str] |
| [builtins fixtures/tuple.pyi] |
| [out1] |
| main:4: note: Revealed type is "Tuple[builtins.int, builtins.str]" |
| [out2] |
| main:4: note: Revealed type is "Tuple[builtins.int, builtins.str]" |
| |
| [case testSerializeTuple] |
| # Don't repreat types tested by testSerializeTypeAliases here. |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| reveal_type(b.x) |
| reveal_type(b.y) |
| [file b.py] |
| from typing import Tuple |
| x: Tuple[int, ...] |
| y: tuple |
| [builtins fixtures/tuple.pyi] |
| [out2] |
| tmp/a.py:2: note: Revealed type is "builtins.tuple[builtins.int, ...]" |
| tmp/a.py:3: note: Revealed type is "builtins.tuple[Any, ...]" |
| |
| [case testSerializeNone] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| reveal_type(b.x) |
| [file b.py] |
| x: None |
| [out2] |
| tmp/a.py:2: note: Revealed type is "None" |
| |
| -- |
| -- TypedDict |
| -- |
| |
| [case testSerializeTypedDictInMethod] |
| from ntcrash import C |
| reveal_type(C().a) |
| reveal_type(C().b) |
| reveal_type(C().c) |
| [file ntcrash.py] |
| from mypy_extensions import TypedDict |
| class C: |
| def __init__(self) -> None: |
| A = TypedDict('A', {'x': int}) |
| self.a = A(x=0) |
| self.b = A(x=0) # type: A |
| self.c = A |
| [builtins fixtures/dict.pyi] |
| [out1] |
| main:2: note: Revealed type is "TypedDict('ntcrash.C.A@4', {'x': builtins.int})" |
| main:3: note: Revealed type is "TypedDict('ntcrash.C.A@4', {'x': builtins.int})" |
| main:4: note: Revealed type is "def (*, x: builtins.int) -> TypedDict('ntcrash.C.A@4', {'x': builtins.int})" |
| [out2] |
| main:2: note: Revealed type is "TypedDict('ntcrash.C.A@4', {'x': builtins.int})" |
| main:3: note: Revealed type is "TypedDict('ntcrash.C.A@4', {'x': builtins.int})" |
| main:4: note: Revealed type is "def (*, x: builtins.int) -> TypedDict('ntcrash.C.A@4', {'x': builtins.int})" |
| |
| [case testSerializeNonTotalTypedDict] |
| from m import d |
| reveal_type(d) |
| [file m.py] |
| from mypy_extensions import TypedDict |
| D = TypedDict('D', {'x': int, 'y': str}, total=False) |
| d: D |
| [builtins fixtures/dict.pyi] |
| [out1] |
| main:2: note: Revealed type is "TypedDict('m.D', {'x'?: builtins.int, 'y'?: builtins.str})" |
| [out2] |
| main:2: note: Revealed type is "TypedDict('m.D', {'x'?: builtins.int, 'y'?: builtins.str})" |
| |
| -- |
| -- Modules |
| -- |
| |
| [case testSerializeImport] |
| import b |
| b.c.f() |
| b.c.g() |
| [file b.py] |
| import c |
| [file c.py] |
| def f() -> None: pass |
| def g(x: int) -> None: pass |
| [out1] |
| main:3: error: Missing positional argument "x" in call to "g" |
| [out2] |
| main:3: error: Missing positional argument "x" in call to "g" |
| |
| [case testSerializeImportAs] |
| import b |
| b.d.f() |
| b.d.g() |
| [file b.py] |
| import c as d |
| [file c.py] |
| def f() -> None: pass |
| def g(x: int) -> None: pass |
| [out1] |
| main:3: error: Missing positional argument "x" in call to "g" |
| [out2] |
| main:3: error: Missing positional argument "x" in call to "g" |
| |
| [case testSerializeFromImportedClass] |
| import b |
| b.A(1) |
| reveal_type(b.A()) |
| [file b.py] |
| from c import A |
| [file c.py] |
| class A: pass |
| [out1] |
| main:2: error: Too many arguments for "A" |
| main:3: note: Revealed type is "c.A" |
| [out2] |
| main:2: error: Too many arguments for "A" |
| main:3: note: Revealed type is "c.A" |
| |
| [case testSerializeFromImportedClassAs] |
| import b |
| b.B(1) |
| reveal_type(b.B()) |
| [file b.py] |
| from c import A as B |
| [file c.py] |
| class A: pass |
| [out1] |
| main:2: error: Too many arguments for "A" |
| main:3: note: Revealed type is "c.A" |
| [out2] |
| main:2: error: Too many arguments for "A" |
| main:3: note: Revealed type is "c.A" |
| |
| [case testSerializeFromImportedModule] |
| import b |
| b.d.f() |
| b.d.g() |
| [file b.py] |
| from c import d |
| [file c/__init__.py] |
| [file c/d.py] |
| def f() -> None: pass |
| def g(x: int) -> None: pass |
| [out1] |
| main:3: error: Missing positional argument "x" in call to "g" |
| [out2] |
| main:3: error: Missing positional argument "x" in call to "g" |
| |
| [case testSerializeQualifiedImport] |
| import b |
| b.c.d.f() |
| b.c.d.g() |
| [file b.py] |
| import c.d |
| [file c/__init__.py] |
| [file c/d.py] |
| def f() -> None: pass |
| def g(x: int) -> None: pass |
| [out1] |
| main:3: error: Missing positional argument "x" in call to "g" |
| [out2] |
| main:3: error: Missing positional argument "x" in call to "g" |
| |
| [case testSerializeQualifiedImportAs] |
| import b |
| b.e.f() |
| b.e.g() |
| [file b.py] |
| import c.d as e |
| [file c/__init__.py] |
| [file c/d.py] |
| def f() -> None: pass |
| def g(x: int) -> None: pass |
| [out1] |
| main:3: error: Missing positional argument "x" in call to "g" |
| [out2] |
| main:3: error: Missing positional argument "x" in call to "g" |
| |
| [case testSerialize__init__ModuleImport] |
| import b |
| b.c.f() |
| b.c.g() |
| a: b.c.d.A |
| reveal_type(a) |
| [file b.py] |
| import c |
| [file c/__init__.py] |
| import d |
| def f() -> None: pass |
| def g(x: int) -> None: pass |
| [file d.py] |
| class A: pass |
| [out1] |
| main:3: error: Missing positional argument "x" in call to "g" |
| main:5: note: Revealed type is "d.A" |
| [out2] |
| main:3: error: Missing positional argument "x" in call to "g" |
| main:5: note: Revealed type is "d.A" |
| |
| [case testSerializeImportInClassBody] |
| import b |
| b.A.c.f() |
| b.A.c.g() |
| [file b.py] |
| class A: |
| import c |
| [file c.py] |
| def f() -> None: pass |
| def g(x: int) -> None: pass |
| [out1] |
| main:3: error: Missing positional argument "x" in call to "g" |
| [out2] |
| main:3: error: Missing positional argument "x" in call to "g" |
| |
| [case testSerializeImportedTypeAlias] |
| import b |
| x: b.B |
| reveal_type(x) |
| [file b.py] |
| from c import B |
| [file c.py] |
| from typing import Any |
| class A: pass |
| B = A |
| [out1] |
| main:3: note: Revealed type is "c.A" |
| [out2] |
| main:3: note: Revealed type is "c.A" |
| |
| [case testSerializeStarImport] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| b.f(1) |
| x: b.A |
| reveal_type(x) |
| [file b.py] |
| from c import * |
| [file c.py] |
| def f() -> None: pass |
| class A: pass |
| [out2] |
| tmp/a.py:2: error: Too many arguments for "f" |
| tmp/a.py:4: note: Revealed type is "c.A" |
| |
| [case testSerializeRelativeImport] |
| import b.c |
| b.c.f(1) |
| [file b/__init__.py] |
| [file b/c.py] |
| from .d import f |
| [file b/d.py] |
| def f() -> None: pass |
| [out1] |
| main:2: error: Too many arguments for "f" |
| [out2] |
| main:2: error: Too many arguments for "f" |
| |
| [case testSerializeDummyType] |
| # flags: --no-strict-optional |
| import a |
| [file a.py] |
| import b |
| reveal_type(b.Test(None).foo) |
| [file a.py.2] |
| import b |
| reveal_type(b.Test(b.Foo()).foo) |
| [file b.py] |
| class Foo(object): pass |
| class Test: |
| def __init__(self, o: Foo) -> None: |
| self.foo = None |
| if callable(o): |
| self.foo = o |
| [builtins fixtures/callable.pyi] |
| [out1] |
| tmp/a.py:2: note: Revealed type is "b.<callable subtype of Foo>" |
| [out2] |
| tmp/a.py:2: note: Revealed type is "b.<callable subtype of Foo>" |
| |
| [case testSerializeForwardReferenceToAliasInProperty] |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| reveal_type(b.A().p) |
| [file b.py] |
| |
| class A: |
| @property |
| def p(self) -> C: pass |
| @p.setter |
| def p(self, c: C) -> None: pass |
| @p.deleter |
| def p(self) -> None: pass |
| |
| C = str |
| [builtins fixtures/property.pyi] |
| [out2] |
| tmp/a.py:2: note: Revealed type is "builtins.str" |
| |
| [case testSerializeForwardReferenceToImportedAliasInProperty] |
| |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| reveal_type(b.A().p) |
| [file b.py] |
| class A: |
| @property |
| def p(self) -> C: pass |
| @p.setter |
| def p(self, c: C) -> None: pass |
| @p.deleter |
| def p(self) -> None: pass |
| |
| from m import C |
| [file m.py] |
| C = str |
| [builtins fixtures/property.pyi] |
| [out2] |
| tmp/a.py:2: note: Revealed type is "builtins.str" |
| |
| [case testSerializeNestedClassStuff] |
| # flags: --verbose |
| import a |
| [file a.py] |
| import b |
| [file a.py.2] |
| import b |
| # |
| [file b.py] |
| def foo() -> None: |
| class Foo: |
| class Bar: pass |
| |
| [case testSerializeGenericClassMethod] |
| import a |
| [file a.py] |
| import b |
| from typing import TypeVar |
| |
| T = TypeVar('T') |
| |
| class C: |
| @classmethod |
| def f(cls, x: T) -> T: ... |
| |
| x = C.f |
| [file b.py] |
| x = 1 |
| [file b.py.2] |
| x = 'yes' |
| [builtins fixtures/classmethod.pyi] |
| |
| [case testSerializeGenericAbstractMethod] |
| import a |
| [file a.py] |
| import b |
| from typing import TypeVar |
| from abc import abstractmethod |
| |
| T = TypeVar('T') |
| |
| class C: |
| @abstractmethod |
| def f(self, x: T) -> T: ... |
| |
| c: C |
| x = c.f |
| [file b.py] |
| x = 1 |
| [file b.py.2] |
| x = 'yes' |
| |
| [case testSerializeGenericNormalMethod] |
| import a |
| [file a.py] |
| import b |
| from typing import TypeVar |
| from abc import abstractmethod |
| |
| T = TypeVar('T') |
| |
| class C: |
| def f(self, x: T) -> T: ... |
| |
| c: C |
| x = c.f |
| [file b.py] |
| x = 1 |
| [file b.py.2] |
| x = 'yes' |