1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
4 #include <glib-object.h>
5 #include <gobject/gvaluecollector.h>
6 #include <cairo-gobject.h>
10 static gboolean abort_on_error = TRUE;
12 #define ASSERT_VALUE(condition) \
14 g_assert (condition); \
16 g_warn_if_fail (condition); \
19 regress_set_abort_on_error (gboolean in)
26 regress_test_boolean (gboolean in)
32 regress_test_boolean_true (gboolean in)
34 ASSERT_VALUE (in == TRUE);
39 regress_test_boolean_false (gboolean in)
41 ASSERT_VALUE (in == FALSE);
46 regress_test_int8 (gint8 in)
52 regress_test_uint8 (guint8 in)
58 regress_test_int16 (gint16 in)
64 regress_test_uint16 (guint16 in)
70 regress_test_int32 (gint32 in)
76 regress_test_uint32 (guint32 in)
82 regress_test_int64 (gint64 in)
88 regress_test_uint64 (guint64 in)
94 regress_test_short (gshort in)
100 regress_test_ushort (gushort in)
106 regress_test_int (gint in)
112 regress_test_uint (guint in)
118 regress_test_long (glong in)
124 regress_test_ulong (gulong in)
130 regress_test_ssize (gssize in)
136 regress_test_size (gsize in)
142 regress_test_float (gfloat in)
148 regress_test_double (gdouble in)
154 regress_test_unichar (gunichar in)
160 regress_test_timet (time_t in)
166 regress_test_gtype (GType in)
172 regress_test_closure (GClosure *closure)
174 GValue return_value = {0, };
177 g_value_init (&return_value, G_TYPE_INT);
179 g_closure_invoke (closure,
184 ret = g_value_get_int (&return_value);
186 g_value_unset(&return_value);
192 regress_test_closure_one_arg (GClosure *closure, int arg)
194 GValue return_value = {0, };
198 g_value_init (&return_value, G_TYPE_INT);
200 memset (&arguments[0], 0, sizeof (arguments));
201 g_value_init (&arguments[0], G_TYPE_INT);
202 g_value_set_int (&arguments[0], arg);
204 g_closure_invoke (closure,
209 ret = g_value_get_int (&return_value);
211 g_value_unset(&return_value);
212 g_value_unset(&arguments[0]);
218 * regress_test_closure_variant:
219 * @closure: GClosure which takes one GVariant and returns a GVariant
220 * @arg: (allow-none) (transfer none): a GVariant passed as argument to @closure
222 * Return value: (transfer full): the return value of @closure
225 regress_test_closure_variant (GClosure *closure, GVariant* arg)
227 GValue return_value = {0, };
228 GValue arguments[1] = {{0,} };
231 g_value_init (&return_value, G_TYPE_VARIANT);
233 g_value_init (&arguments[0], G_TYPE_VARIANT);
234 g_value_set_variant (&arguments[0], arg);
236 g_closure_invoke (closure,
241 ret = g_value_get_variant (&return_value);
245 g_value_unset (&return_value);
246 g_value_unset (&arguments[0]);
252 * regress_test_value_arg:
253 * @v: (transfer none): a GValue expected to contain an int
255 * Return value: the int contained in the GValue.
258 regress_test_int_value_arg(const GValue *v)
262 i = g_value_get_int (v);
269 * regress_test_value_return:
272 * Return value: (transfer none): the int wrapped in a GValue.
275 regress_test_value_return(int i)
277 memset(&value, '\0', sizeof(GValue));
279 g_value_init (&value, G_TYPE_INT);
280 g_value_set_int (&value, i);
285 /************************************************************************/
286 /* foreign structs */
289 * regress_test_cairo_context_full_return:
291 * Returns: (transfer full):
294 regress_test_cairo_context_full_return (void)
296 cairo_surface_t *surface;
298 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 10, 10);
299 cr = cairo_create (surface);
300 cairo_surface_destroy (surface);
305 * regress_test_cairo_context_none_in:
306 * @context: (transfer none):
309 regress_test_cairo_context_none_in (cairo_t *context)
311 cairo_surface_t *surface = cairo_get_target (context);
313 g_assert (cairo_image_surface_get_format (surface) == CAIRO_FORMAT_ARGB32);
314 g_assert (cairo_image_surface_get_width (surface) == 10);
315 g_assert (cairo_image_surface_get_height (surface) == 10);
320 * regress_test_cairo_surface_none_return:
322 * Returns: (transfer none):
325 regress_test_cairo_surface_none_return (void)
327 static cairo_surface_t *surface;
329 if (surface == NULL) {
330 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 10, 10);
337 * regress_test_cairo_surface_full_return:
339 * Returns: (transfer full):
342 regress_test_cairo_surface_full_return (void)
344 return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 10, 10);
348 * regress_test_cairo_surface_none_in:
349 * @surface: (transfer none):
352 regress_test_cairo_surface_none_in (cairo_surface_t *surface)
354 g_assert (cairo_image_surface_get_format (surface) == CAIRO_FORMAT_ARGB32);
355 g_assert (cairo_image_surface_get_width (surface) == 10);
356 g_assert (cairo_image_surface_get_height (surface) == 10);
360 * regress_test_cairo_surface_full_out:
361 * @surface: (out) (transfer full):
364 regress_test_cairo_surface_full_out (cairo_surface_t **surface)
366 *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 10, 10);
370 * regress_test_gvariant_i:
372 * Returns: (transfer none): New variant
375 regress_test_gvariant_i (void)
377 return g_variant_new_int32 (1);
381 * regress_test_gvariant_s:
383 * Returns: (transfer none): New variant
386 regress_test_gvariant_s (void)
388 return g_variant_new_string ("one");
392 * regress_test_gvariant_asv:
394 * Returns: (transfer none): New variant
397 regress_test_gvariant_asv (void)
401 g_variant_builder_init (&b, G_VARIANT_TYPE ("a{sv}"));
403 g_variant_builder_add (&b, "{sv}", "name", g_variant_new_string ("foo"));
404 g_variant_builder_add (&b, "{sv}", "timeout", g_variant_new_int32 (10));
406 return g_variant_builder_end (&b);
410 * regress_test_gvariant_v:
412 * Returns: (transfer none): New variant
415 regress_test_gvariant_v (void)
417 return g_variant_new_variant (g_variant_new_string ("contents"));
421 * regress_test_gvariant_as:
423 * Returns: (transfer none): New variant
426 regress_test_gvariant_as (void)
428 const char *as[] = { "one", "two", "three", NULL };
430 return g_variant_new_strv (as, -1);
433 /************************************************************************/
435 /* insert BLACK HEART SUIT to ensure UTF-8 doesn't get mangled */
436 static const char utf8_const[] = "const \xe2\x99\xa5 utf8";
437 static const char utf8_nonconst[] = "nonconst \xe2\x99\xa5 utf8";
440 * regress_test_utf8_const_return:
442 * Return value: UTF-8 string
445 regress_test_utf8_const_return (void)
447 /* transfer mode none */
452 * regress_test_utf8_nonconst_return:
454 * Return value: (transfer full): UTF-8 string
457 regress_test_utf8_nonconst_return (void)
459 return g_strdup (utf8_nonconst);
463 * regress_test_utf8_const_in:
467 regress_test_utf8_const_in (const char *in)
469 /* transfer mode none */
470 g_assert (strcmp (in, utf8_const) == 0);
474 * regress_test_utf8_out:
475 * @out: (out) (transfer full):
478 regress_test_utf8_out (char **out)
480 /* out parameter, transfer mode full */
481 *out = g_strdup (utf8_nonconst);
485 * regress_test_utf8_inout:
486 * @inout: (inout) (transfer full):
489 regress_test_utf8_inout (char **inout)
491 /* inout parameter, transfer mode full */
492 g_assert (strcmp (*inout, utf8_const) == 0);
493 *inout = g_strdup (utf8_nonconst);
497 * regress_test_filename_return:
499 * Return value: (element-type filename) (transfer full): list of strings
502 regress_test_filename_return (void)
504 GSList *filenames = NULL;
505 filenames = g_slist_prepend (filenames, g_filename_from_utf8("/etc/fstab", -1, NULL, NULL, NULL));
506 filenames = g_slist_prepend (filenames, g_filename_from_utf8("åäö", -1, NULL, NULL, NULL));
510 /* in arguments after out arguments */
513 * regress_test_int_out_utf8:
518 regress_test_int_out_utf8 (int *length, const char *in)
520 *length = g_utf8_strlen(in, -1);
524 /* multiple output arguments */
527 * regress_test_multi_double_args:
533 regress_test_multi_double_args (gdouble in, gdouble *one, gdouble *two)
540 * regress_test_utf8_out_out:
541 * @out0: (out) (transfer full): a copy of "first"
542 * @out1: (out) (transfer full): a copy of "second"
545 regress_test_utf8_out_out (char **out0, char **out1)
547 *out0 = g_strdup ("first");
548 *out1 = g_strdup ("second");
552 * regress_test_utf8_out_nonconst_return:
553 * @out: (out) (transfer full): a copy of "second"
555 * Returns: (transfer full): a copy of "first"
558 regress_test_utf8_out_nonconst_return (char **out)
560 *out = g_strdup ("second");
561 return g_strdup ("first");
565 * regress_test_utf8_null_in:
569 regress_test_utf8_null_in (char *in)
571 g_assert (in == NULL);
575 * regress_test_utf8_null_out:
576 * @char_out: (allow-none) (out):
578 void regress_test_utf8_null_out (char **char_out)
584 /* non-basic-types */
586 static const char *test_sequence[] = {"1", "2", "3"};
591 * regress_test_array_int_in:
593 * @ints: (array length=n_ints): List of ints
596 regress_test_array_int_in (int n_ints, int *ints)
599 for (i = 0; i < n_ints; i++)
605 * regress_test_array_int_out:
606 * @n_ints: (out): the length of @ints
607 * @ints: (out) (array length=n_ints) (transfer full): a list of 5 integers, from 0 to 4 in consecutive order
610 regress_test_array_int_out (int *n_ints, int **ints)
614 *ints = g_malloc0(sizeof(**ints) * *n_ints);
615 for (i = 1; i < *n_ints; i++)
616 (*ints)[i] = (*ints)[i-1] + 1;
620 * regress_test_array_int_inout:
621 * @n_ints: (inout): the length of @ints
622 * @ints: (inout) (array length=n_ints) (transfer full): a list of integers whose items will be increased by 1, except the first that will be dropped
625 regress_test_array_int_inout (int *n_ints, int **ints)
633 new_ints = g_malloc(sizeof(**ints) * *n_ints);
634 for (i = 0; i < *n_ints; i++)
635 new_ints[i] = (*ints)[i + 1] + 1;
641 * regress_test_array_gint8_in:
643 * @ints: (array length=n_ints): List of ints
646 regress_test_array_gint8_in (int n_ints, gint8 *ints)
649 for (i = 0; i < n_ints; i++)
655 * regress_test_array_gint16_in:
657 * @ints: (array length=n_ints): List of ints
660 regress_test_array_gint16_in (int n_ints, gint16 *ints)
663 for (i = 0; i < n_ints; i++)
669 * regress_test_array_gint32_in:
671 * @ints: (array length=n_ints): List of ints
674 regress_test_array_gint32_in (int n_ints, gint32 *ints)
678 for (i = 0; i < n_ints; i++)
684 * regress_test_array_gint64_in:
686 * @ints: (array length=n_ints): List of ints
689 regress_test_array_gint64_in (int n_ints, gint64 *ints)
693 for (i = 0; i < n_ints; i++)
699 * regress_test_strv_in:
700 * @arr: (array zero-terminated=1) (transfer none):
703 regress_test_strv_in (char **arr)
705 if (g_strv_length (arr) != 3)
707 if (strcmp (arr[0], "1") != 0)
709 if (strcmp (arr[1], "2") != 0)
711 if (strcmp (arr[2], "3") != 0)
717 * regress_test_array_gtype_in:
719 * @types: (array length=n_types): List of types
721 * Return value: (transfer full): string representation of provided types
724 regress_test_array_gtype_in (int n_types, GType *types)
729 string = g_string_new ("[");
730 for (i = 0; i < n_types; i++)
732 g_string_append (string, g_type_name (types[i]));
733 g_string_append_c (string, ',');
735 g_string_append_c (string, ']');
736 return g_string_free (string, FALSE);
740 * regress_test_strv_out:
742 * Returns: (transfer full):
745 regress_test_strv_out (void)
749 char **ret = g_new (char *, n);
750 ret[i++] = g_strdup ("thanks");
751 ret[i++] = g_strdup ("for");
752 ret[i++] = g_strdup ("all");
753 ret[i++] = g_strdup ("the");
754 ret[i++] = g_strdup ("fish");
761 * regress_test_strv_out_container:
763 * Return value: (array zero-terminated=1) (transfer container):
766 regress_test_strv_out_container (void)
768 char **ret = g_new (char *, 4);
777 * regress_test_strv_outarg:
778 * @retp: (array zero-terminated=1) (out) (transfer container):
781 regress_test_strv_outarg (char ***retp)
783 char **ret = g_new (char *, 4);
792 * regress_test_array_fixed_size_int_in:
793 * @ints: (array fixed-size=5): a list of 5 integers
795 * Returns: the sum of the items in @ints
798 regress_test_array_fixed_size_int_in (int *ints)
801 for (i = 0; i < 5; i++)
807 * regress_test_array_fixed_size_int_out:
808 * @ints: (out) (array fixed-size=5) (transfer full): a list of 5 integers ranging from 0 to 4
811 regress_test_array_fixed_size_int_out (int **ints)
814 *ints = g_malloc0(sizeof(**ints) * 5);
815 for (i = 1; i < 5; i++)
816 (*ints)[i] = (*ints)[i-1] + 1;
820 * regress_test_array_fixed_size_int_return:
822 * Returns: (array fixed-size=5) (transfer full): a list of 5 integers ranging from 0 to 4
825 regress_test_array_fixed_size_int_return (void)
828 ints = g_malloc0(sizeof(*ints) * 5);
829 for (i = 1; i < 5; i++)
830 ints[i] = ints[i-1] + 1;
835 * regress_test_strv_out_c:
837 * Returns: (transfer none):
840 regress_test_strv_out_c (void)
842 static char **ret = NULL;
845 ret = regress_test_strv_out ();
847 return (const char * const *) ret;
851 * regress_test_array_int_full_out:
852 * @len: length of the returned array.
854 * Returns: (array length=len) (transfer full): a new array of integers.
857 regress_test_array_int_full_out(int *len)
861 result = g_malloc0(sizeof(*result) * (*len));
862 for (i=1; i < (*len); i++)
863 result[i] = result[i-1] + 1;
868 * regress_test_array_int_none_out:
869 * @len: length of the returned array.
871 * Returns: (array length=len) (transfer none): a static array of integers.
874 regress_test_array_int_none_out(int *len)
876 static int result[5] = { 1, 2, 3, 4, 5 };
882 * regress_test_array_int_null_in:
883 * @arr: (array length=len) (allow-none):
887 regress_test_array_int_null_in (int *arr, int len)
889 g_assert (arr == NULL);
893 * regress_test_array_int_null_out:
894 * @arr: (out) (array length=len) (allow-none):
895 * @len: (out) : length
898 regress_test_array_int_null_out (int **arr, int *len)
906 /************************************************************************/
909 static /*const*/ GList *
910 regress_test_sequence_list()
912 static GList *list = NULL;
915 for (i = 0; i < G_N_ELEMENTS(test_sequence); ++i) {
916 list = g_list_prepend (list, (gpointer)test_sequence[i]);
918 list = g_list_reverse (list);
924 * regress_test_glist_nothing_return:
926 * Return value: (element-type utf8) (transfer none):
929 regress_test_glist_nothing_return (void)
931 return regress_test_sequence_list ();
935 * regress_test_glist_nothing_return2:
937 * Return value: (element-type utf8) (transfer none):
940 regress_test_glist_nothing_return2 (void)
942 return regress_test_sequence_list ();
946 * regress_test_glist_container_return:
948 * Return value: (element-type utf8) (transfer container):
951 regress_test_glist_container_return (void)
953 return g_list_copy (regress_test_sequence_list ());
957 * regress_test_glist_everything_return:
959 * Return value: (element-type utf8) (transfer full):
962 regress_test_glist_everything_return (void)
967 list = g_list_copy (regress_test_sequence_list ());
968 for (l = list; l != NULL; l = l->next)
969 l->data = g_strdup (l->data);
974 regress_assert_test_sequence_list (const GList *in)
979 for (i = 0, l = in; l != NULL; ++i, l = l->next) {
980 g_assert (i < G_N_ELEMENTS(test_sequence));
981 g_assert (strcmp (l->data, test_sequence[i]) == 0);
983 g_assert (i == G_N_ELEMENTS(test_sequence));
987 * regress_test_glist_nothing_in:
988 * @in: (element-type utf8):
991 regress_test_glist_nothing_in (const GList *in)
993 regress_assert_test_sequence_list (in);
997 * regress_test_glist_nothing_in2:
998 * @in: (element-type utf8):
1001 regress_test_glist_nothing_in2 (GList *in)
1003 regress_assert_test_sequence_list (in);
1007 * regress_test_glist_null_in:
1008 * @in: (element-type utf8) (allow-none):
1011 regress_test_glist_null_in (GSList *in)
1013 g_assert (in == NULL);
1017 * regress_test_glist_null_out:
1018 * @out_list: (out) (element-type utf8) (allow-none):
1021 regress_test_glist_null_out (GSList **out_list)
1027 /************************************************************************/
1030 static /*const*/ GSList *
1031 regress_test_sequence_slist()
1033 static GSList *list = NULL;
1036 for (i = 0; i < G_N_ELEMENTS(test_sequence); ++i) {
1037 list = g_slist_prepend (list, (gpointer)test_sequence[i]);
1039 list = g_slist_reverse (list);
1045 * regress_test_gslist_nothing_return:
1047 * Return value: (element-type utf8) (transfer none):
1050 regress_test_gslist_nothing_return (void)
1052 return regress_test_sequence_slist ();
1056 * regress_test_gslist_nothing_return2:
1058 * Return value: (element-type utf8) (transfer none):
1061 regress_test_gslist_nothing_return2 (void)
1063 return regress_test_sequence_slist ();
1067 * regress_test_gslist_container_return:
1069 * Return value: (element-type utf8) (transfer container):
1072 regress_test_gslist_container_return (void)
1074 return g_slist_copy (regress_test_sequence_slist ());
1078 * regress_test_gslist_everything_return:
1080 * Return value: (element-type utf8) (transfer full):
1083 regress_test_gslist_everything_return (void)
1088 list = g_slist_copy (regress_test_sequence_slist ());
1089 for (l = list; l != NULL; l = l->next)
1090 l->data = g_strdup (l->data);
1095 regress_assert_test_sequence_slist (const GSList *in)
1100 for (i = 0, l = in; l != NULL; ++i, l = l->next) {
1101 g_assert (i < G_N_ELEMENTS(test_sequence));
1102 g_assert (strcmp (l->data, test_sequence[i]) == 0);
1104 g_assert (i == G_N_ELEMENTS(test_sequence));
1108 * regress_test_gslist_nothing_in:
1109 * @in: (element-type utf8):
1112 regress_test_gslist_nothing_in (const GSList *in)
1114 regress_assert_test_sequence_slist (in);
1118 * regress_test_gslist_nothing_in2:
1119 * @in: (element-type utf8):
1122 regress_test_gslist_nothing_in2 (GSList *in)
1124 regress_assert_test_sequence_slist (in);
1128 * regress_test_gslist_null_in:
1129 * @in: (element-type utf8) (allow-none):
1132 regress_test_gslist_null_in (GSList *in)
1134 g_assert (in == NULL);
1138 * regress_test_gslist_null_out:
1139 * @out_list: (out) (element-type utf8) (allow-none):
1142 regress_test_gslist_null_out (GSList **out_list)
1147 /************************************************************************/
1150 static char *table_data[3][2] = {
1151 { "foo", "bar" }, { "baz", "bat" }, { "qux", "quux" }
1155 regress_test_table_ghash_new_container()
1159 hash = g_hash_table_new(g_str_hash, g_str_equal);
1161 g_hash_table_insert(hash, table_data[i][0], table_data[i][1]);
1166 regress_test_table_ghash_new_full()
1170 hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
1172 g_hash_table_insert(hash,
1173 g_strdup(table_data[i][0]),
1174 g_strdup(table_data[i][1]));
1178 static /*const*/ GHashTable *
1179 regress_test_table_ghash_const()
1181 static GHashTable *hash = NULL;
1183 hash = regress_test_table_ghash_new_container();
1189 * regress_test_ghash_null_return:
1191 * Return value: (element-type utf8 utf8) (transfer none) (allow-none):
1194 regress_test_ghash_null_return (void)
1200 * regress_test_ghash_nothing_return:
1202 * Return value: (element-type utf8 utf8) (transfer none):
1205 regress_test_ghash_nothing_return (void)
1207 return regress_test_table_ghash_const ();
1211 * regress_test_ghash_nothing_return2:
1213 * Return value: (element-type utf8 utf8) (transfer none):
1216 regress_test_ghash_nothing_return2 (void)
1218 return regress_test_table_ghash_const ();
1222 g_value_new (GType type)
1224 GValue *value = g_slice_new0(GValue);
1225 g_value_init(value, type);
1230 g_value_free (GValue *value)
1232 g_value_unset(value);
1233 g_slice_free(GValue, value);
1236 static const gchar *string_array[] = {
1244 * regress_test_ghash_gvalue_return:
1246 * Return value: (element-type utf8 GValue) (transfer none):
1249 regress_test_ghash_gvalue_return (void)
1253 hash = g_hash_table_new_full(g_str_hash, g_str_equal,
1254 g_free, (GDestroyNotify)g_value_free);
1256 value = g_value_new(G_TYPE_INT);
1257 g_value_set_int(value, 12);
1258 g_hash_table_insert(hash, g_strdup("integer"), value);
1260 value = g_value_new(G_TYPE_BOOLEAN);
1261 g_value_set_boolean(value, TRUE);
1262 g_hash_table_insert(hash, g_strdup("boolean"), value);
1264 value = g_value_new(G_TYPE_STRING);
1265 g_value_set_string(value, "some text");
1266 g_hash_table_insert(hash, g_strdup("string"), value);
1268 value = g_value_new(G_TYPE_STRV);
1269 g_value_set_boxed(value, string_array);
1270 g_hash_table_insert(hash, g_strdup("strings"), value);
1272 value = g_value_new(REGRESS_TEST_TYPE_FLAGS);
1273 g_value_set_flags(value, REGRESS_TEST_FLAG1 | REGRESS_TEST_FLAG3);
1274 g_hash_table_insert(hash, g_strdup("flags"), value);
1276 value = g_value_new(regress_test_enum_get_type());
1277 g_value_set_enum(value, REGRESS_TEST_VALUE2);
1278 g_hash_table_insert(hash, g_strdup("enum"), value);
1284 * regress_test_ghash_gvalue_in:
1285 * @hash: (element-type utf8 GValue): the hash table returned by
1286 * regress_test_ghash_gvalue_return().
1289 regress_test_ghash_gvalue_in (GHashTable *hash)
1292 const gchar **strings;
1295 g_assert(hash != NULL);
1297 value = g_hash_table_lookup(hash, "integer");
1298 g_assert(value != NULL);
1299 g_assert(G_VALUE_HOLDS_INT(value));
1300 g_assert(g_value_get_int(value) == 12);
1302 value = g_hash_table_lookup(hash, "boolean");
1303 g_assert(value != NULL);
1304 g_assert(G_VALUE_HOLDS_BOOLEAN(value));
1305 g_assert(g_value_get_boolean(value) == TRUE);
1307 value = g_hash_table_lookup(hash, "string");
1308 g_assert(value != NULL);
1309 g_assert(G_VALUE_HOLDS_STRING(value));
1310 g_assert(strcmp(g_value_get_string(value), "some text") == 0);
1312 value = g_hash_table_lookup(hash, "strings");
1313 g_assert(value != NULL);
1314 g_assert(G_VALUE_HOLDS(value, G_TYPE_STRV));
1315 strings = g_value_get_boxed(value);
1316 g_assert(strings != NULL);
1317 for (i = 0; string_array[i] != NULL; i++)
1318 g_assert(strcmp(strings[i], string_array[i]) == 0);
1320 value = g_hash_table_lookup(hash, "flags");
1321 g_assert(value != NULL);
1322 g_assert(G_VALUE_HOLDS_FLAGS(value));
1323 g_assert(g_value_get_flags(value) == (REGRESS_TEST_FLAG1 | REGRESS_TEST_FLAG3));
1325 value = g_hash_table_lookup(hash, "enum");
1326 g_assert(value != NULL);
1327 g_assert(G_VALUE_HOLDS_ENUM(value));
1328 g_assert(g_value_get_enum(value) == REGRESS_TEST_VALUE2);
1332 * regress_test_ghash_container_return:
1334 * Return value: (element-type utf8 utf8) (transfer container):
1337 regress_test_ghash_container_return (void)
1339 return regress_test_table_ghash_new_container ();
1343 * regress_test_ghash_everything_return:
1345 * Return value: (element-type utf8 utf8) (transfer full):
1348 regress_test_ghash_everything_return (void)
1350 return regress_test_table_ghash_new_full ();
1354 assert_test_table_ghash (const GHashTable *in)
1356 GHashTable *h = regress_test_table_ghash_const();
1357 GHashTableIter iter;
1358 gpointer key, value;
1360 g_assert(g_hash_table_size(h) ==
1361 g_hash_table_size((GHashTable*)in));
1363 g_hash_table_iter_init(&iter, (GHashTable*)in);
1364 while (g_hash_table_iter_next (&iter, &key, &value))
1365 g_assert( strcmp(g_hash_table_lookup(h, (char*)key), (char*)value) == 0);
1369 * regress_test_ghash_null_in:
1370 * @in: (element-type utf8 utf8) (allow-none):
1373 regress_test_ghash_null_in (const GHashTable *in)
1375 g_assert (in == NULL);
1379 * regress_test_ghash_null_out:
1380 * @out: (element-type utf8 utf8) (allow-none) (out):
1383 regress_test_ghash_null_out (const GHashTable **out)
1389 * regress_test_ghash_nothing_in:
1390 * @in: (element-type utf8 utf8):
1393 regress_test_ghash_nothing_in (const GHashTable *in)
1395 assert_test_table_ghash (in);
1399 * regress_test_ghash_nothing_in2:
1400 * @in: (element-type utf8 utf8):
1403 regress_test_ghash_nothing_in2 (GHashTable *in)
1405 assert_test_table_ghash (in);
1408 /* Nested collection types */
1411 * regress_test_ghash_nested_everything_return:
1413 * Specify nested parameterized types directly with the (type ) annotation.
1415 * Return value: (type GLib.HashTable<utf8,GLib.HashTable<utf8,utf8>>) (transfer full):
1418 regress_test_ghash_nested_everything_return (void)
1421 hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
1422 (void (*) (gpointer)) g_hash_table_destroy);
1423 g_hash_table_insert(hash, g_strdup("wibble"), regress_test_table_ghash_new_full());
1428 * regress_test_ghash_nested_everything_return2:
1430 * Another way of specifying nested parameterized types: using the
1431 * element-type annotation.
1433 * Return value: (element-type utf8 GLib.HashTable<utf8,utf8>) (transfer full):
1436 regress_test_ghash_nested_everything_return2 (void)
1438 return regress_test_ghash_nested_everything_return();
1441 /************************************************************************/
1444 * regress_test_garray_container_return:
1446 * Returns: (transfer container) (type GLib.PtrArray) (element-type utf8):
1449 regress_test_garray_container_return (void)
1453 array = g_ptr_array_new_with_free_func (g_free);
1454 g_ptr_array_add (array, g_strdup ("regress"));
1460 * regress_test_garray_full_return:
1462 * Returns: (transfer full) (type GLib.PtrArray) (element-type utf8):
1465 regress_test_garray_full_return (void)
1469 array = g_ptr_array_new ();
1470 g_ptr_array_add (array, g_strdup ("regress"));
1475 /************************************************************************/
1482 * NUM_REGRESS_FOO: (skip)
1484 * num of elements in RegressFoo
1488 regress_test_enum_get_type (void)
1490 static GType etype = 0;
1491 if (G_UNLIKELY(etype == 0)) {
1492 static const GEnumValue values[] = {
1493 { REGRESS_TEST_VALUE1, "REGRESS_TEST_VALUE1", "value1" },
1494 { REGRESS_TEST_VALUE2, "REGRESS_TEST_VALUE2", "value2" },
1495 { REGRESS_TEST_VALUE3, "REGRESS_TEST_VALUE3", "value3" },
1496 { REGRESS_TEST_VALUE4, "REGRESS_TEST_VALUE4", "value4" },
1499 etype = g_enum_register_static (g_intern_static_string ("RegressTestEnum"), values);
1506 regress_test_enum_unsigned_get_type (void)
1508 static GType etype = 0;
1509 if (G_UNLIKELY(etype == 0)) {
1510 static const GEnumValue values[] = {
1511 { REGRESS_TEST_UNSIGNED_VALUE1, "REGRESS_TEST_UNSIGNED_VALUE1", "value1" },
1512 { REGRESS_TEST_UNSIGNED_VALUE2, "REGRESS_TEST_UNSIGNED_VALUE2", "value2" },
1515 etype = g_enum_register_static (g_intern_static_string ("RegressTestEnumUnsigned"), values);
1522 regress_test_flags_get_type (void)
1524 static GType etype = 0;
1525 if (G_UNLIKELY(etype == 0)) {
1526 static const GFlagsValue values[] = {
1527 { REGRESS_TEST_FLAG1, "TEST_FLAG1", "flag1" },
1528 { REGRESS_TEST_FLAG2, "TEST_FLAG2", "flag2" },
1529 { REGRESS_TEST_FLAG3, "TEST_FLAG3", "flag3" },
1532 etype = g_flags_register_static (g_intern_static_string ("RegressTestFlags"), values);
1539 regress_test_enum_param(RegressTestEnum e)
1544 ec = g_type_class_ref (regress_test_enum_get_type ());
1545 ev = g_enum_get_value (ec, e);
1546 g_type_class_unref (ec);
1548 return ev->value_nick;
1552 regress_test_unsigned_enum_param(RegressTestEnumUnsigned e)
1557 ec = g_type_class_ref (regress_test_enum_unsigned_get_type ());
1558 ev = g_enum_get_value (ec, e);
1559 g_type_class_unref (ec);
1561 return ev->value_nick;
1565 * regress_global_get_flags_out:
1566 * @v: (out): A flags value
1570 regress_global_get_flags_out (RegressTestFlags *v)
1572 *v = REGRESS_TEST_FLAG1 | REGRESS_TEST_FLAG3;
1578 regress_test_error_get_type (void)
1580 static GType etype = 0;
1581 if (G_UNLIKELY(etype == 0)) {
1582 static const GEnumValue values[] = {
1583 { REGRESS_TEST_ERROR_CODE1, "REGRESS_TEST_ERROR_CODE1", "code1" },
1584 { REGRESS_TEST_ERROR_CODE2, "REGRESS_TEST_ERROR_CODE2", "code2" },
1585 { REGRESS_TEST_ERROR_CODE3, "REGRESS_TEST_ERROR_CODE3", "code3" },
1588 etype = g_enum_register_static (g_intern_static_string ("RegressTestError"), values);
1595 regress_test_error_quark (void)
1597 return g_quark_from_static_string ("regress-test-error");
1601 regress_test_abc_error_get_type (void)
1603 static GType etype = 0;
1604 if (G_UNLIKELY(etype == 0)) {
1605 static const GEnumValue values[] = {
1606 { REGRESS_TEST_ABC_ERROR_CODE1, "REGRESS_TEST_ABC_ERROR_CODE1", "code1" },
1607 { REGRESS_TEST_ABC_ERROR_CODE2, "REGRESS_TEST_ABC_ERROR_CODE2", "code2" },
1608 { REGRESS_TEST_ABC_ERROR_CODE3, "REGRESS_TEST_ABC_ERROR_CODE3", "code3" },
1611 etype = g_enum_register_static (g_intern_static_string ("RegressTestABCError"), values);
1618 regress_test_abc_error_quark (void)
1620 return g_quark_from_static_string ("regress-test-abc-error");
1624 regress_test_unconventional_error_get_type (void)
1626 static GType etype = 0;
1627 if (G_UNLIKELY(etype == 0)) {
1628 static const GEnumValue values[] = {
1629 { REGRESS_TEST_OTHER_ERROR_CODE1, "REGRESS_TEST_OTHER_ERROR_CODE1", "code1" },
1630 { REGRESS_TEST_OTHER_ERROR_CODE2, "REGRESS_TEST_OTHER_ERROR_CODE2", "code2" },
1631 { REGRESS_TEST_OTHER_ERROR_CODE3, "REGRESS_TEST_OTHER_ERROR_CODE3", "code3" },
1634 etype = g_enum_register_static (g_intern_static_string ("RegressTestOtherError"), values);
1641 regress_test_unconventional_error_quark (void)
1643 return g_quark_from_static_string ("regress-test-other-error");
1648 regress_test_def_error_quark (void)
1650 return g_quark_from_static_string ("regress-test-def-error");
1654 regress_atest_error_quark (void)
1656 return g_quark_from_static_string ("regress-atest-error");
1660 regress_unpaired_error_quark (void)
1662 return g_quark_from_static_string ("regress-unpaired-error");
1666 regress_throw_unpaired (GError **error)
1668 g_set_error_literal (error, regress_unpaired_error_quark (), 0,
1676 * regress_test_struct_a_clone:
1678 * @a_out: (out caller-allocates): the cloned structure
1680 * Make a copy of a RegressTestStructA
1683 regress_test_struct_a_clone (RegressTestStructA *a,
1684 RegressTestStructA *a_out)
1690 * regress_test_struct_a_parse:
1691 * @a_out: (out caller-allocates): the structure that is to be filled
1695 regress_test_struct_a_parse (RegressTestStructA *a_out,
1696 const gchar *string)
1698 a_out->some_int = 23;
1702 * regress_test_struct_b_clone:
1704 * @b_out: (out): the cloned structure
1706 * Make a copy of a RegressTestStructB
1709 regress_test_struct_b_clone (RegressTestStructB *b,
1710 RegressTestStructB *b_out)
1715 /* plain-old-data boxed types */
1717 RegressTestSimpleBoxedA *
1718 regress_test_simple_boxed_a_copy (RegressTestSimpleBoxedA *a)
1720 RegressTestSimpleBoxedA *new_a = g_slice_new (RegressTestSimpleBoxedA);
1728 regress_test_simple_boxed_a_free (RegressTestSimpleBoxedA *a)
1730 g_slice_free (RegressTestSimpleBoxedA, a);
1734 regress_test_simple_boxed_a_get_gtype (void)
1736 static GType our_type = 0;
1739 our_type = g_boxed_type_register_static (g_intern_static_string ("RegressTestSimpleBoxedA"),
1740 (GBoxedCopyFunc)regress_test_simple_boxed_a_copy,
1741 (GBoxedFreeFunc)regress_test_simple_boxed_a_free);
1745 RegressTestSimpleBoxedB *
1746 regress_test_simple_boxed_b_copy (RegressTestSimpleBoxedB *b)
1748 RegressTestSimpleBoxedB *new_b = g_slice_new (RegressTestSimpleBoxedB);
1756 regress_test_simple_boxed_a_equals (RegressTestSimpleBoxedA *a,
1757 RegressTestSimpleBoxedA *other_a)
1759 return (a->some_int == other_a->some_int &&
1760 a->some_int8 == other_a->some_int8 &&
1761 a->some_double == other_a->some_double);
1764 const RegressTestSimpleBoxedA*
1765 regress_test_simple_boxed_a_const_return (void)
1767 static RegressTestSimpleBoxedA simple_a = {
1775 regress_test_simple_boxed_b_free (RegressTestSimpleBoxedB *a)
1777 g_slice_free (RegressTestSimpleBoxedB, a);
1781 regress_test_simple_boxed_b_get_type (void)
1783 static GType our_type = 0;
1786 our_type = g_boxed_type_register_static (g_intern_static_string ("RegressTestSimpleBoxedB"),
1787 (GBoxedCopyFunc)regress_test_simple_boxed_b_copy,
1788 (GBoxedFreeFunc)regress_test_simple_boxed_b_free);
1794 struct _RegressTestBoxedPrivate
1800 * regress_test_boxed_new:
1802 * Returns: (transfer full):
1805 regress_test_boxed_new (void)
1807 RegressTestBoxed *boxed = g_slice_new0(RegressTestBoxed);
1808 boxed->priv = g_slice_new0(RegressTestBoxedPrivate);
1809 boxed->priv->magic = 0xdeadbeef;
1815 * regress_test_boxed_new_alternative_constructor1:
1817 * Returns: (transfer full):
1820 regress_test_boxed_new_alternative_constructor1 (int i)
1822 RegressTestBoxed *boxed = g_slice_new0(RegressTestBoxed);
1823 boxed->priv = g_slice_new0(RegressTestBoxedPrivate);
1824 boxed->priv->magic = 0xdeadbeef;
1825 boxed->some_int8 = i;
1831 * regress_test_boxed_new_alternative_constructor2:
1833 * Returns: (transfer full):
1836 regress_test_boxed_new_alternative_constructor2 (int i, int j)
1838 RegressTestBoxed *boxed = g_slice_new0(RegressTestBoxed);
1839 boxed->priv = g_slice_new0(RegressTestBoxedPrivate);
1840 boxed->priv->magic = 0xdeadbeef;
1841 boxed->some_int8 = i + j;
1847 * regress_test_boxed_new_alternative_constructor3:
1849 * Returns: (transfer full):
1852 regress_test_boxed_new_alternative_constructor3 (char *s)
1854 RegressTestBoxed *boxed = g_slice_new0(RegressTestBoxed);
1855 boxed->priv = g_slice_new0(RegressTestBoxedPrivate);
1856 boxed->priv->magic = 0xdeadbeef;
1857 boxed->some_int8 = atoi(s);
1863 * regress_test_boxed_copy:
1865 * Returns: (transfer full):
1868 regress_test_boxed_copy (RegressTestBoxed *boxed)
1870 RegressTestBoxed *new_boxed = regress_test_boxed_new();
1871 RegressTestBoxedPrivate *save;
1873 save = new_boxed->priv;
1874 *new_boxed = *boxed;
1875 new_boxed->priv = save;
1881 regress_test_boxed_equals (RegressTestBoxed *boxed,
1882 RegressTestBoxed *other)
1884 return (other->some_int8 == boxed->some_int8 &&
1885 regress_test_simple_boxed_a_equals(&other->nested_a, &boxed->nested_a));
1889 regress_test_boxed_free (RegressTestBoxed *boxed)
1891 g_assert (boxed->priv->magic == 0xdeadbeef);
1893 g_slice_free (RegressTestBoxedPrivate, boxed->priv);
1894 g_slice_free (RegressTestBoxed, boxed);
1898 regress_test_boxed_get_type (void)
1900 static GType our_type = 0;
1903 our_type = g_boxed_type_register_static (g_intern_static_string ("RegressTestBoxed"),
1904 (GBoxedCopyFunc)regress_test_boxed_copy,
1905 (GBoxedFreeFunc)regress_test_boxed_free);
1910 regress_test_boxed_b_new (gint8 some_int8, glong some_long)
1912 RegressTestBoxedB *boxed;
1914 boxed = g_slice_new (RegressTestBoxedB);
1915 boxed->some_int8 = some_int8;
1916 boxed->some_long = some_long;
1922 regress_test_boxed_b_copy (RegressTestBoxedB *boxed)
1924 return regress_test_boxed_b_new (boxed->some_int8, boxed->some_long);
1928 regress_test_boxed_b_free (RegressTestBoxedB *boxed)
1930 g_slice_free (RegressTestBoxedB, boxed);
1933 G_DEFINE_BOXED_TYPE(RegressTestBoxedB,
1934 regress_test_boxed_b,
1935 regress_test_boxed_b_copy,
1936 regress_test_boxed_b_free);
1939 regress_test_boxed_c_new (void)
1941 RegressTestBoxedC *boxed;
1943 boxed = g_slice_new (RegressTestBoxedC);
1944 boxed->refcount = 1;
1945 boxed->another_thing = 42; /* what else */
1950 static RegressTestBoxedC *
1951 regress_test_boxed_c_ref (RegressTestBoxedC *boxed)
1953 g_atomic_int_inc (&boxed->refcount);
1958 regress_test_boxed_c_unref (RegressTestBoxedC *boxed)
1960 if (g_atomic_int_dec_and_test (&boxed->refcount)) {
1961 g_slice_free (RegressTestBoxedC, boxed);
1965 G_DEFINE_BOXED_TYPE(RegressTestBoxedC,
1966 regress_test_boxed_c,
1967 regress_test_boxed_c_ref,
1968 regress_test_boxed_c_unref);
1970 struct _RegressTestBoxedD {
1976 regress_test_boxed_d_new (const char *a_string, int a_int)
1978 RegressTestBoxedD *boxed;
1980 boxed = g_slice_new (RegressTestBoxedD);
1981 boxed->a_string = g_strdup (a_string);
1982 boxed->a_int = a_int;
1988 regress_test_boxed_d_copy (RegressTestBoxedD *boxed)
1990 RegressTestBoxedD *ret;
1992 ret = g_slice_new (RegressTestBoxedD);
1993 ret->a_string = g_strdup (boxed->a_string);
1994 ret->a_int = boxed->a_int;
2000 regress_test_boxed_d_free (RegressTestBoxedD *boxed)
2002 g_free (boxed->a_string);
2003 g_slice_free (RegressTestBoxedD, boxed);
2007 regress_test_boxed_d_get_magic (RegressTestBoxedD *boxed)
2009 return strlen (boxed->a_string) + boxed->a_int;
2012 G_DEFINE_BOXED_TYPE(RegressTestBoxedD,
2013 regress_test_boxed_d,
2014 regress_test_boxed_d_copy,
2015 regress_test_boxed_d_free);
2017 G_DEFINE_TYPE(RegressTestObj, regress_test_obj, G_TYPE_OBJECT);
2021 PROP_TEST_OBJ_BARE = 1,
2022 PROP_TEST_OBJ_BOXED,
2023 PROP_TEST_OBJ_HASH_TABLE,
2025 PROP_TEST_OBJ_HASH_TABLE_OLD,
2026 PROP_TEST_OBJ_LIST_OLD,
2028 PROP_TEST_OBJ_FLOAT,
2029 PROP_TEST_OBJ_DOUBLE,
2030 PROP_TEST_OBJ_STRING,
2035 regress_test_obj_set_property (GObject *object,
2037 const GValue *value,
2040 RegressTestObj *self = REGRESS_TEST_OBJECT (object);
2043 switch (property_id)
2045 case PROP_TEST_OBJ_BARE:
2046 regress_test_obj_set_bare (self, g_value_get_object (value));
2049 case PROP_TEST_OBJ_BOXED:
2051 regress_test_boxed_free (self->boxed);
2052 self->boxed = g_value_dup_boxed (value);
2055 case PROP_TEST_OBJ_HASH_TABLE:
2056 case PROP_TEST_OBJ_HASH_TABLE_OLD:
2057 if (self->hash_table)
2058 g_hash_table_unref (self->hash_table);
2059 self->hash_table = g_hash_table_ref (g_value_get_boxed (value));
2062 case PROP_TEST_OBJ_LIST:
2063 case PROP_TEST_OBJ_LIST_OLD:
2064 if (self->list != NULL)
2066 for (list = self->list; list != NULL; list = g_list_next (list))
2067 g_free (list->data);
2068 g_list_free (self->list);
2071 for (list = g_value_get_pointer (value); list != NULL; list = g_list_next (list))
2072 self->list = g_list_append (self->list, g_strdup (list->data));
2075 case PROP_TEST_OBJ_INT:
2076 self->some_int8 = g_value_get_int (value);
2079 case PROP_TEST_OBJ_FLOAT:
2080 self->some_float = g_value_get_float (value);
2083 case PROP_TEST_OBJ_DOUBLE:
2084 self->some_double = g_value_get_double (value);
2087 case PROP_TEST_OBJ_STRING:
2088 self->string = g_value_dup_string (value);
2091 case PROP_TEST_OBJ_GTYPE:
2092 self->gtype = g_value_get_gtype (value);
2096 /* We don't have any other property... */
2097 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
2103 regress_test_obj_get_property (GObject *object,
2108 RegressTestObj *self = REGRESS_TEST_OBJECT (object);
2110 switch (property_id)
2112 case PROP_TEST_OBJ_BARE:
2113 g_value_set_object (value, self->bare);
2116 case PROP_TEST_OBJ_BOXED:
2117 g_value_set_boxed (value, self->boxed);
2120 case PROP_TEST_OBJ_HASH_TABLE:
2121 case PROP_TEST_OBJ_HASH_TABLE_OLD:
2122 if (self->hash_table != NULL)
2123 g_hash_table_ref (self->hash_table);
2124 g_value_set_boxed (value, self->hash_table);
2127 case PROP_TEST_OBJ_LIST:
2128 case PROP_TEST_OBJ_LIST_OLD:
2129 g_value_set_pointer (value, self->list);
2132 case PROP_TEST_OBJ_INT:
2133 g_value_set_int (value, self->some_int8);
2136 case PROP_TEST_OBJ_FLOAT:
2137 g_value_set_float (value, self->some_float);
2140 case PROP_TEST_OBJ_DOUBLE:
2141 g_value_set_double (value, self->some_double);
2144 case PROP_TEST_OBJ_STRING:
2145 g_value_set_string (value, self->string);
2148 case PROP_TEST_OBJ_GTYPE:
2149 g_value_set_gtype (value, self->gtype);
2153 /* We don't have any other property... */
2154 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
2160 regress_test_obj_dispose (GObject *gobject)
2162 RegressTestObj *self = REGRESS_TEST_OBJECT (gobject);
2166 g_object_unref (self->bare);
2173 regress_test_boxed_free (self->boxed);
2177 /* Chain up to the parent class */
2178 G_OBJECT_CLASS (regress_test_obj_parent_class)->dispose (gobject);
2182 regress_test_obj_default_matrix (RegressTestObj *obj, const char *somestr)
2188 REGRESS_TEST_OBJ_SIGNAL_SIG_NEW_WITH_ARRAY_PROP,
2189 REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_HASH_PROP,
2190 REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_STRV,
2191 REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_OBJ,
2192 REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_FOREIGN_STRUCT,
2193 REGRESS_TEST_OBJ_SIGNAL_FIRST,
2194 REGRESS_TEST_OBJ_SIGNAL_CLEANUP,
2195 REGRESS_TEST_OBJ_SIGNAL_ALL,
2196 REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_INT64_PROP,
2197 REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_UINT64_PROP,
2198 N_REGRESS_TEST_OBJ_SIGNALS
2201 static guint regress_test_obj_signals[N_REGRESS_TEST_OBJ_SIGNALS] = { 0 };
2204 regress_test_obj_class_init (RegressTestObjClass *klass)
2206 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
2208 GType param_types[1];
2210 klass->test_signal =
2211 g_signal_newv ("test",
2212 G_TYPE_FROM_CLASS (gobject_class),
2213 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
2215 NULL /* accumulator */,
2216 NULL /* accumulator data */,
2217 g_cclosure_marshal_VOID__VOID,
2218 G_TYPE_NONE /* return_type */,
2220 NULL /* param_types */);
2222 param_types[0] = regress_test_simple_boxed_a_get_gtype() | G_SIGNAL_TYPE_STATIC_SCOPE;
2223 klass->test_signal_with_static_scope_arg =
2224 g_signal_newv ("test-with-static-scope-arg",
2225 G_TYPE_FROM_CLASS (gobject_class),
2226 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
2228 NULL /* accumulator */,
2229 NULL /* accumulator data */,
2230 g_cclosure_marshal_VOID__BOXED,
2231 G_TYPE_NONE /* return_type */,
2236 * RegressTestObj::sig-with-array-prop:
2238 * @arr: (type GArray) (element-type uint): numbers
2240 * This test signal is like TelepathyGlib's
2241 * TpChannel:: group-members-changed-detailed:
2243 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_SIG_NEW_WITH_ARRAY_PROP] =
2244 g_signal_new ("sig-with-array-prop",
2245 G_TYPE_FROM_CLASS (gobject_class),
2250 g_cclosure_marshal_VOID__BOXED,
2256 * RegressTestObj::sig-with-hash-prop:
2258 * @hash: (element-type utf8 GObject.Value):
2260 * This test signal is like TelepathyGlib's
2261 * TpAccount::status-changed
2263 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_HASH_PROP] =
2264 g_signal_new ("sig-with-hash-prop",
2265 G_TYPE_FROM_CLASS (gobject_class),
2270 g_cclosure_marshal_VOID__BOXED,
2276 * RegressTestObj::sig-with-strv:
2280 * Test GStrv as a param.
2282 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_STRV] =
2283 g_signal_new ("sig-with-strv",
2284 G_TYPE_FROM_CLASS (gobject_class),
2289 g_cclosure_marshal_VOID__BOXED,
2295 * RegressTestObj::sig-with-obj:
2297 * @obj: (transfer none): A newly created RegressTestObj
2299 * Test transfer none GObject as a param (tests refcounting).
2300 * Use with regress_test_obj_emit_sig_with_obj
2302 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_OBJ] =
2303 g_signal_new ("sig-with-obj",
2304 G_TYPE_FROM_CLASS (gobject_class),
2309 g_cclosure_marshal_VOID__OBJECT,
2315 * RegressTestObj::sig-with-foreign-struct:
2317 * @cr: (transfer none): A cairo context.
2319 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_FOREIGN_STRUCT] =
2320 g_signal_new ("sig-with-foreign-struct",
2321 G_TYPE_FROM_CLASS (gobject_class),
2329 CAIRO_GOBJECT_TYPE_CONTEXT);
2331 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_FIRST] =
2332 g_signal_new ("first",
2333 G_TYPE_FROM_CLASS (gobject_class),
2338 g_cclosure_marshal_VOID__VOID,
2342 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_CLEANUP] =
2343 g_signal_new ("cleanup",
2344 G_TYPE_FROM_CLASS (gobject_class),
2345 G_SIGNAL_RUN_CLEANUP,
2349 g_cclosure_marshal_VOID__VOID,
2353 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_ALL] =
2354 g_signal_new ("all",
2355 G_TYPE_FROM_CLASS (gobject_class),
2356 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_ACTION | G_SIGNAL_NO_HOOKS,
2360 g_cclosure_marshal_VOID__VOID,
2365 * RegressTestObj::sig-with-int64-prop:
2369 * You can use this with regress_test_obj_emit_sig_with_int64, or raise from
2370 * the introspection client langage.
2372 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_INT64_PROP] =
2373 g_signal_new ("sig-with-int64-prop",
2374 G_TYPE_FROM_CLASS (gobject_class),
2379 g_cclosure_marshal_VOID__BOXED,
2385 * RegressTestObj::sig-with-uint64-prop:
2389 * You can use this with regress_test_obj_emit_sig_with_uint64, or raise from
2390 * the introspection client langage.
2392 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_UINT64_PROP] =
2393 g_signal_new ("sig-with-uint64-prop",
2394 G_TYPE_FROM_CLASS (gobject_class),
2399 g_cclosure_marshal_VOID__BOXED,
2404 gobject_class->set_property = regress_test_obj_set_property;
2405 gobject_class->get_property = regress_test_obj_get_property;
2406 gobject_class->dispose = regress_test_obj_dispose;
2408 pspec = g_param_spec_object ("bare",
2410 "A contained object",
2413 g_object_class_install_property (gobject_class,
2417 pspec = g_param_spec_boxed ("boxed",
2419 "A contained boxed struct",
2420 REGRESS_TEST_TYPE_BOXED,
2422 g_object_class_install_property (gobject_class,
2423 PROP_TEST_OBJ_BOXED,
2427 * RegressTestObj:hash-table:
2429 * Type: GLib.HashTable(utf8,gint8)
2430 * Transfer: container
2432 pspec = g_param_spec_boxed ("hash-table",
2433 "GHashTable property",
2434 "A contained GHashTable",
2437 g_object_class_install_property (gobject_class,
2438 PROP_TEST_OBJ_HASH_TABLE,
2442 * RegressTestObj:list:
2444 * Type: GLib.List(utf8)
2447 pspec = g_param_spec_pointer ("list",
2449 "A contained GList",
2451 g_object_class_install_property (gobject_class,
2456 * RegressTestObj:hash-table-old:
2458 * Type: GLib.HashTable<utf8,gint8>
2459 * Transfer: container
2461 pspec = g_param_spec_boxed ("hash-table-old",
2462 "GHashTable property with <>",
2463 "A contained GHashTable with <>",
2466 g_object_class_install_property (gobject_class,
2467 PROP_TEST_OBJ_HASH_TABLE_OLD,
2471 * RegressTestObj:list-old:
2473 * Type: GLib.List<utf8>
2476 pspec = g_param_spec_pointer ("list-old",
2477 "GList property with ()",
2478 "A contained GList with <>",
2480 g_object_class_install_property (gobject_class,
2481 PROP_TEST_OBJ_LIST_OLD,
2489 pspec = g_param_spec_int ("int",
2496 g_object_class_install_property (gobject_class,
2503 pspec = g_param_spec_float ("float",
2505 "A contained float",
2510 g_object_class_install_property (gobject_class,
2511 PROP_TEST_OBJ_FLOAT,
2517 pspec = g_param_spec_double ("double",
2519 "A contained double",
2524 g_object_class_install_property (gobject_class,
2525 PROP_TEST_OBJ_DOUBLE,
2531 pspec = g_param_spec_string ("string",
2533 "A contained string",
2536 g_object_class_install_property (gobject_class,
2537 PROP_TEST_OBJ_STRING,
2544 pspec = g_param_spec_gtype ("gtype",
2549 g_object_class_install_property (gobject_class,
2550 PROP_TEST_OBJ_GTYPE,
2553 klass->matrix = regress_test_obj_default_matrix;
2557 regress_test_obj_init (RegressTestObj *obj)
2561 obj->hash_table = NULL;
2562 obj->gtype = G_TYPE_INVALID;
2566 * regress_test_obj_new: (constructor)
2567 * @obj: A #RegressTestObj
2570 regress_test_obj_new (RegressTestObj *obj)
2572 return g_object_new (REGRESS_TEST_TYPE_OBJ, NULL);
2576 * regress_constructor: (constructor)
2580 regress_constructor (void)
2582 return g_object_new (REGRESS_TEST_TYPE_OBJ, NULL);
2586 * regress_test_obj_new_from_file:
2589 regress_test_obj_new_from_file (const char *x, GError **error)
2591 return g_object_new (REGRESS_TEST_TYPE_OBJ, NULL);
2595 * regress_test_obj_set_bare:
2596 * @bare: (allow-none):
2599 regress_test_obj_set_bare (RegressTestObj *obj, GObject *bare)
2602 g_object_unref (obj->bare);
2605 g_object_ref (obj->bare);
2609 regress_test_obj_emit_sig_with_obj (RegressTestObj *obj)
2611 RegressTestObj *obj_param = regress_constructor ();
2612 g_object_set (obj_param, "int", 3, NULL);
2613 g_signal_emit_by_name (obj, "sig-with-obj", obj_param);
2614 g_object_unref (obj_param);
2618 regress_test_obj_emit_sig_with_foreign_struct (RegressTestObj *obj)
2620 cairo_t *cr = regress_test_cairo_context_full_return ();
2621 g_signal_emit_by_name (obj, "sig-with-foreign-struct", cr);
2626 regress_test_obj_emit_sig_with_int64 (RegressTestObj *obj)
2629 RegressTestObj *obj_param = regress_constructor ();
2630 g_signal_emit_by_name (obj, "sig-with-int64-prop", G_MAXINT64, &ret);
2631 g_object_unref (obj_param);
2632 g_assert (ret == G_MAXINT64);
2636 regress_test_obj_emit_sig_with_uint64 (RegressTestObj *obj)
2639 RegressTestObj *obj_param = regress_constructor ();
2640 g_signal_emit_by_name (obj, "sig-with-uint64-prop", G_MAXUINT64, &ret);
2641 g_object_unref (obj_param);
2642 g_assert (ret == G_MAXUINT64);
2646 regress_test_obj_instance_method (RegressTestObj *obj)
2652 regress_test_obj_static_method (int x)
2658 * regress_forced_method: (method)
2659 * @obj: A #RegressTestObj
2663 regress_forced_method (RegressTestObj *obj)
2668 * regress_test_obj_torture_signature_0:
2669 * @obj: A #RegressTestObj
2679 regress_test_obj_torture_signature_0 (RegressTestObj *obj,
2689 *q = g_utf8_strlen (foo, -1) + m;
2693 * regress_test_obj_torture_signature_1:
2694 * @obj: A #RegressTestObj
2703 * This function throws an error if m is odd.
2706 regress_test_obj_torture_signature_1 (RegressTestObj *obj,
2717 *q = g_utf8_strlen (foo, -1) + m;
2720 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "m is odd");
2725 * regress_test_obj_skip_return_val:
2726 * @obj: a #RegressTestObj
2728 * @out_b: (out): A return value.
2729 * @c: Other parameter.
2730 * @inout_d: (inout): Will be incremented.
2731 * @out_sum: (out): Return value.
2734 * @error: Return location for error.
2736 * Check that the return value is skipped
2738 * Returns: (skip): %TRUE if the call succeeds, %FALSE if @error is set.
2741 regress_test_obj_skip_return_val (RegressTestObj *obj,
2753 if (inout_d != NULL)
2754 *inout_d = *inout_d + 1;
2755 if (out_sum != NULL)
2756 *out_sum = num1 + 10*num2;
2761 * regress_test_obj_skip_return_val_no_out:
2762 * @obj: a #RegressTestObj
2764 * @error: Return location for error.
2766 * Check that the return value is skipped. Succeed if a is nonzero, otherwise
2769 * Returns: (skip): %TRUE if the call succeeds, %FALSE if @error is set.
2772 regress_test_obj_skip_return_val_no_out (RegressTestObj *obj,
2777 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "a is zero");
2785 * regress_test_obj_skip_param:
2786 * @obj: A #RegressTestObj.
2788 * @out_b: (out): Return value.
2789 * @c: (skip): Other parameter.
2790 * @inout_d: (inout): Will be incremented.
2791 * @out_sum: (out): Return value.
2794 * @error: Return location for error.
2796 * Check that a parameter is skipped
2798 * Returns: %TRUE if the call succeeds, %FALSE if @error is set.
2801 regress_test_obj_skip_param (RegressTestObj *obj,
2813 if (inout_d != NULL)
2814 *inout_d = *inout_d + 1;
2815 if (out_sum != NULL)
2816 *out_sum = num1 + 10*num2;
2821 * regress_test_obj_skip_out_param:
2822 * @obj: A #RegressTestObj.
2824 * @out_b: (out) (skip): Return value.
2825 * @c: Other parameter.
2826 * @inout_d: (inout): Will be incremented.
2827 * @out_sum: (out): Return value.
2830 * @error: Return location for error.
2832 * Check that the out value is skipped
2834 * Returns: %TRUE if the call succeeds, %FALSE if @error is set.
2837 regress_test_obj_skip_out_param (RegressTestObj *obj,
2849 if (inout_d != NULL)
2850 *inout_d = *inout_d + 1;
2851 if (out_sum != NULL)
2852 *out_sum = num1 + 10*num2;
2857 * regress_test_obj_skip_inout_param:
2858 * @obj: A #RegressTestObj.
2860 * @out_b: (out): Return value.
2861 * @c: Other parameter.
2862 * @inout_d: (inout) (skip): Will be incremented.
2863 * @out_sum: (out): Return value.
2866 * @error: Return location for error.
2868 * Check that the out value is skipped
2870 * Returns: %TRUE if the call succeeds, %FALSE if @error is set.
2873 regress_test_obj_skip_inout_param (RegressTestObj *obj,
2885 if (inout_d != NULL)
2886 *inout_d = *inout_d + 1;
2887 if (out_sum != NULL)
2888 *out_sum = num1 + 10*num2;
2893 * regress_test_obj_do_matrix:
2894 * @obj: A #RegressTestObj
2895 * @somestr: Meaningless string
2897 * This method is virtual. Notably its name differs from the virtual
2898 * slot name, which makes it useful for testing bindings handle this
2904 regress_test_obj_do_matrix (RegressTestObj *obj, const char *somestr)
2906 return REGRESS_TEST_OBJ_GET_CLASS (obj)->matrix (obj, somestr);
2910 * regress_func_obj_null_in:
2911 * @obj: (allow-none): A #RegressTestObj
2914 regress_func_obj_null_in (RegressTestObj *obj)
2919 * regress_test_obj_null_out:
2920 * @obj: (allow-none) (out): A #RegressTestObj
2923 regress_test_obj_null_out (RegressTestObj **obj)
2930 * regress_test_array_fixed_out_objects:
2931 * @objs: (out) (array fixed-size=2) (transfer full): An array of #RegressTestObj
2934 regress_test_array_fixed_out_objects (RegressTestObj ***objs)
2936 RegressTestObj **values = (RegressTestObj**)g_new(gpointer, 2);
2938 values[0] = regress_constructor();
2939 values[1] = regress_constructor();
2944 typedef struct _CallbackInfo CallbackInfo;
2946 struct _CallbackInfo
2948 RegressTestCallbackUserData callback;
2949 GDestroyNotify notify;
2954 G_DEFINE_TYPE(RegressTestSubObj, regress_test_sub_obj, REGRESS_TEST_TYPE_OBJ);
2957 regress_test_sub_obj_class_init (RegressTestSubObjClass *klass)
2962 regress_test_sub_obj_init (RegressTestSubObj *obj)
2967 regress_test_sub_obj_new ()
2969 return g_object_new (REGRESS_TEST_TYPE_SUB_OBJ, NULL);
2973 regress_test_sub_obj_instance_method (RegressTestSubObj *obj)
2979 regress_test_sub_obj_unset_bare (RegressTestSubObj *obj)
2981 regress_test_obj_set_bare(REGRESS_TEST_OBJECT(obj), NULL);
2984 /* RegressTestFundamental */
2987 * regress_test_fundamental_object_ref:
2989 * Returns: (transfer full): A new #RegressTestFundamentalObject
2991 RegressTestFundamentalObject *
2992 regress_test_fundamental_object_ref (RegressTestFundamentalObject * fundamental_object)
2994 g_return_val_if_fail (fundamental_object != NULL, NULL);
2995 g_atomic_int_inc (&fundamental_object->refcount);
2997 return fundamental_object;
3001 regress_test_fundamental_object_free (RegressTestFundamentalObject * fundamental_object)
3003 RegressTestFundamentalObjectClass *mo_class;
3004 regress_test_fundamental_object_ref (fundamental_object);
3006 mo_class = REGRESS_TEST_FUNDAMENTAL_OBJECT_GET_CLASS (fundamental_object);
3007 mo_class->finalize (fundamental_object);
3009 if (G_LIKELY (g_atomic_int_dec_and_test (&fundamental_object->refcount))) {
3010 g_type_free_instance ((GTypeInstance *) fundamental_object);
3015 regress_test_fundamental_object_unref (RegressTestFundamentalObject * fundamental_object)
3017 g_return_if_fail (fundamental_object != NULL);
3018 g_return_if_fail (fundamental_object->refcount > 0);
3020 if (G_UNLIKELY (g_atomic_int_dec_and_test (&fundamental_object->refcount))) {
3021 regress_test_fundamental_object_free (fundamental_object);
3026 regress_test_fundamental_object_replace (RegressTestFundamentalObject ** olddata, RegressTestFundamentalObject * newdata)
3028 RegressTestFundamentalObject *olddata_val;
3030 g_return_if_fail (olddata != NULL);
3032 olddata_val = g_atomic_pointer_get ((gpointer *) olddata);
3034 if (olddata_val == newdata)
3038 regress_test_fundamental_object_ref (newdata);
3040 while (!g_atomic_pointer_compare_and_exchange ((gpointer *) olddata,
3041 olddata_val, newdata)) {
3042 olddata_val = g_atomic_pointer_get ((gpointer *) olddata);
3046 regress_test_fundamental_object_unref (olddata_val);
3050 regress_test_value_fundamental_object_init (GValue * value)
3052 value->data[0].v_pointer = NULL;
3056 regress_test_value_fundamental_object_free (GValue * value)
3058 if (value->data[0].v_pointer) {
3059 regress_test_fundamental_object_unref (REGRESS_TEST_FUNDAMENTAL_OBJECT_CAST (value->data[0].v_pointer));
3064 regress_test_value_fundamental_object_copy (const GValue * src_value, GValue * dest_value)
3066 if (src_value->data[0].v_pointer) {
3067 dest_value->data[0].v_pointer =
3068 regress_test_fundamental_object_ref (REGRESS_TEST_FUNDAMENTAL_OBJECT_CAST (src_value->data[0].
3071 dest_value->data[0].v_pointer = NULL;
3076 regress_test_value_fundamental_object_peek_pointer (const GValue * value)
3078 return value->data[0].v_pointer;
3082 regress_test_value_fundamental_object_collect (GValue * value,
3083 guint n_collect_values,
3084 GTypeCValue * collect_values,
3085 guint collect_flags)
3087 if (collect_values[0].v_pointer) {
3088 value->data[0].v_pointer =
3089 regress_test_fundamental_object_ref (collect_values[0].v_pointer);
3091 value->data[0].v_pointer = NULL;
3098 regress_test_value_fundamental_object_lcopy (const GValue * value,
3099 guint n_collect_values,
3100 GTypeCValue * collect_values,
3101 guint collect_flags)
3103 gpointer *fundamental_object_p = collect_values[0].v_pointer;
3105 if (!fundamental_object_p) {
3106 return g_strdup_printf ("value location for '%s' passed as NULL",
3107 G_VALUE_TYPE_NAME (value));
3110 if (!value->data[0].v_pointer)
3111 *fundamental_object_p = NULL;
3112 else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
3113 *fundamental_object_p = value->data[0].v_pointer;
3115 *fundamental_object_p = regress_test_fundamental_object_ref (value->data[0].v_pointer);
3121 regress_test_fundamental_object_finalize (RegressTestFundamentalObject * obj)
3126 static RegressTestFundamentalObject *
3127 regress_test_fundamental_object_copy_default (const RegressTestFundamentalObject * obj)
3129 g_warning ("RegressTestFundamentalObject classes must implement RegressTestFundamentalObject::copy");
3134 regress_test_fundamental_object_class_init (gpointer g_class, gpointer class_data)
3136 RegressTestFundamentalObjectClass *mo_class = REGRESS_TEST_FUNDAMENTAL_OBJECT_CLASS (g_class);
3138 mo_class->copy = regress_test_fundamental_object_copy_default;
3139 mo_class->finalize = regress_test_fundamental_object_finalize;
3143 regress_test_fundamental_object_init (GTypeInstance * instance, gpointer klass)
3145 RegressTestFundamentalObject *fundamental_object = REGRESS_TEST_FUNDAMENTAL_OBJECT_CAST (instance);
3147 fundamental_object->refcount = 1;
3151 * RegressTestFundamentalObject:
3153 * Ref Func: regress_test_fundamental_object_ref
3154 * Unref Func: regress_test_fundamental_object_unref
3155 * Set Value Func: regress_test_value_set_fundamental_object
3156 * Get Value Func: regress_test_value_get_fundamental_object
3160 regress_test_fundamental_object_get_type (void)
3162 static GType _test_fundamental_object_type = 0;
3164 if (G_UNLIKELY (_test_fundamental_object_type == 0)) {
3165 static const GTypeValueTable value_table = {
3166 regress_test_value_fundamental_object_init,
3167 regress_test_value_fundamental_object_free,
3168 regress_test_value_fundamental_object_copy,
3169 regress_test_value_fundamental_object_peek_pointer,
3171 regress_test_value_fundamental_object_collect,
3173 regress_test_value_fundamental_object_lcopy
3175 static const GTypeInfo fundamental_object_info = {
3176 sizeof (RegressTestFundamentalObjectClass),
3178 regress_test_fundamental_object_class_init,
3181 sizeof (RegressTestFundamentalObject),
3183 (GInstanceInitFunc) regress_test_fundamental_object_init,
3186 static const GTypeFundamentalInfo fundamental_object_fundamental_info = {
3187 (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE |
3188 G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE)
3191 _test_fundamental_object_type = g_type_fundamental_next ();
3192 g_type_register_fundamental (_test_fundamental_object_type, "RegressTestFundamentalObject",
3193 &fundamental_object_info, &fundamental_object_fundamental_info, G_TYPE_FLAG_ABSTRACT);
3197 return _test_fundamental_object_type;
3201 * regress_test_value_set_fundamental_object: (skip)
3203 * @fundamental_object:
3206 regress_test_value_set_fundamental_object (GValue * value, RegressTestFundamentalObject * fundamental_object)
3208 gpointer *pointer_p;
3210 g_return_if_fail (REGRESS_TEST_VALUE_HOLDS_FUNDAMENTAL_OBJECT (value));
3211 g_return_if_fail (fundamental_object == NULL || REGRESS_TEST_IS_FUNDAMENTAL_OBJECT (fundamental_object));
3213 pointer_p = &value->data[0].v_pointer;
3215 regress_test_fundamental_object_replace ((RegressTestFundamentalObject **) pointer_p, fundamental_object);
3219 * regress_test_value_get_fundamental_object: (skip)
3222 RegressTestFundamentalObject *
3223 regress_test_value_get_fundamental_object (const GValue * value)
3225 g_return_val_if_fail (REGRESS_TEST_VALUE_HOLDS_FUNDAMENTAL_OBJECT (value), NULL);
3227 return value->data[0].v_pointer;
3230 static RegressTestFundamentalObjectClass *parent_class = NULL;
3232 G_DEFINE_TYPE (RegressTestFundamentalSubObject, regress_test_fundamental_sub_object, REGRESS_TEST_TYPE_FUNDAMENTAL_OBJECT);
3234 static RegressTestFundamentalSubObject *
3235 _regress_test_fundamental_sub_object_copy (RegressTestFundamentalSubObject * fundamental_sub_object)
3237 RegressTestFundamentalSubObject *copy;
3239 copy = regress_test_fundamental_sub_object_new(NULL);
3240 copy->data = g_strdup(fundamental_sub_object->data);
3245 regress_test_fundamental_sub_object_finalize (RegressTestFundamentalSubObject * fundamental_sub_object)
3247 g_return_if_fail (fundamental_sub_object != NULL);
3249 g_free(fundamental_sub_object->data);
3250 regress_test_fundamental_object_finalize (REGRESS_TEST_FUNDAMENTAL_OBJECT (fundamental_sub_object));
3254 regress_test_fundamental_sub_object_class_init (RegressTestFundamentalSubObjectClass * klass)
3256 parent_class = g_type_class_peek_parent (klass);
3258 klass->fundamental_object_class.copy = (RegressTestFundamentalObjectCopyFunction) _regress_test_fundamental_sub_object_copy;
3259 klass->fundamental_object_class.finalize =
3260 (RegressTestFundamentalObjectFinalizeFunction) regress_test_fundamental_sub_object_finalize;
3264 regress_test_fundamental_sub_object_init(RegressTestFundamentalSubObject *object)
3270 * regress_test_fundamental_sub_object_new:
3272 RegressTestFundamentalSubObject *
3273 regress_test_fundamental_sub_object_new (const char * data)
3275 RegressTestFundamentalSubObject *object;
3277 object = (RegressTestFundamentalSubObject *) g_type_create_instance (regress_test_fundamental_sub_object_get_type());
3278 object->data = g_strdup(data);
3284 * regress_test_callback:
3285 * @callback: (scope call) (allow-none):
3289 regress_test_callback (RegressTestCallback callback)
3291 if (callback != NULL)
3297 * regress_test_multi_callback:
3298 * @callback: (scope call) (allow-none):
3302 regress_test_multi_callback (RegressTestCallback callback)
3305 if (callback != NULL) {
3314 * regress_test_array_callback:
3315 * @callback: (scope call):
3318 int regress_test_array_callback (RegressTestCallbackArray callback)
3320 static const char *strings[] = { "one", "two", "three" };
3321 static int ints[] = { -1, 0, 1, 2 };
3324 sum += callback(ints, 4, strings, 3);
3325 sum += callback(ints, 4, strings, 3);
3331 * regress_test_simple_callback:
3332 * @callback: (scope call) (allow-none):
3336 regress_test_simple_callback (RegressTestSimpleCallback callback)
3338 if (callback != NULL)
3345 * regress_test_callback_user_data:
3346 * @callback: (scope call):
3348 * Call - callback parameter persists for the duration of the method
3349 * call and can be released on return.
3352 regress_test_callback_user_data (RegressTestCallbackUserData callback,
3355 return callback(user_data);
3358 static GSList *notified_callbacks = NULL;
3361 * regress_test_callback_destroy_notify:
3362 * @callback: (scope notified):
3364 * Notified - callback persists until a DestroyNotify delegate
3368 regress_test_callback_destroy_notify (RegressTestCallbackUserData callback,
3370 GDestroyNotify notify)
3375 retval = callback(user_data);
3377 info = g_slice_new(CallbackInfo);
3378 info->callback = callback;
3379 info->notify = notify;
3380 info->user_data = user_data;
3382 notified_callbacks = g_slist_prepend(notified_callbacks, info);
3388 * regress_test_callback_destroy_notify_no_user_data:
3389 * @callback: (scope notified):
3391 * Adds a scope notified callback with no user data. This can invoke an error
3392 * condition in bindings which needs to be tested.
3395 regress_test_callback_destroy_notify_no_user_data (RegressTestCallbackUserData callback,
3396 GDestroyNotify notify)
3398 return regress_test_callback_destroy_notify(callback, NULL, notify);
3402 * regress_test_callback_thaw_notifications:
3404 * Invokes all callbacks installed by #test_callback_destroy_notify(),
3405 * adding up their return values, and removes them, invoking the
3406 * corresponding destroy notfications.
3408 * Return value: Sum of the return values of the invoked callbacks.
3411 regress_test_callback_thaw_notifications (void)
3416 for (node = notified_callbacks; node != NULL; node = node->next)
3418 CallbackInfo *info = node->data;
3419 retval += info->callback (info->user_data);
3421 info->notify (info->user_data);
3422 g_slice_free (CallbackInfo, info);
3425 g_slist_free (notified_callbacks);
3426 notified_callbacks = NULL;
3431 static GSList *async_callbacks = NULL;
3434 * regress_test_callback_async:
3435 * @callback: (scope async):
3439 regress_test_callback_async (RegressTestCallbackUserData callback,
3444 info = g_slice_new(CallbackInfo);
3445 info->callback = callback;
3446 info->user_data = user_data;
3448 async_callbacks = g_slist_prepend(async_callbacks, info);
3452 * regress_test_callback_thaw_async:
3455 regress_test_callback_thaw_async (void)
3460 for (node = async_callbacks; node != NULL; node = node->next)
3462 CallbackInfo *info = node->data;
3463 retval = info->callback (info->user_data);
3464 g_slice_free (CallbackInfo, info);
3467 g_slist_free (async_callbacks);
3468 async_callbacks = NULL;
3473 regress_test_async_ready_callback (GAsyncReadyCallback callback)
3475 GSimpleAsyncResult *result = g_simple_async_result_new (NULL, callback, NULL,
3476 regress_test_async_ready_callback);
3477 g_simple_async_result_complete_in_idle (result);
3481 * regress_test_obj_instance_method_callback:
3482 * @callback: (scope call) (allow-none):
3486 regress_test_obj_instance_method_callback (RegressTestObj *obj, RegressTestCallback callback)
3488 if (callback != NULL)
3493 * regress_test_obj_static_method_callback:
3494 * @callback: (scope call) (allow-none):
3498 regress_test_obj_static_method_callback (RegressTestCallback callback)
3500 if (callback != NULL)
3505 * regress_test_obj_new_callback:
3506 * @callback: (scope notified):
3509 regress_test_obj_new_callback (RegressTestCallbackUserData callback, gpointer user_data,
3510 GDestroyNotify notify)
3514 callback(user_data);
3516 info = g_slice_new(CallbackInfo);
3517 info->callback = callback;
3518 info->notify = notify;
3519 info->user_data = user_data;
3521 notified_callbacks = g_slist_prepend(notified_callbacks, info);
3523 return g_object_new (REGRESS_TEST_TYPE_OBJ, NULL);
3527 * regress_test_hash_table_callback:
3528 * @data: (element-type utf8 gint): GHashTable that gets passed to callback
3529 * @callback: (scope call):
3532 regress_test_hash_table_callback (GHashTable *data, RegressTestCallbackHashtable callback)
3538 * regress_test_gerror_callback:
3539 * @callback: (scope call):
3542 regress_test_gerror_callback (RegressTestCallbackGError callback)
3546 error = g_error_new_literal (G_IO_ERROR,
3547 G_IO_ERROR_NOT_SUPPORTED,
3548 "regression test error");
3550 g_error_free (error);
3554 * regress_test_null_gerror_callback:
3555 * @callback: (scope call):
3558 regress_test_null_gerror_callback (RegressTestCallbackGError callback)
3564 * regress_test_owned_gerror_callback:
3565 * @callback: (scope call):
3568 regress_test_owned_gerror_callback (RegressTestCallbackOwnedGError callback)
3572 error = g_error_new_literal (G_IO_ERROR,
3573 G_IO_ERROR_PERMISSION_DENIED,
3574 "regression test owned error");
3579 * regress_test_skip_unannotated_callback: (skip)
3580 * @callback: No annotation here
3582 * Should not emit a warning:
3583 * https://bugzilla.gnome.org/show_bug.cgi?id=685399
3586 regress_test_skip_unannotated_callback (RegressTestCallback callback)
3593 regress_test_interface_default_init(RegressTestInterfaceIface *iface)
3597 typedef RegressTestInterfaceIface RegressTestInterfaceInterface;
3598 G_DEFINE_INTERFACE (RegressTestInterface, regress_test_interface, G_TYPE_OBJECT)
3601 /* gobject with non-standard prefix */
3602 G_DEFINE_TYPE(RegressTestWi8021x, regress_test_wi_802_1x, G_TYPE_OBJECT);
3606 PROP_TEST_WI_802_1X_TESTBOOL = 1
3610 regress_test_wi_802_1x_set_property (GObject *object,
3612 const GValue *value,
3615 RegressTestWi8021x *self = REGRESS_TEST_WI_802_1X (object);
3617 switch (property_id)
3619 case PROP_TEST_WI_802_1X_TESTBOOL:
3620 regress_test_wi_802_1x_set_testbool (self, g_value_get_boolean (value));
3624 /* We don't have any other property... */
3625 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
3631 regress_test_wi_802_1x_get_property (GObject *object,
3636 RegressTestWi8021x *self = REGRESS_TEST_WI_802_1X (object);
3638 switch (property_id)
3640 case PROP_TEST_WI_802_1X_TESTBOOL:
3641 g_value_set_boolean (value, regress_test_wi_802_1x_get_testbool (self));
3645 /* We don't have any other property... */
3646 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
3652 regress_test_wi_802_1x_dispose (GObject *gobject)
3654 /* Chain up to the parent class */
3655 G_OBJECT_CLASS (regress_test_wi_802_1x_parent_class)->dispose (gobject);
3659 regress_test_wi_802_1x_class_init (RegressTestWi8021xClass *klass)
3661 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
3664 gobject_class->set_property = regress_test_wi_802_1x_set_property;
3665 gobject_class->get_property = regress_test_wi_802_1x_get_property;
3666 gobject_class->dispose = regress_test_wi_802_1x_dispose;
3668 pspec = g_param_spec_boolean ("testbool",
3669 "Nick for testbool",
3670 "Blurb for testbool",
3673 g_object_class_install_property (gobject_class,
3674 PROP_TEST_WI_802_1X_TESTBOOL,
3679 regress_test_wi_802_1x_init (RegressTestWi8021x *obj)
3681 obj->testbool = TRUE;
3684 RegressTestWi8021x *
3685 regress_test_wi_802_1x_new (void)
3687 return g_object_new (REGRESS_TEST_TYPE_WI_802_1X, NULL);
3691 regress_test_wi_802_1x_set_testbool (RegressTestWi8021x *obj, gboolean val)
3693 obj->testbool = val;
3697 regress_test_wi_802_1x_get_testbool (RegressTestWi8021x *obj)
3699 return obj->testbool;
3703 regress_test_wi_802_1x_static_method (int x)
3708 /* floating gobject */
3709 G_DEFINE_TYPE(RegressTestFloating, regress_test_floating, G_TYPE_INITIALLY_UNOWNED);
3712 regress_test_floating_finalize(GObject *object)
3714 g_assert(!g_object_is_floating (object));
3716 G_OBJECT_CLASS(regress_test_floating_parent_class)->finalize(object);
3720 regress_test_floating_class_init (RegressTestFloatingClass *klass)
3722 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
3723 gobject_class->finalize = regress_test_floating_finalize;
3727 regress_test_floating_init (RegressTestFloating *obj)
3732 * regress_test_floating_new:
3734 * Returns:: A new floating #RegressTestFloating
3736 RegressTestFloating *
3737 regress_test_floating_new (void)
3739 return g_object_new (REGRESS_TEST_TYPE_FLOATING, NULL);
3744 * regress_test_torture_signature_0:
3754 regress_test_torture_signature_0 (int x,
3763 *q = g_utf8_strlen (foo, -1) + m;
3767 * regress_test_torture_signature_1:
3776 * This function throws an error if m is odd.
3779 regress_test_torture_signature_1 (int x,
3789 *q = g_utf8_strlen (foo, -1) + m;
3792 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "m is odd");
3797 * regress_test_torture_signature_2:
3810 regress_test_torture_signature_2 (int x,
3811 RegressTestCallbackUserData callback,
3813 GDestroyNotify notify,
3822 *q = g_utf8_strlen (foo, -1) + m;
3827 * regress_test_date_in_gvalue:
3829 * Returns: (transfer full):
3832 regress_test_date_in_gvalue (void)
3834 GValue *value = g_new0 (GValue, 1);
3835 GDate *date = g_date_new_dmy (5, 12, 1984);
3837 g_value_init (value, G_TYPE_DATE);
3838 g_value_take_boxed (value, date);
3844 * regress_test_strv_in_gvalue:
3846 * Returns: (transfer full):
3849 regress_test_strv_in_gvalue (void)
3851 GValue *value = g_new0 (GValue, 1);
3852 const char *strv[] = { "one", "two", "three", NULL };
3854 g_value_init (value, G_TYPE_STRV);
3855 g_value_set_boxed (value, strv);
3861 * regress_test_multiline_doc_comments:
3863 * This is a function.
3865 * It has multiple lines in the documentation.
3869 * You will give me your credit card number.
3872 regress_test_multiline_doc_comments (void)
3877 * regress_test_nested_parameter:
3884 * <entry>Syntax</entry>
3885 * <entry>Explanation</entry>
3886 * <entry>Examples</entry>
3891 * <entry>rgb(@r, @g, @b)</entry>
3892 * <entry>An opaque color; @r, @g, @b can be either integers between
3893 * 0 and 255 or percentages</entry>
3894 * <entry><literallayout>rgb(128, 10, 54)
3895 * rgb(20%, 30%, 0%)</literallayout></entry>
3898 * <entry>rgba(@r, @g, @b, @a)</entry>
3899 * <entry>A translucent color; @r, @g, @b are as in the previous row,
3900 * @a is a floating point number between 0 and 1</entry>
3901 * <entry><literallayout>rgba(255, 255, 0, 0.5)</literallayout></entry>
3907 * What we're testing here is that the scanner ignores the @a nested inside XML.
3910 regress_test_nested_parameter (int a)
3915 * regress_introspectable_via_alias:
3919 regress_introspectable_via_alias (RegressPtrArrayAlias *data)
3924 * regress_not_introspectable_via_alias:
3928 regress_not_introspectable_via_alias (RegressVaListAlias ok)
3933 * regress_aliased_caller_alloc:
3936 void regress_aliased_caller_alloc (RegressAliasedTestBoxed *boxed)
3938 boxed->priv = g_slice_new0 (RegressTestBoxedPrivate);
3939 boxed->priv->magic = 0xdeadbeef;
3943 regress_test_struct_fixed_array_frob (RegressTestStructFixedArray *str)
3948 for (i = 0; i < G_N_ELEMENTS(str->array); i++)
3949 str->array[i] = 42 + i;
3953 * regress_has_parameter_named_attrs:
3955 * @attributes: (type guint32) (array fixed-size=32): list of attributes
3957 * This test case mirrors GnomeKeyringPasswordSchema from
3961 regress_has_parameter_named_attrs (int foo,
3962 gpointer attributes)
3967 * regress_test_versioning:
3970 * Deprecated: 1.33.3: Use foobar instead
3971 * Stability: Unstable
3974 regress_test_versioning (void)