def generic_type_arguments_are_covariant(): type_bindings = {"f": types.generic_func(["T"], lambda T: types.func([T, T], T), )} node = nodes.call(nodes.ref("f"), [nodes.str_literal(""), nodes.none()]) assert_equal( types.common_super_type([types.str_type, types.none_type]), infer(node, type_bindings=type_bindings) )
def error_if_generic_func_is_passed_wrong_arguments(): type_bindings = {"f": types.generic_func(["T"], lambda T: types.func([T, types.int_type], T), )} node = nodes.call(nodes.ref("f"), [nodes.str_literal(""), nodes.none()]) try: infer(node, type_bindings=type_bindings) assert False, "Expected error" except errors.ArgumentsError as error: assert_is(node, error.node) assert_equal("cannot call function of type: T => T, int -> T\nwith arguments: str, NoneType", str(error))
def callee_can_be_generic_func(): type_bindings = {"f": types.generic_func(["T"], lambda T: types.func([T], types.int_type), )} node = nodes.call(nodes.ref("f"), [nodes.str_literal("")]) assert_equal(types.int_type, infer(node, type_bindings=type_bindings))