def contravariant_type_parameter_is_substituted_with_common_sub_type_of_actual_type_params(self): contravariant_type_param = types.contravariant("T") first_class_type = types.class_type("User") second_class_type = types.class_type("Role") generic_class = types.generic_class("Pair", [contravariant_type_param, contravariant_type_param]) type_map = types.is_sub_type( # TODO: need a reliable way of getting the underlying type (but as an instantiated type) generic_class(contravariant_type_param, contravariant_type_param), generic_class(first_class_type, second_class_type), unify=[contravariant_type_param] ) assert_equal(types.bottom_type, type_map[contravariant_type_param])
def instantiated_class_is_sub_type_of_other_instantiated_class_if_formal_param_is_contravariant_and_type_params_are_supertypes(self): generic_class = types.generic_class("iterator", [types.contravariant("T")]) assert not types.is_sub_type(generic_class(types.object_type), generic_class(types.int_type)) assert types.is_sub_type(generic_class(types.int_type), generic_class(types.object_type))