| /* | |
| * Copyright 2008 litl, LLC | |
| * Copyright 2014 Simon Feltman <sfeltman@gnome.org> | |
| * | |
| * SPDX-License-Identifier: LGPL-2.1-or-later | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General | |
| * Public License along with this library; if not, see <http://www.gnu.org/licenses/>. | |
| */ | |
| #include "config.h" | |
| #include "girepository.h" | |
| #include "test-common.h" | |
| static void | |
| test_invoke_gerror (RepositoryFixture *fx, | |
| const void *unused) | |
| { | |
| GIFunctionInfo *func_info = NULL; | |
| GIArgument in_arg[1]; | |
| GIArgument ret_arg; | |
| GError *error = NULL; | |
| gboolean invoke_return; | |
| g_test_summary ("Test invoking a function that throws a GError"); | |
| func_info = GI_FUNCTION_INFO (gi_repository_find_by_name (fx->repository, "GLib", "file_read_link")); | |
| g_assert_nonnull (func_info); | |
| g_assert_true (gi_callable_info_can_throw_gerror (GI_CALLABLE_INFO (func_info))); | |
| in_arg[0].v_string = g_strdup ("non-existent-file/hope"); | |
| invoke_return = gi_function_info_invoke (func_info, in_arg, 1, NULL, 0, &ret_arg, &error); | |
| g_clear_pointer (&in_arg[0].v_string, g_free); | |
| g_assert_false (invoke_return); | |
| g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT); | |
| g_clear_error (&error); | |
| g_clear_pointer (&func_info, gi_base_info_unref); | |
| } | |
| static void | |
| test_vfunc_can_throw_gerror (RepositoryFixture *fx, | |
| const void *unused) | |
| { | |
| GIInterfaceInfo *interface_info = NULL; | |
| GIFunctionInfo *invoker_info = NULL; | |
| GIVFuncInfo *vfunc_info = NULL; | |
| g_test_summary ("Test gi_callable_info_can_throw_gerror() on a vfunc"); | |
| interface_info = GI_INTERFACE_INFO (gi_repository_find_by_name (fx->repository, "Gio", "AppInfo")); | |
| g_assert_nonnull (interface_info); | |
| invoker_info = gi_interface_info_find_method (interface_info, "launch"); | |
| g_assert_nonnull (invoker_info); | |
| g_assert_true (gi_callable_info_can_throw_gerror (GI_CALLABLE_INFO (invoker_info))); | |
| vfunc_info = gi_interface_info_find_vfunc (interface_info, "launch"); | |
| g_assert_nonnull (vfunc_info); | |
| g_assert_true (gi_callable_info_can_throw_gerror (GI_CALLABLE_INFO (vfunc_info))); | |
| g_clear_pointer (&vfunc_info, gi_base_info_unref); | |
| g_clear_pointer (&invoker_info, gi_base_info_unref); | |
| g_clear_pointer (&interface_info, gi_base_info_unref); | |
| } | |
| static void | |
| test_callback_can_throw_gerror (RepositoryFixture *fx, | |
| const void *unused) | |
| { | |
| GIStructInfo *class_info = NULL; | |
| GIFieldInfo *field_info = NULL; | |
| GITypeInfo *field_type = NULL; | |
| GICallbackInfo *callback_info = NULL; | |
| g_test_summary ("Test gi_callable_info_can_throw_gerror() on a callback"); | |
| class_info = GI_STRUCT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "AppInfoIface")); | |
| g_assert_nonnull (class_info); | |
| field_info = gi_struct_info_find_field (class_info, "launch"); | |
| g_assert_nonnull (field_info); | |
| g_assert_true (GI_IS_FIELD_INFO (field_info)); | |
| field_type = gi_field_info_get_type_info (field_info); | |
| g_assert_nonnull (field_type); | |
| g_assert_true (GI_IS_TYPE_INFO (field_type)); | |
| g_assert_cmpint (gi_type_info_get_tag (field_type), ==, GI_TYPE_TAG_INTERFACE); | |
| callback_info = GI_CALLBACK_INFO (gi_type_info_get_interface (field_type)); | |
| g_assert_nonnull (callback_info); | |
| g_assert (gi_callable_info_can_throw_gerror (GI_CALLABLE_INFO (callback_info))); | |
| g_clear_pointer (&callback_info, gi_base_info_unref); | |
| g_clear_pointer (&field_type, gi_base_info_unref); | |
| g_clear_pointer (&field_info, gi_base_info_unref); | |
| g_clear_pointer (&class_info, gi_base_info_unref); | |
| } | |
| int | |
| main (int argc, | |
| char *argv[]) | |
| { | |
| repository_init (&argc, &argv); | |
| ADD_REPOSITORY_TEST ("/throws/invoke-gerror", test_invoke_gerror, &typelib_load_spec_glib); | |
| ADD_REPOSITORY_TEST ("/throws/vfunc-can-throw-gerror", test_vfunc_can_throw_gerror, &typelib_load_spec_gio); | |
| ADD_REPOSITORY_TEST ("/throws/callback-can-throw-gerror", test_callback_can_throw_gerror, &typelib_load_spec_gio); | |
| return g_test_run (); | |
| } |