From efa754c2c93b5711ab2a2af21230bfc97aeae9ee Mon Sep 17 00:00:00 2001 From: David Fisher Date: Thu, 18 Aug 2016 16:55:06 -0700 Subject: [PATCH] Add more truthiness tests --- test-data/unit/check-expressions.test | 8 ++++++-- test-data/unit/check-isinstance.test | 21 +++++++++++++++++++++ test-data/unit/check-optional.test | 24 ++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/test-data/unit/check-expressions.test b/test-data/unit/check-expressions.test index ccd4ee9ef402..2b29047cc7e4 100644 --- a/test-data/unit/check-expressions.test +++ b/test-data/unit/check-expressions.test @@ -310,8 +310,6 @@ i = None # type: str j = not b and i if j: reveal_type(j) # E: Revealed type is 'builtins.str' - - [builtins fixtures/bool.pyi] [case testRestrictedTypeOr] @@ -321,7 +319,13 @@ i = None # type: str j = b or i if not j: reveal_type(j) # E: Revealed type is 'builtins.str' +[builtins fixtures/bool.pyi] + +[case testAndOr] +s = "" +b = bool() +reveal_type(s and b or b) # E: Revealed type is 'builtins.bool' [builtins fixtures/bool.pyi] [case testNonBooleanOr] diff --git a/test-data/unit/check-isinstance.test b/test-data/unit/check-isinstance.test index 8dab0aa9116a..aae773b47c1c 100644 --- a/test-data/unit/check-isinstance.test +++ b/test-data/unit/check-isinstance.test @@ -1165,3 +1165,24 @@ reveal_type(l) # E: Revealed type is 'builtins.list[builtins.int*]' reveal_type(g) # E: Revealed type is 'typing.Iterator[builtins.int*]' reveal_type(d) # E: Revealed type is 'builtins.dict[builtins.int*, builtins.int*]' [builtins fixtures/isinstancelist.pyi] + +[case testIsinstanceInWrongOrderInBooleanOp] +class A: + m = 1 +def f(x: object) -> None: + if x.m and isinstance(x, A) or False: # E: "object" has no attribute "m" + pass +[builtins fixtures/isinstance.pyi] +[out] +main: note: In function "f": + +[case testIsinstanceAndOr] +class A: + a = None # type: A + +def f(x: object) -> None: + b = isinstance(x, A) and x.a or A() + reveal_type(b) # E: Revealed type is '__main__.A' +[builtins fixtures/isinstance.pyi] +[out] +main: note: In function "f": diff --git a/test-data/unit/check-optional.test b/test-data/unit/check-optional.test index 8d0ec479bf49..1034740db708 100644 --- a/test-data/unit/check-optional.test +++ b/test-data/unit/check-optional.test @@ -77,6 +77,30 @@ else: reveal_type(x) # E: Revealed type is 'builtins.int' [builtins fixtures/bool.pyi] +[case testOrCases] +from typing import Optional +x = None # type: Optional[str] +y1 = x or 'a' +reveal_type(y1) # E: Revealed type is 'builtins.str' +y2 = x or 1 +reveal_type(y2) # E: Revealed type is 'Union[builtins.str, builtins.int]' +z1 = 'a' or x +reveal_type(z1) # E: Revealed type is 'Union[builtins.str, builtins.None]' +z2 = 1 or x +reveal_type(z2) # E: Revealed type is 'Union[builtins.int, builtins.str, builtins.None]' + +[case testAndCases] +from typing import Optional +x = None # type: Optional[str] +y1 = x and 'b' +reveal_type(y1) # E: Revealed type is 'Union[builtins.str, builtins.None]' +y2 = x and 1 # x could be '', so... +reveal_type(y2) # E: Revealed type is 'Union[builtins.str, builtins.None, builtins.int]' +z1 = 'b' and x +reveal_type(z1) # E: Revealed type is 'Union[builtins.str, builtins.None]' +z2 = 1 and x +reveal_type(z2) # E: Revealed type is 'Union[builtins.int, builtins.str, builtins.None]' + [case testLambdaReturningNone] f = lambda: None x = f()