def type_of_type_union_is_metatype_of_unioned_types(): type_bindings = { "str": types.meta_type(types.str_type), "int": types.meta_type(types.int_type), } node = nodes.type_union([nodes.ref("str"), nodes.ref("int")]) inferred_type = infer(node, type_bindings=type_bindings) assert types.is_meta_type(inferred_type) assert_equal(types.union(types.str_type, types.int_type), inferred_type.type)
def type_of_function_signature_is_metatype_of_function(): type_bindings = { "str": types.meta_type(types.str_type), "int": types.meta_type(types.int_type), } node = nodes.signature( args=[nodes.signature_arg(nodes.ref("int"))], returns=nodes.ref("str") ) inferred_type = infer(node, type_bindings=type_bindings) assert types.is_meta_type(inferred_type) assert_equal(types.func([types.int_type], types.str_type), inferred_type.type)
def type_of_generic_function_signature_is_metatype_of_function(): node = nodes.signature( type_params=[nodes.formal_type_parameter("T")], args=[nodes.signature_arg(nodes.ref("T"))], returns=nodes.ref("T") ) inferred_type = infer(node) assert types.is_meta_type(inferred_type) assert types.is_generic_func(inferred_type.type) formal_type_param, = inferred_type.type.formal_type_params assert_equal( types.func([formal_type_param], formal_type_param), inferred_type.type.instantiate([formal_type_param]), )
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)