blob: 81da94c0591c6ce8772bc85a7839afdd741009bc [file] [log] [blame] [edit]
-- 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'