From bd2bdb0941fadd175b6e20e1e198be9bcbddad81 Mon Sep 17 00:00:00 2001 From: Adrian Freund Date: Sat, 1 May 2021 14:03:11 +0200 Subject: [PATCH 1/6] Add tests for make_simplified_union --- mypy/test/testtypes.py | 47 ++++++++++++++++++++++++++++------------ mypy/test/typefixture.py | 9 +++++++- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/mypy/test/testtypes.py b/mypy/test/testtypes.py index c65bfc7b9418..57c948d28c68 100644 --- a/mypy/test/testtypes.py +++ b/mypy/test/testtypes.py @@ -18,7 +18,7 @@ from mypy.subtypes import is_subtype, is_more_precise, is_proper_subtype from mypy.test.typefixture import TypeFixture, InterfaceTypeFixture from mypy.state import strict_optional_set -from mypy.typeops import true_only, false_only +from mypy.typeops import true_only, false_only, make_simplified_union class TypesSuite(Suite): @@ -299,9 +299,9 @@ def test_is_proper_subtype_invariance(self) -> None: def test_is_proper_subtype_and_subtype_literal_types(self) -> None: fx = self.fx - lit1 = LiteralType(1, fx.a) - lit2 = LiteralType("foo", fx.d) - lit3 = LiteralType("bar", fx.d) + lit1 = fx.lit1 + lit2 = fx.lit2 + lit3 = fx.lit3 assert_true(is_proper_subtype(lit1, fx.a)) assert_false(is_proper_subtype(lit1, fx.d)) @@ -451,6 +451,26 @@ def test_false_only_of_union(self) -> None: assert_true(fo.items[0].can_be_false) assert_true(fo.items[1] is tup_type) + def test_simplified_union(self) -> None: + fx = self.fx + + self.assert_simplified_union([fx.a, fx.a], fx.a) + self.assert_simplified_union([fx.a, fx.b], fx.a) + self.assert_simplified_union([fx.a, fx.d], UnionType([fx.a, fx.d])) + self.assert_simplified_union([fx.a, fx.uninhabited], fx.a) + self.assert_simplified_union([fx.ga, fx.gs2a], fx.ga) + self.assert_simplified_union([fx.ga, fx.gsab], UnionType([fx.ga, fx.gsab])) + self.assert_simplified_union([fx.ga, fx.gsba], fx.ga) + self.assert_simplified_union([fx.a, UnionType([fx.d])], UnionType([fx.a, fx.d])) + self.assert_simplified_union([fx.a, UnionType([fx.a])], fx.a) + self.assert_simplified_union([fx.b, UnionType([fx.c, UnionType([fx.d])])], UnionType([fx.b, fx.c, fx.d])) + self.assert_simplified_union([fx.lit1, fx.lit2], UnionType([fx.lit1, fx.lit2])) + self.assert_simplified_union([fx.lit1, fx.lit3], UnionType([fx.lit1, fx.lit3])) + self.assert_simplified_union([fx.lit1, fx.uninhabited], fx.lit1) + + def assert_simplified_union(self, original: List[Type], union: Type) -> None: + assert_equal(make_simplified_union(original), union) + # Helpers def tuple(self, *a: Type) -> TupleType: @@ -723,9 +743,9 @@ def test_type_type(self) -> None: def test_literal_type(self) -> None: a = self.fx.a d = self.fx.d - lit1 = LiteralType(1, a) - lit2 = LiteralType(2, a) - lit3 = LiteralType("foo", d) + lit1 = self.fx.lit1 + lit2 = self.fx.lit2 + lit3 = self.fx.lit3 self.assert_join(lit1, lit1, lit1) self.assert_join(lit1, a, a) @@ -952,9 +972,9 @@ def test_type_type(self) -> None: def test_literal_type(self) -> None: a = self.fx.a d = self.fx.d - lit1 = LiteralType(1, a) - lit2 = LiteralType(2, a) - lit3 = LiteralType("foo", d) + lit1 = self.fx.lit1 + lit2 = self.fx.lit2 + lit3 = self.fx.lit3 self.assert_meet(lit1, lit1, lit1) self.assert_meet(lit1, a, lit1) @@ -1011,11 +1031,10 @@ def setUp(self) -> None: def test_literal_type(self) -> None: b = self.fx.b # Reminder: b is a subclass of a - d = self.fx.d - lit1 = LiteralType(1, b) - lit2 = LiteralType(2, b) - lit3 = LiteralType("foo", d) + lit1 = self.fx.lit1 + lit2 = self.fx.lit2 + lit3 = self.fx.lit3 self.assert_same(lit1, lit1) self.assert_same(UnionType([lit1, lit2]), UnionType([lit1, lit2])) diff --git a/mypy/test/typefixture.py b/mypy/test/typefixture.py index b29f7164c911..753462ca218f 100644 --- a/mypy/test/typefixture.py +++ b/mypy/test/typefixture.py @@ -7,7 +7,7 @@ from mypy.types import ( Type, TypeVarType, AnyType, NoneType, Instance, CallableType, TypeVarDef, TypeType, - UninhabitedType, TypeOfAny, TypeAliasType, UnionType + UninhabitedType, TypeOfAny, TypeAliasType, UnionType, LiteralType ) from mypy.nodes import ( TypeInfo, ClassDef, Block, ARG_POS, ARG_OPT, ARG_STAR, SymbolTable, @@ -149,6 +149,13 @@ def make_type_var(name: str, id: int, values: List[Type], upper_bound: Type, self.lsta = Instance(self.std_listi, [self.a]) # List[A] self.lstb = Instance(self.std_listi, [self.b]) # List[B] + self.lit1 = LiteralType(1, self.a) + self.lit2 = LiteralType(2, self.a) + self.lit3 = LiteralType("foo", self.d) + self.lit1_inst = Instance(self.ai, [], last_known_value=self.lit1) + self.lit2_inst = Instance(self.ai, [], last_known_value=self.lit2) + self.lit3_inst = Instance(self.di, [], last_known_value=self.lit3) + self.type_a = TypeType.make_normalized(self.a) self.type_b = TypeType.make_normalized(self.b) self.type_c = TypeType.make_normalized(self.c) From 4139d7c1ca45b5c67b318a45ce6bc9dceca4d70b Mon Sep 17 00:00:00 2001 From: Adrian Freund Date: Sat, 1 May 2021 14:53:19 +0200 Subject: [PATCH 2/6] Fixed coding style violations --- mypy/test/testtypes.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mypy/test/testtypes.py b/mypy/test/testtypes.py index 57c948d28c68..302b76a280d4 100644 --- a/mypy/test/testtypes.py +++ b/mypy/test/testtypes.py @@ -11,8 +11,7 @@ from mypy.indirection import TypeIndirectionVisitor from mypy.types import ( UnboundType, AnyType, CallableType, TupleType, TypeVarDef, Type, Instance, NoneType, - Overloaded, TypeType, UnionType, UninhabitedType, TypeVarId, TypeOfAny, - LiteralType, get_proper_type + Overloaded, TypeType, UnionType, UninhabitedType, TypeVarId, TypeOfAny, get_proper_type ) from mypy.nodes import ARG_POS, ARG_OPT, ARG_STAR, ARG_STAR2, CONTRAVARIANT, INVARIANT, COVARIANT from mypy.subtypes import is_subtype, is_more_precise, is_proper_subtype @@ -463,7 +462,8 @@ def test_simplified_union(self) -> None: self.assert_simplified_union([fx.ga, fx.gsba], fx.ga) self.assert_simplified_union([fx.a, UnionType([fx.d])], UnionType([fx.a, fx.d])) self.assert_simplified_union([fx.a, UnionType([fx.a])], fx.a) - self.assert_simplified_union([fx.b, UnionType([fx.c, UnionType([fx.d])])], UnionType([fx.b, fx.c, fx.d])) + self.assert_simplified_union([fx.b, UnionType([fx.c, UnionType([fx.d])])], + UnionType([fx.b, fx.c, fx.d])) self.assert_simplified_union([fx.lit1, fx.lit2], UnionType([fx.lit1, fx.lit2])) self.assert_simplified_union([fx.lit1, fx.lit3], UnionType([fx.lit1, fx.lit3])) self.assert_simplified_union([fx.lit1, fx.uninhabited], fx.lit1) @@ -971,7 +971,6 @@ def test_type_type(self) -> None: def test_literal_type(self) -> None: a = self.fx.a - d = self.fx.d lit1 = self.fx.lit1 lit2 = self.fx.lit2 lit3 = self.fx.lit3 From bf868b78c0a041d477c37df8e8308fbe16ea2730 Mon Sep 17 00:00:00 2001 From: Adrian Freund Date: Sat, 1 May 2021 14:56:58 +0200 Subject: [PATCH 3/6] Trigger CI From 3740ce9e1437f886672d827cc497e380f9ecf8ea Mon Sep 17 00:00:00 2001 From: Adrian Freund Date: Sat, 1 May 2021 15:32:04 +0200 Subject: [PATCH 4/6] Added make_simplified_union test for instances with last known value --- mypy/test/testtypes.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mypy/test/testtypes.py b/mypy/test/testtypes.py index 302b76a280d4..c8b1ce10c190 100644 --- a/mypy/test/testtypes.py +++ b/mypy/test/testtypes.py @@ -467,6 +467,11 @@ def test_simplified_union(self) -> None: self.assert_simplified_union([fx.lit1, fx.lit2], UnionType([fx.lit1, fx.lit2])) self.assert_simplified_union([fx.lit1, fx.lit3], UnionType([fx.lit1, fx.lit3])) self.assert_simplified_union([fx.lit1, fx.uninhabited], fx.lit1) + self.assert_simplified_union([fx.lit1_inst, fx.lit2_inst], + UnionType([fx.lit1_inst, fx.lit2_inst])) + self.assert_simplified_union([fx.lit1_inst, fx.lit3_inst], + UnionType([fx.lit1_inst, fx.lit3_inst])) + self.assert_simplified_union([fx.lit1_inst, fx.uninhabited], fx.lit1_inst) def assert_simplified_union(self, original: List[Type], union: Type) -> None: assert_equal(make_simplified_union(original), union) From 8923949b1fbd00e5908f39943bb8ad04113ce199 Mon Sep 17 00:00:00 2001 From: Adrian Freund Date: Wed, 5 May 2021 13:18:12 +0200 Subject: [PATCH 5/6] Also test reversed unions --- mypy/test/testtypes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mypy/test/testtypes.py b/mypy/test/testtypes.py index c8b1ce10c190..56169e0edf3c 100644 --- a/mypy/test/testtypes.py +++ b/mypy/test/testtypes.py @@ -475,6 +475,7 @@ def test_simplified_union(self) -> None: def assert_simplified_union(self, original: List[Type], union: Type) -> None: assert_equal(make_simplified_union(original), union) + assert_equal(make_simplified_union(list(reversed(original))), union) # Helpers From 68d8c1e81c50b5267430aef9c7898efc909270ec Mon Sep 17 00:00:00 2001 From: Adrian Freund Date: Wed, 5 May 2021 13:49:21 +0200 Subject: [PATCH 6/6] Add more tests --- mypy/test/testtypes.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mypy/test/testtypes.py b/mypy/test/testtypes.py index 56169e0edf3c..07c8682f10ea 100644 --- a/mypy/test/testtypes.py +++ b/mypy/test/testtypes.py @@ -464,14 +464,21 @@ def test_simplified_union(self) -> None: self.assert_simplified_union([fx.a, UnionType([fx.a])], fx.a) self.assert_simplified_union([fx.b, UnionType([fx.c, UnionType([fx.d])])], UnionType([fx.b, fx.c, fx.d])) + self.assert_simplified_union([fx.lit1, fx.a], fx.a) + self.assert_simplified_union([fx.lit1, fx.lit1], fx.lit1) self.assert_simplified_union([fx.lit1, fx.lit2], UnionType([fx.lit1, fx.lit2])) self.assert_simplified_union([fx.lit1, fx.lit3], UnionType([fx.lit1, fx.lit3])) self.assert_simplified_union([fx.lit1, fx.uninhabited], fx.lit1) + self.assert_simplified_union([fx.lit1_inst, fx.a], fx.a) + self.assert_simplified_union([fx.lit1_inst, fx.lit1_inst], fx.lit1_inst) self.assert_simplified_union([fx.lit1_inst, fx.lit2_inst], UnionType([fx.lit1_inst, fx.lit2_inst])) self.assert_simplified_union([fx.lit1_inst, fx.lit3_inst], UnionType([fx.lit1_inst, fx.lit3_inst])) self.assert_simplified_union([fx.lit1_inst, fx.uninhabited], fx.lit1_inst) + self.assert_simplified_union([fx.lit1, fx.lit1_inst], UnionType([fx.lit1, fx.lit1_inst])) + self.assert_simplified_union([fx.lit1, fx.lit2_inst], UnionType([fx.lit1, fx.lit2_inst])) + self.assert_simplified_union([fx.lit1, fx.lit3_inst], UnionType([fx.lit1, fx.lit3_inst])) def assert_simplified_union(self, original: List[Type], union: Type) -> None: assert_equal(make_simplified_union(original), union)