def common_super_type_of_types_is_passed_type_that_is_super_type_of_all_other_types(self): first_type = types.structural_type("first", [ types.attr("a", types.int_type), types.attr("b", types.str_type), ]) second_type = types.structural_type("second", [ types.attr("a", types.int_type), ]) assert_equal(second_type, types.common_super_type([first_type, second_type]))
def rescursive_structural_types_do_not_cause_stack_overflow(self): recursive1 = types.structural_type("recursive1") recursive1.attrs.add("uh_oh", types.func([], recursive1)) recursive2 = types.structural_type("recursive2") recursive2.attrs.add("uh_oh", types.func([], recursive2)) assert not types.is_sub_type( recursive1, recursive2, )
def class_type_is_not_subtype_of_structural_type_if_it_is_missing_attrs(self): cls = types.class_type("Person") structural_type = types.structural_type("HasName", [ types.attr("name", types.str_type), ]) assert not types.is_sub_type(structural_type, cls) assert not types.is_sub_type(cls, structural_type)
def class_type_is_not_subtype_of_structural_type_if_attr_is_strict_supertype_of_attr_on_structural_type(self): cls = types.class_type("Person", [ types.attr("name", types.object_type), ]) structural_type = types.structural_type("HasName", [ types.attr("name", types.str_type), ]) assert not types.is_sub_type(structural_type, cls) assert not types.is_sub_type(cls, structural_type)
def class_type_is_subtype_of_structural_type_if_it_has_subset_of_attrs(self): # TODO: how to handle sub-typing of mutable attrs cls = types.class_type("Person", [ types.attr("name", types.str_type), types.attr("number_of_hats", types.int_type), ]) structural_type = types.structural_type("HasName", [ types.attr("name", types.str_type), ]) assert types.is_sub_type(structural_type, cls) assert not types.is_sub_type(cls, structural_type)
def type_of_structural_type_is_as_definition(): type_bindings = { "str": types.meta_type(types.str_type), "int": types.meta_type(types.int_type), } node = nodes.structural_type("Song", [ ("description", nodes.ref("str")), ("length", nodes.ref("int")), ]) context = update_context(node, type_bindings=type_bindings) declared_type = context.lookup_name("Song") assert types.is_meta_type(declared_type) expected_type = types.structural_type("Song", [ types.attr("description", types.str_type), types.attr("length", types.int_type), ]) assert types.is_equivalent_type(expected_type, declared_type.type)