diff --git a/python/testData/inspections/PyTypeCheckerInspection/BadSubscriptExpression.py b/python/testData/inspections/PyTypeCheckerInspection/BadSubscriptExpression.py new file mode 100644 index 000000000000..c46bf665b27c --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/BadSubscriptExpression.py @@ -0,0 +1,4 @@ +def test(): + x = r"""\x"" + r"""[\t\r\v]""" + """ diff --git a/python/testData/inspections/PyTypeCheckerInspection/BuiltinFunctions.py b/python/testData/inspections/PyTypeCheckerInspection/BuiltinFunctions.py new file mode 100644 index 000000000000..9a261da172e7 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/BuiltinFunctions.py @@ -0,0 +1,5 @@ +def test(): + print(map(str, [1, 2, 3]) + ['foo']) #pass + print(map(lambda x: x.upper(), 'foo')) #pass + print(filter(lambda x: x % 2 == 0, [1, 2, 3]) + [4, 5, 6]) #pass + print(filter(lambda x: x != 'f', 'foo') + 'bar') #pass diff --git a/python/testData/inspections/PyTypeCheckerInspection/BuiltinNumeric.py b/python/testData/inspections/PyTypeCheckerInspection/BuiltinNumeric.py new file mode 100644 index 000000000000..6a68a41ff541 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/BuiltinNumeric.py @@ -0,0 +1,12 @@ +def test(): + abs(False) + int(10) + long(False) + float(False) + complex(False) + divmod(False, False) + divmod('foo', + u'bar') + pow(False, True) + round(False, + 'foo') diff --git a/python/testData/inspections/PyTypeCheckerInspection/ComparisonOperators.py b/python/testData/inspections/PyTypeCheckerInspection/ComparisonOperators.py new file mode 100644 index 000000000000..20b2f9d17358 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/ComparisonOperators.py @@ -0,0 +1,19 @@ +def test(): + def f(x): + """ + :type x: str + """ + pass + class C(object): + def __gt__(self, other): + return [] + o = object() + c = C() + f(1 < 2) + f(o == o) + f(o >= o) + f('foo' > o) + f(c < 1) + f(c > 1) + f(c == 1) + f(c in [1, 2, 3]) diff --git a/python/testData/inspections/PyTypeCheckerInspection/DictLiterals.py b/python/testData/inspections/PyTypeCheckerInspection/DictLiterals.py new file mode 100644 index 000000000000..5b55ba3c4a69 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/DictLiterals.py @@ -0,0 +1,10 @@ +def test(): + xs = {'foo': 1, 'bar': 2} + for v in xs.values(): + print(v + None) + for k in xs.keys(): + print(k + None) + for k in xs: + print(k + None) + ys = filter(lambda x: x, xs.keys()) + ys.append(0) diff --git a/python/testData/inspections/PyTypeCheckerInspection/FunctionAssignments.py b/python/testData/inspections/PyTypeCheckerInspection/FunctionAssignments.py new file mode 100644 index 000000000000..abc17391ec4f --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/FunctionAssignments.py @@ -0,0 +1,11 @@ +def test(): + def g(x): + """ + :type x: int + """ + return x + g("str") #fail + h = g + h("str") #fail + + diff --git a/python/testData/inspections/PyTypeCheckerInspection/Generator.py b/python/testData/inspections/PyTypeCheckerInspection/Generator.py new file mode 100644 index 000000000000..c2434456cc22 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/Generator.py @@ -0,0 +1,98 @@ +def test(): + def gen(n): + for x in xrange(n): + yield str(x) + def f_1(xs): + """ + :type xs: list of int + """ + return xs + def f_2(xs): + """ + :type xs: Sequence of int + """ + return xs + def f_3(xs): + """ + :type xs: Container of int + """ + return xs + def f_4(xs): + """ + :type xs: Iterator of int + """ + return xs + def f_5(xs): + """ + :type xs: Iterable of int + """ + return xs + def f_6(xs): + """ + :type xs: list + """ + return xs + def f_7(xs): + """ + :type xs: Sequence + """ + return xs + def f_8(xs): + """ + :type xs: Container + """ + return xs + def f_9(xs): + """ + :type xs: Iterator + """ + return xs + def f_10(xs): + """ + :type xs: Iterable + """ + return xs + def f_11(xs): + """ + :type xs: list of string + """ + return xs + def f_12(xs): + """ + :type xs: Sequence of string + """ + return xs + def f_13(xs): + """ + :type xs: Container of string + """ + return xs + def f_14(xs): + """ + :type xs: Iterator of string + """ + return xs + def f_15(xs): + """ + :type xs: Iterable of string + """ + return xs + return [ + ''.join(gen(10)), + f_1(gen(11)), + f_2(gen(11)), + f_3(gen(11)), + f_4(gen(11)), + f_5(gen(11)), + f_6(gen(11)), + f_7(gen(11)), + f_8(gen(11)), + f_9(gen(11)), + f_10(gen(11)), + f_11(gen(11)), + f_12(gen(11)), + f_13(gen(11)), + f_14(gen(11)), + f_15(gen(11)), + f_15('foo'.split('o')), + ] diff --git a/python/testData/inspections/PyTypeCheckerInspection/GenericUserFunctions.py b/python/testData/inspections/PyTypeCheckerInspection/GenericUserFunctions.py new file mode 100644 index 000000000000..f2a882768c90 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/GenericUserFunctions.py @@ -0,0 +1,46 @@ +def test(): + def f1(xs): + """ + :type xs: collections.Iterable of T + """ + return iter(xs).next() + + def f2(x, xs, z): + """ + :type x: T + :type xs: list of T + :type z: U + """ + return x in xs + + def id(x): + """ + :type x: T + :rtype: T + """ + return x + + def f3(x, y, z): + """ + :type x: T + :type y: U + :type z: V + """ + r1 = id(x) + r2 = id(y) + r3 = id(z) + return r1, r2, r3 + + def f4(x): + """ + :type x: (bool, int, str) + """ + + result = f1([1, 2, 3]) + print(result) + print(result + 'foo') + + f2(1, ['foo'], 'bar') + + result = f3(1, 'foo', True) + f4(result) diff --git a/python/testData/inspections/PyTypeCheckerInspection/IsInstanceImplicitSelfTypes.py b/python/testData/inspections/PyTypeCheckerInspection/IsInstanceImplicitSelfTypes.py new file mode 100644 index 000000000000..4af33b01c848 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/IsInstanceImplicitSelfTypes.py @@ -0,0 +1,4 @@ +def test(): + x = 1 + if isinstance(x, unicode): + x.encode('UTF-8') #pass diff --git a/python/testData/inspections/PyTypeCheckerInspection/ListTuple.py b/python/testData/inspections/PyTypeCheckerInspection/ListTuple.py new file mode 100644 index 000000000000..95306f40c8eb --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/ListTuple.py @@ -0,0 +1,11 @@ +def f(spam, eggs): + """ + :type spam: list of string + :type eggs: (bool, int, unicode) + """ + return spam, eggs + + +def test(): + f([1, 2, 3], + (False, 2, '')) diff --git a/python/testData/inspections/PyTypeCheckerInspection/LocalTypeResolve.py b/python/testData/inspections/PyTypeCheckerInspection/LocalTypeResolve.py new file mode 100644 index 000000000000..9d86b619c827 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/LocalTypeResolve.py @@ -0,0 +1,8 @@ +def test(): + class C(): + def f(self): + return 2 + c = C() + x = c.f() + y = x + return y + 'foo' diff --git a/python/testData/inspections/PyTypeCheckerInspection/NotNone.py b/python/testData/inspections/PyTypeCheckerInspection/NotNone.py new file mode 100644 index 000000000000..fa41abfeafdd --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/NotNone.py @@ -0,0 +1,31 @@ +def test(): + def f(x): + """ + :type x: int or str or list + """ + def f1(): + """ + :rtype: int or None + """ + def f2(): + """ + :rtype: int or str or None + """ + x1 = f1() + x2 = f2() + x3 = 1 + f(x1) + f(x2) + f(x3) + if x1: + f(x1) + if x2: + f(x2) + if x3: + f(x3) + if x1 is not None: + f(x1) + elif x2 is not None: + f(x2) + elif x3 is not None: + f(x3) diff --git a/python/testData/inspections/PyTypeCheckerInspection/OldStyleClasses.py b/python/testData/inspections/PyTypeCheckerInspection/OldStyleClasses.py new file mode 100644 index 000000000000..7d85c496714f --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/OldStyleClasses.py @@ -0,0 +1,9 @@ +def test_old_style_classes(): + class C: + pass + def f(x): + """ + :type x: object + """ + pass + f(C()) #pass diff --git a/python/testData/inspections/PyTypeCheckerInspection/OldTests.py b/python/testData/inspections/PyTypeCheckerInspection/OldTests.py deleted file mode 100644 index caebe6ac8f1b..000000000000 --- a/python/testData/inspections/PyTypeCheckerInspection/OldTests.py +++ /dev/null @@ -1,510 +0,0 @@ -def f1(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10=10, p11='11'): - """ - :type p1: integer - :type p2: integer - :type p3: float - :type p4: float - :type p5: int - :type p6: integer - :type p7: integer - :type p8: int - :type p9: int - :type p10: int - :type p11: string - """ - return p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10 + int(p11) - - -def test_1(): - p7 = int('7') - f1(1, - '2', - 3.0, 4, 5, int('6'), p7, p8=-8, - p9='foo', - p10='foo') - - -def str_to_none(b): - """ - :type b: str - """ - pass - - -def unicode_to_none(s): - """ - :type s: unicode - """ - pass - - -def string_to_none(s): - """ - :type s: string - """ - pass - - -def str_or_unicode_to_none(s): - """ - :type s: str or unicode - """ - pass - - -def test_str_unicode(): - b1 = 'hello' - s1 = u'привет' - b2 = str(-1) - s2 = unicode(3.14) - ENC = 'utf-8' - str_to_none(b1.decode(ENC)) - unicode_to_none(b1.decode(ENC)) - string_to_none(b1.decode(ENC)) - str_or_unicode_to_none(b1.decode(ENC)) - b1.encode(ENC) - s1.decode(ENC) - str_to_none(s1.encode(ENC)) - unicode_to_none(s1.encode(ENC)) - string_to_none(s1.encode(ENC)) - str_or_unicode_to_none(s1.encode(ENC)) - b2.decode(ENC) - b2.encode(ENC) - s2.decode(ENC) - s2.encode(ENC) - - -def f_list_tuple(spam, eggs): - """ - :type spam: list of string - :type eggs: (bool, int, unicode) - """ - return spam, eggs - - -def test_list_tuple(): - f_list_tuple([1, 2, 3], - (False, 2, '')) - - -def test_builtin_numerics(): - abs(False) - int(10) - long(False) - float(False) - complex(False) - divmod(False, False) - divmod('foo', - u'bar') - pow(False, True) - round(False, - 'foo') - - -def test_generator(): - def gen(n): - for x in xrange(n): - yield str(x) - def f_1(xs): - """ - :type xs: list of int - """ - return xs - def f_2(xs): - """ - :type xs: Sequence of int - """ - return xs - def f_3(xs): - """ - :type xs: Container of int - """ - return xs - def f_4(xs): - """ - :type xs: Iterator of int - """ - return xs - def f_5(xs): - """ - :type xs: Iterable of int - """ - return xs - def f_6(xs): - """ - :type xs: list - """ - return xs - def f_7(xs): - """ - :type xs: Sequence - """ - return xs - def f_8(xs): - """ - :type xs: Container - """ - return xs - def f_9(xs): - """ - :type xs: Iterator - """ - return xs - def f_10(xs): - """ - :type xs: Iterable - """ - return xs - def f_11(xs): - """ - :type xs: list of string - """ - return xs - def f_12(xs): - """ - :type xs: Sequence of string - """ - return xs - def f_13(xs): - """ - :type xs: Container of string - """ - return xs - def f_14(xs): - """ - :type xs: Iterator of string - """ - return xs - def f_15(xs): - """ - :type xs: Iterable of string - """ - return xs - return [ - ''.join(gen(10)), - f_1(gen(11)), - f_2(gen(11)), - f_3(gen(11)), - f_4(gen(11)), - f_5(gen(11)), - f_6(gen(11)), - f_7(gen(11)), - f_8(gen(11)), - f_9(gen(11)), - f_10(gen(11)), - f_11(gen(11)), - f_12(gen(11)), - f_13(gen(11)), - f_14(gen(11)), - f_15(gen(11)), - f_15('foo'.split('o')), - ] - - -# PY-4025 -def test_function_assignments(): - def g(x): - """ - :type x: int - """ - return x - g("str") #fail - h = g - h("str") #fail - - -def test_old_style_classes(): - class C: - pass - def f(x): - """ - :type x: object - """ - pass - f(C()) #pass - - -def test_partly_unknown_type(): - def f(): - """ - :rtype: None or unknown or int or long - """ - def g(x): - """ - :type x: object - """ - g(f()) - - -def test_type_assertions(): - def f_1(): - """ - :rtype: int or str or None - """ - def f_2(): - """ - :rtype: int or None - """ - def f_3(): - """ - :rtype: unknown - """ - def f_4(): - """ - :rtype: object - """ - def f_5(): - """ - :rtype: int or object - """ - def f_6(): - """ - :rtype: int or unknown or float - """ - def f_7(): - """ - :rtype: int or unknown - """ - def print_int(x): - """ - :type x: int - """ - print(x) - def print_int_or_str(x): - """ - :type x: int or str - """ - x_1 = f_1() - print_int(x_1) - print_int_or_str(x_1) - if isinstance(x_1, int): - print_int(x_1) - if isinstance(x_1, str): - print_int_or_str(x_1) - x_7 = f_7() - print_int(x_7) - - -def test_local_type_resolve(): - class C(): - def f(self): - return 2 - c = C() - x = c.f() - y = x - return y + 'foo' - - -def test_subscription(): - def f(x): - """ - :type x: str - """ - class C(object): - def __getitem__(self, item): - """ - :type item: str - :rtype: int - """ - xs = [1, 2, 3] - x = xs[0] - f(x) - c = C() - c_0 = c[0] - f(c_0) - - -def test_comparison_operators(): - def f(x): - """ - :type x: str - """ - pass - class C(object): - def __gt__(self, other): - return [] - o = object() - c = C() - f(1 < 2) - f(o == o) - f(o >= o) - f('foo' > o) - f(c < 1) - f(c > 1) - f(c == 1) - f(c in [1, 2, 3]) - - -def test_right_operators(): - o = object() - xs = [ - o * [], - ] - - -def test_string_integer(): - print('foo' + 'bar') - print(2 + 3) - print('foo' + 3) - print(3 + 'foo') - print('foo' + 'bar' * 3) - print('foo' + 3 * 'bar') - print('foo' + 2 * 3) - - -def test_isinstance_implicit_self_types(): - x = 1 - if isinstance(x, unicode): - x.encode('UTF-8') #pass - - -def test_not_none(): - def test(x): - """ - :type x: int or str or list - """ - def f1(): - """ - :rtype: int or None - """ - def f2(): - """ - :rtype: int or str or None - """ - x1 = f1() - x2 = f2() - x3 = 1 - test(x1) - test(x2) - test(x3) - if x1: - test(x1) - if x2: - test(x2) - if x3: - test(x3) - if x1 is not None: - test(x1) - elif x2 is not None: - test(x2) - elif x3 is not None: - test(x3) - - -def test_builtin_functions(): - print(map(str, [1, 2, 3]) + ['foo']) #pass - print(map(lambda x: x.upper(), 'foo')) #pass - print(filter(lambda x: x % 2 == 0, [1, 2, 3]) + [4, 5, 6]) #pass - print(filter(lambda x: x != 'f', 'foo') + 'bar') #pass - - -def test_union_return_types(): - def f1(c): - if c < 0: - return [] - elif c > 0: - return 'foo' - else: - return None - def f2(x): - """ - :type x: str - """ - pass - def f3(x): - """ - :type x: int - """ - x1 = f1(42) - f2(x1) - f3(x1) - - f2(x1.count('')) - f3(x1.count('')) - f2(x1.strip()) - f3(x1.strip()) - - -def test_generic_user_functions(): - def f1(xs): - """ - :type xs: collections.Iterable of T - """ - return iter(xs).next() - - def f2(x, xs, z): - """ - :type x: T - :type xs: list of T - :type z: U - """ - return x in xs - - def id(x): - """ - :type x: T - :rtype: T - """ - return x - - def f3(x, y, z): - """ - :type x: T - :type y: U - :type z: V - """ - r1 = id(x) - r2 = id(y) - r3 = id(z) - return r1, r2, r3 - - def f4(x): - """ - :type x: (bool, int, str) - """ - - result = f1([1, 2, 3]) - print(result) - print(result + 'foo') - - f2(1, ['foo'], 'bar') - - result = f3(1, 'foo', True) - f4(result) - - -# PY-5474 -def test_bad_subsription_expr(): - x = r"""\x"" - r"""[\t\r\v]""" - """ - - -# PY-5873 -def test_type_of_raise_exception(): - def f1(x): - """ - :type x: int - """ - pass - - class C: - def f(self): - raise NotImplementedError() - - x = C() - f1(x.f()) - - -# PY-6542 -def test_dict_literals(): - xs = {'foo': 1, 'bar': 2} - for v in xs.values(): - print(v + None) - for k in xs.keys(): - print(k + None) - for k in xs: - print(k + None) - ys = filter(lambda x: x, xs.keys()) - ys.append(0) - diff --git a/python/testData/inspections/PyTypeCheckerInspection/PartlyUnknownType.py b/python/testData/inspections/PyTypeCheckerInspection/PartlyUnknownType.py new file mode 100644 index 000000000000..9d00032de8f8 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/PartlyUnknownType.py @@ -0,0 +1,10 @@ +def test(): + def f(): + """ + :rtype: None or unknown or int or long + """ + def g(x): + """ + :type x: object + """ + g(f()) diff --git a/python/testData/inspections/PyTypeCheckerInspection/RightOperators.py b/python/testData/inspections/PyTypeCheckerInspection/RightOperators.py new file mode 100644 index 000000000000..465db07b7514 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/RightOperators.py @@ -0,0 +1,5 @@ +def test_right_operators(): + o = object() + xs = [ + o * [], + ] diff --git a/python/testData/inspections/PyTypeCheckerInspection/Simple.py b/python/testData/inspections/PyTypeCheckerInspection/Simple.py new file mode 100644 index 000000000000..8d0f516dc315 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/Simple.py @@ -0,0 +1,24 @@ +def f1(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10=10, p11='11'): + """ + :type p1: integer + :type p2: integer + :type p3: float + :type p4: float + :type p5: int + :type p6: integer + :type p7: integer + :type p8: int + :type p9: int + :type p10: int + :type p11: string + """ + return p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10 + int(p11) + + +def test(): + p7 = int('7') + f1(1, + '2', + 3.0, 4, 5, int('6'), p7, p8=-8, + p9='foo', + p10='foo') diff --git a/python/testData/inspections/PyTypeCheckerInspection/StrUnicode.py b/python/testData/inspections/PyTypeCheckerInspection/StrUnicode.py new file mode 100644 index 000000000000..24869b10e77b --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/StrUnicode.py @@ -0,0 +1,48 @@ +def str_to_none(b): + """ + :type b: str + """ + pass + + +def unicode_to_none(s): + """ + :type s: unicode + """ + pass + + +def string_to_none(s): + """ + :type s: string + """ + pass + + +def str_or_unicode_to_none(s): + """ + :type s: str or unicode + """ + pass + + +def test(): + b1 = 'hello' + s1 = u'привет' + b2 = str(-1) + s2 = unicode(3.14) + ENC = 'utf-8' + str_to_none(b1.decode(ENC)) + unicode_to_none(b1.decode(ENC)) + string_to_none(b1.decode(ENC)) + str_or_unicode_to_none(b1.decode(ENC)) + b1.encode(ENC) + s1.decode(ENC) + str_to_none(s1.encode(ENC)) + unicode_to_none(s1.encode(ENC)) + string_to_none(s1.encode(ENC)) + str_or_unicode_to_none(s1.encode(ENC)) + b2.decode(ENC) + b2.encode(ENC) + s2.decode(ENC) + s2.encode(ENC) diff --git a/python/testData/inspections/PyTypeCheckerInspection/StringInteger.py b/python/testData/inspections/PyTypeCheckerInspection/StringInteger.py new file mode 100644 index 000000000000..a551543eddec --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/StringInteger.py @@ -0,0 +1,8 @@ +def test(): + print('foo' + 'bar') + print(2 + 3) + print('foo' + 3) + print(3 + 'foo') + print('foo' + 'bar' * 3) + print('foo' + 3 * 'bar') + print('foo' + 2 * 3) diff --git a/python/testData/inspections/PyTypeCheckerInspection/Subscript.py b/python/testData/inspections/PyTypeCheckerInspection/Subscript.py new file mode 100644 index 000000000000..0a3ffe35fe3d --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/Subscript.py @@ -0,0 +1,17 @@ +def test(): + def f(x): + """ + :type x: str + """ + class C(object): + def __getitem__(self, item): + """ + :type item: str + :rtype: int + """ + xs = [1, 2, 3] + x = xs[0] + f(x) + c = C() + c_0 = c[0] + f(c_0) diff --git a/python/testData/inspections/PyTypeCheckerInspection/TypeAssertions.py b/python/testData/inspections/PyTypeCheckerInspection/TypeAssertions.py new file mode 100644 index 000000000000..11f268a00509 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/TypeAssertions.py @@ -0,0 +1,47 @@ +def test(): + def f_1(): + """ + :rtype: int or str or None + """ + def f_2(): + """ + :rtype: int or None + """ + def f_3(): + """ + :rtype: unknown + """ + def f_4(): + """ + :rtype: object + """ + def f_5(): + """ + :rtype: int or object + """ + def f_6(): + """ + :rtype: int or unknown or float + """ + def f_7(): + """ + :rtype: int or unknown + """ + def print_int(x): + """ + :type x: int + """ + print(x) + def print_int_or_str(x): + """ + :type x: int or str + """ + x_1 = f_1() + print_int(x_1) + print_int_or_str(x_1) + if isinstance(x_1, int): + print_int(x_1) + if isinstance(x_1, str): + print_int_or_str(x_1) + x_7 = f_7() + print_int(x_7) diff --git a/python/testData/inspections/PyTypeCheckerInspection/TypeOfRaiseException.py b/python/testData/inspections/PyTypeCheckerInspection/TypeOfRaiseException.py new file mode 100644 index 000000000000..f1b110f0b5d2 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/TypeOfRaiseException.py @@ -0,0 +1,13 @@ +def test(): + def f1(x): + """ + :type x: int + """ + pass + + class C: + def f(self): + raise NotImplementedError() + + x = C() + f1(x.f()) diff --git a/python/testData/inspections/PyTypeCheckerInspection/UnionReturnTypes.py b/python/testData/inspections/PyTypeCheckerInspection/UnionReturnTypes.py new file mode 100644 index 000000000000..f32cd95e5f0c --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/UnionReturnTypes.py @@ -0,0 +1,25 @@ +def test(): + def f1(c): + if c < 0: + return [] + elif c > 0: + return 'foo' + else: + return None + def f2(x): + """ + :type x: str + """ + pass + def f3(x): + """ + :type x: int + """ + x1 = f1(42) + f2(x1) + f3(x1) + + f2(x1.count('')) + f3(x1.count('')) + f2(x1.strip()) + f3(x1.strip()) diff --git a/python/testSrc/com/jetbrains/python/inspections/PyTypeCheckerInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyTypeCheckerInspectionTest.java index 4321691d85d4..de9ed8955a9e 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyTypeCheckerInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyTypeCheckerInspectionTest.java @@ -12,8 +12,76 @@ public class PyTypeCheckerInspectionTest extends PyTestCase { myFixture.checkHighlighting(true, false, true); } - public void testOldTests() { - // TODO: Split these tests into files + public void testSimple() { + doTest(); + } + + public void testStrUnicode() { + doTest(); + } + + public void testListTuple() { + doTest(); + } + + public void testBuiltinNumeric() { + doTest(); + } + + public void testGenerator() { + doTest(); + } + + // PY-4025 + public void testFunctionAssignments() { + doTest(); + } + + public void testOldStyleClasses() { + doTest(); + } + + public void testPartlyUnknownType() { + doTest(); + } + + public void testTypeAssertions() { + doTest(); + } + + public void testLocalTypeResolve() { + doTest(); + } + + public void testSubscript() { + doTest(); + } + + public void testComparisonOperators() { + doTest(); + } + + public void testRightOperators() { + doTest(); + } + + public void testStringInteger() { + doTest(); + } + + public void testIsInstanceImplicitSelfTypes() { + doTest(); + } + + public void testNotNone() { + doTest(); + } + + public void testBuiltinFunctions() { + doTest(); + } + + public void testUnionReturnTypes() { doTest(); } @@ -21,6 +89,10 @@ public class PyTypeCheckerInspectionTest extends PyTestCase { doTest(); } + public void testGenericUserFunctions() { + doTest(); + } + public void testGenericUserClasses() { doTest(); } @@ -29,6 +101,21 @@ public class PyTypeCheckerInspectionTest extends PyTestCase { doTest(); } + // PY-5474 + public void testBadSubscriptExpression() { + doTest(); + } + + // PY-5873 + public void testTypeOfRaiseException() { + doTest(); + } + + // PY-6542 + public void testDictLiterals() { + doTest(); + } + // PY-6570 public void testDictLiteralIndexing() { doTest();