def test_get_args_and_return_type_no_hints(self):
        arg_types1, return_type1 = get_args_and_return_type(Callable)
        arg_types2, return_type2 = get_args_and_return_type(callable)

        self.assertEqual(None, arg_types1)
        self.assertEqual(None, return_type1)
        self.assertEqual(None, arg_types2)
        self.assertEqual(None, return_type2)
    def test_get_args_and_return_type_with_explicit_result(self):
        class CallableMock:
            __args__ = (int, int)
            __result__ = str

        args, return_type = get_args_and_return_type(CallableMock)

        self.assertTupleEqual((int, int), args)
        self.assertEqual(str, return_type)
    def test_get_args_and_return_type(self):
        arg_types, return_type = get_args_and_return_type(
        Callable[[int, str], float])

        self.assertEqual((int, str), arg_types)
        self.assertEqual(float, return_type)
    def test_get_args_and_return_type_no_return_type(self):
        arg_types, return_type = get_args_and_return_type(
            Callable[[int, str], None])

        self.assertEqual((int, str), arg_types)
        self.assertEqual(NoneType, return_type)
    def test_get_args_and_return_type_no_args(self):
        arg_types, return_type = get_args_and_return_type(
            Callable[[], float])

        self.assertEqual(tuple(), arg_types)
        self.assertEqual(float, return_type)
    def test_get_args_and_return_type(self):
        args, return_type = get_args_and_return_type(Callable[[int, int], str])

        self.assertTupleEqual((int, int), args)
        self.assertEqual(str, return_type)