def common_superclass_is_preferred_over_union_of_four_or_more_types_even_when_additional_methods_are_defined(): class Base(object): __metaclass__ = abc.ABCMeta @abc.abstractmethod def f(self): pass class A(Base): def f(self): pass class B(Base): def f(self): pass def g(self): pass class C(Base): def f(self): pass class D(Base): def f(self): pass assert_equal( union([describe(Base)]), common_super_type([describe(A), describe(B), describe(C), describe(D)]) )
def abstract_base_class_is_not_selected_as_type_if_sub_type_defines_additional_method(): class Base(object): __metaclass__ = abc.ABCMeta @abc.abstractmethod def f(self): pass class A(Base): def f(self): pass class B(Base): def f(self): pass def g(self): pass assert_equal( union([describe(A), describe(B)]), common_super_type([describe(A), describe(B)]) )
def union_of_one_type_is_that_type(): assert_equal(types.describe(int), types.union([types.describe(int)]))
def unions_are_flattened(): assert_equal( types.union([types.describe(int), types.describe(str), types.describe(float)]), types.union([types.describe(int), types.union([types.describe(str), types.describe(float)])]) )
def unions_are_order_agnostic(): assert_equal( types.union([types.describe(str), types.describe(int)]), types.union([types.describe(int), types.describe(str)]) )
def common_super_type_of_dict_of_different_element_types_is_union_of_dict_types(): assert_equal( union([Dict(describe(int), describe(str)), Dict(describe(str), describe(int))]), common_super_type([Dict(describe(int), describe(str)), Dict(describe(str), describe(int))]) )
def lists_of_different_types_have_super_type_of_list_of_super_type_of_elements(): assert_equal( union([List(union([describe(str), describe(int)]))]), common_super_type([List(describe(str)), List(describe(int))]) )
def list_of_concrete_type_squashes_list_of_any_type_in_presence_of_other_types(): assert_equal( union([List(describe(int)), describe(type(None))]), common_super_type([List(any_), List(describe(int)), describe(type(None))]) )
def common_super_type_of_types_with_none_is_union_with_none(): assert_equal( union([describe(type(None)), describe(int)]), common_super_type([describe(type(None)), describe(int)]) )
def union_uses_union_class_with_getitem(): type_ = types.union([types.describe(type(None)), types.describe(int)]) assert_equal("Union[None, int]", format_type(type_))