blob: 2267cadb1a087c8c6ce4e9c5a4eaa7e19c1d397d [file] [log] [blame] [edit]
-- Test cases for type checking mypy programs using full stubs and running
-- using CPython (Python 2 mode).
--
-- These are mostly regression tests -- no attempt is made to make these
-- complete.
[case testAbs2_python2]
n = None # type: int
f = None # type: float
n = abs(1)
abs(1) + 'x' # Error
f = abs(1.1)
abs(1.1) + 'x' # Error
[out]
_program.py:4: error: Unsupported operand types for + ("int" and "str")
_program.py:6: error: Unsupported operand types for + ("float" and "str")
[case testUnicode_python2]
x = unicode('xyz', 'latin1')
print x
x = u'foo'
print repr(x)
[out]
xyz
u'foo'
[case testXrangeAndRange_python2]
for i in xrange(2):
print i
for i in range(3):
print i
[out]
0
1
0
1
2
[case testIterator_python2]
import typing, sys
x = iter('bar')
print x.next(), x.next()
[out]
b a
[case testEncodeAndDecode_python2]
print 'a'.encode('latin1')
print 'b'.decode('latin1')
print u'c'.encode('latin1')
print u'd'.decode('latin1')
[out]
a
b
c
d
[case testHasKey_python2]
d = {1: 'x'}
print d.has_key(1)
print d.has_key(2)
[out]
True
False
[case testIntegerDivision_python2]
x = 1 / 2
x()
[out]
_program.py:2: error: "int" not callable
[case testFloatDivision_python2]
x = 1.0 / 2.0
x = 1.0 / 2
x = 1 / 2.0
x = 1.5
[out]
[case testAnyStr_python2]
from typing import AnyStr
def f(x): # type: (AnyStr) -> AnyStr
if isinstance(x, str):
return 'foo'
else:
return u'zar'
print f('')
print f(u'')
[out]
foo
zar
[case testGenericPatterns_python2]
from typing import Pattern
import re
p = None # type: Pattern[unicode]
p = re.compile(u'foo*')
b = None # type: Pattern[str]
b = re.compile('foo*')
print(p.match(u'fooo').group(0))
[out]
fooo
[case testGenericMatch_python2]
from typing import Match
import re
def f(m): # type: (Match[str]) -> None
print(m.group(0))
f(re.match('x*', 'xxy'))
[out]
xx
[case testFromFuturePrintFunction_python2]
from __future__ import print_function
print('a', 'b')
[out]
a b
[case testFromFutureImportUnicodeLiterals_python2]
from __future__ import unicode_literals
print '>', ['a', b'b', u'c']
[out]
> [u'a', 'b', u'c']
[case testUnicodeLiteralsKwargs_python2]
from __future__ import unicode_literals
def f(**kwargs): # type: (...) -> None
pass
params = {'a': 'b'}
f(**params)
[out]
[case testUnicodeStringKwargs_python2]
def f(**kwargs): # type: (...) -> None
pass
params = {u'a': 'b'}
f(**params)
[out]
[case testStrKwargs_python2]
def f(**kwargs): # type: (...) -> None
pass
params = {'a': 'b'}
f(**params)
[out]
[case testFromFutureImportUnicodeLiterals2_python2]
from __future__ import unicode_literals
def f(x): # type: (str) -> None
pass
f(b'')
f(u'')
f('')
[out]
_program.py:5: error: Argument 1 to "f" has incompatible type "unicode"; expected "str"
_program.py:6: error: Argument 1 to "f" has incompatible type "unicode"; expected "str"
[case testStrUnicodeCompatibility_python2]
def f(s): # type: (unicode) -> None
pass
f(u'')
f('')
[out]
[case testStrUnicodeCompatibilityInBuiltins_python2]
'x'.count('x')
'x'.count(u'x')
[out]
[case testTupleAsSubtypeOfSequence_python2]
from typing import TypeVar, Sequence
T = TypeVar('T')
def f(a): # type: (Sequence[T]) -> None
print a
f(tuple())
[out]
()
[case testIOTypes_python2]
from typing import IO, TextIO, BinaryIO, Any
class X(IO[str]): pass
class Y(TextIO): pass
class Z(BinaryIO): pass
[out]
[case testOpenReturnType_python2]
import typing
f = open('/tmp/xyz', 'w')
f.write(u'foo')
f.write('bar')
f.close()
[out]
_program.py:3: error: Argument 1 to "write" of "IO" has incompatible type "unicode"; expected "str"
[case testPrintFunctionWithFileArg_python2]
from __future__ import print_function
import typing
if 1 == 2: # Don't want to run the code below, since it would create a file.
f = open('/tmp/xyz', 'w')
print('foo', file=f)
f.close()
print('ok')
[out]
ok
[case testStringIO_python2]
import typing
import io
c = io.StringIO()
c.write(u'\x89')
print(repr(c.getvalue()))
[out]
u'\x89'
[case testBytesIO_python2]
import typing
import io
c = io.BytesIO()
c.write('\x89')
print(repr(c.getvalue()))
[out]
'\x89'
[case testTextIOWrapper_python2]
import typing
import io
b = io.BytesIO(u'\xab'.encode('utf8'))
w = io.TextIOWrapper(b, encoding='utf8')
print(repr(w.read()))
[out]
u'\xab'
[case testIoOpen_python2]
import typing
import io
if 1 == 2: # Only type check, do not execute
f = io.open('/tmp/xyz', 'w', encoding='utf8')
f.write(u'\xab')
f.close()
print 'ok'
[out]
ok
[case testStrAdd_python2]
import typing
s = ''
u = u''
n = 0
if int():
n = s + '' # E
s = s + u'' # E
[out]
_program.py:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")
_program.py:7: error: Incompatible types in assignment (expression has type "unicode", variable has type "str")
[case testStrJoin_python2]
s = ''
u = u''
n = 0
if int():
n = ''.join(['']) # Error
if int():
s = ''.join([u'']) # Error
[out]
_program.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
_program.py:7: error: Incompatible types in assignment (expression has type "unicode", variable has type "str")
[case testNamedTuple_python2]
from typing import NamedTuple
from collections import namedtuple
X = namedtuple('X', ['a', 'b'])
x = X(a=1, b='s')
x.c
x.a
N = NamedTuple(u'N', [(u'x', int)])
n = namedtuple(u'n', u'x y')
[out]
_program.py:5: error: "X" has no attribute "c"
[case testAssignToComplexReal_python2]
import typing
x = 4j
y = x.real
if int():
y = x # Error
x.imag = 2.0 # Error
[out]
_program.py:5: error: Incompatible types in assignment (expression has type "complex", variable has type "float")
_program.py:6: error: Property "imag" defined in "complex" is read-only
[case testComplexArithmetic_python2]
import typing
print 5 + 8j
print 3j * 2.0
print 4j / 2.0
[out]
(5+8j)
6j
2j
[case testSuperNew_python2]
from typing import Dict, Any
class MyType(type):
def __new__(cls, name, bases, namespace):
# type: (str, tuple, Dict[str, Any]) -> Any
return super(MyType, cls).__new__(cls, name + 'x', bases, namespace)
class A(object):
__metaclass__ = MyType
print(type(A()).__name__)
[out]
Ax
[case testUnicodeAndOverloading_python2]
from m import f
f(1)
f('')
f(u'')
f(b'')
[file m.pyi]
from typing import overload
@overload
def f(x): # type: (bytearray) -> int
pass
@overload
def f(x): # type: (unicode) -> int
pass
[out]
_program.py:2: error: No overload variant of "f" matches argument type "int"
_program.py:2: note: Possible overload variants:
_program.py:2: note: def f(x: bytearray) -> int
_program.py:2: note: def f(x: unicode) -> int
[case testByteArrayStrCompatibility_python2]
def f(x): # type: (str) -> None
pass
f(bytearray('foo'))
[case testAbstractProperty_python2]
from abc import abstractproperty, ABCMeta
class A:
__metaclass__ = ABCMeta
@abstractproperty
def x(self): # type: () -> int
pass
class B(A):
@property
def x(self): # type: () -> int
return 3
b = B()
print b.x + 1
[out]
4
[case testReModuleBytes_python2]
# Regression tests for various overloads in the re module -- bytes version
import re
if False:
bre = b'a+'
bpat = re.compile(bre)
bpat = re.compile(bpat)
re.search(bre, b'').groups()
re.search(bre, u'')
re.search(bpat, b'').groups()
re.search(bpat, u'')
# match(), split(), findall(), finditer() are much the same, so skip those.
# sub(), subn() have more overloads and we are checking these:
re.sub(bre, b'', b'') + b''
re.sub(bpat, b'', b'') + b''
re.sub(bre, lambda m: b'', b'') + b''
re.sub(bpat, lambda m: b'', b'') + b''
re.subn(bre, b'', b'')[0] + b''
re.subn(bpat, b'', b'')[0] + b''
re.subn(bre, lambda m: b'', b'')[0] + b''
re.subn(bpat, lambda m: b'', b'')[0] + b''
[out]
[case testReModuleString_python2]
# Regression tests for various overloads in the re module -- string version
import re
ure = u'a+'
upat = re.compile(ure)
upat = re.compile(upat)
re.search(ure, u'a').groups()
re.search(ure, b'') # This ought to be an error, but isn't because of bytes->unicode equivalence
re.search(upat, u'a').groups()
re.search(upat, b'') # This ought to be an error, but isn't because of bytes->unicode equivalence
# match(), split(), findall(), finditer() are much the same, so skip those.
# sus(), susn() have more overloads and we are checking these:
re.sub(ure, u'', u'') + u''
re.sub(upat, u'', u'') + u''
re.sub(ure, lambda m: u'', u'') + u''
re.sub(upat, lambda m: u'', u'') + u''
re.subn(ure, u'', u'')[0] + u''
re.subn(upat, u'', u'')[0] + u''
re.subn(ure, lambda m: u'', u'')[0] + u''
re.subn(upat, lambda m: u'', u'')[0] + u''
[out]
[case testYieldRegressionTypingAwaitable_python2]
# Make sure we don't reference typing.Awaitable in Python 2 mode.
def g(): # type: () -> int
yield
[out]
_program.py:2: error: The return type of a generator function should be "Generator" or one of its supertypes
[case testOsPathJoinWorksWithAny_python2]
import os
def f(): # no annotation
return 'tests'
path = 'test'
path = os.path.join(f(), 'test.py')
[out]
[case testBytesWorkInPython2WithFullStubs_python2]
MYPY = False
if MYPY:
import lib
[file lib.pyi]
x = b'abc'
[out]
[case testNestedGenericFailedInference]
from collections import defaultdict
def foo() -> None:
x = defaultdict(list) # type: ignore
x['lol'].append(10)
reveal_type(x)
[out]
_testNestedGenericFailedInference.py:5: note: Revealed type is 'collections.defaultdict[Any, builtins.list[Any]]'