def invariant_type_parameter_can_be_unified_when_part_of_recursive_structural_type(self): invariant_type_param = types.invariant("T") recursive = types.generic_structural_type("recursive", [types.covariant("T")], lambda T: [ types.attr("__iter__", types.func([], recursive(T))), ]) assert types.is_sub_type( recursive(invariant_type_param), recursive(types.int_type), unify=[invariant_type_param] )
def invariant_type_parameter_cannot_have_different_values_in_same_is_sub_type_relation(self): invariant_type_param = types.invariant("T") first_class_type = types.class_type("User") second_class_type = types.class_type("Role") generic_class = types.generic_class("Pair", [invariant_type_param, invariant_type_param]) assert not types.is_sub_type( # TODO: need a reliable way of getting the underlying type (but as an instantiated type) generic_class(invariant_type_param, invariant_type_param), generic_class(first_class_type, second_class_type), unify=[invariant_type_param] )
def instantiated_class_is_not_sub_type_of_other_instantiated_class_if_formal_param_is_invariant_and_type_params_are_different(self): generic_class = types.generic_class("iterator", [types.invariant("T")]) assert not types.is_sub_type(generic_class(types.object_type), generic_class(types.int_type)) assert not types.is_sub_type(generic_class(types.int_type), generic_class(types.object_type))
from nose.tools import istest, assert_equal, assert_not_equal from nope import types _formal_param = types.invariant("T") _class_type = types.class_type("User") int_type = types.int_type str_type = types.str_type none_type = types.none_type @istest class TypeEqualityTests(object): @istest def class_type_is_equal_to_itself(self): class_type = types.class_type("Blah") assert_equal(class_type, class_type) @istest def class_type_is_not_equal_to_another_class_type_with_same_attributes(self): assert_not_equal(types.class_type("Blah"), types.class_type("Blah")) @istest def instantiated_type_is_not_equal_to_class_type(self): class_type = types.class_type("List") generic_type = types.generic_class("List", "T") instantiated_type = generic_type.instantiate([class_type]) assert_not_equal(class_type, instantiated_type) @istest