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;
297 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 10, 10);
298 return cairo_create (surface);
302 * regress_test_cairo_context_none_in:
303 * @context: (transfer none):
306 regress_test_cairo_context_none_in (cairo_t *context)
308 cairo_surface_t *surface = cairo_get_target (context);
310 g_assert (cairo_image_surface_get_format (surface) == CAIRO_FORMAT_ARGB32);
311 g_assert (cairo_image_surface_get_width (surface) == 10);
312 g_assert (cairo_image_surface_get_height (surface) == 10);
317 * regress_test_cairo_surface_none_return:
319 * Returns: (transfer none):
322 regress_test_cairo_surface_none_return (void)
324 static cairo_surface_t *surface;
326 if (surface == NULL) {
327 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 10, 10);
334 * regress_test_cairo_surface_full_return:
336 * Returns: (transfer full):
339 regress_test_cairo_surface_full_return (void)
341 return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 10, 10);
345 * regress_test_cairo_surface_none_in:
346 * @surface: (transfer none):
349 regress_test_cairo_surface_none_in (cairo_surface_t *surface)
351 g_assert (cairo_image_surface_get_format (surface) == CAIRO_FORMAT_ARGB32);
352 g_assert (cairo_image_surface_get_width (surface) == 10);
353 g_assert (cairo_image_surface_get_height (surface) == 10);
357 * regress_test_cairo_surface_full_out:
358 * @surface: (out) (transfer full):
361 regress_test_cairo_surface_full_out (cairo_surface_t **surface)
363 *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 10, 10);
367 * regress_test_gvariant_i:
369 * Returns: (transfer none): New variant
372 regress_test_gvariant_i (void)
374 return g_variant_new_int32 (1);
378 * regress_test_gvariant_s:
380 * Returns: (transfer none): New variant
383 regress_test_gvariant_s (void)
385 return g_variant_new_string ("one");
389 * regress_test_gvariant_asv:
391 * Returns: (transfer none): New variant
394 regress_test_gvariant_asv (void)
398 g_variant_builder_init (&b, G_VARIANT_TYPE ("a{sv}"));
400 g_variant_builder_add (&b, "{sv}", "name", g_variant_new_string ("foo"));
401 g_variant_builder_add (&b, "{sv}", "timeout", g_variant_new_int32 (10));
403 return g_variant_builder_end (&b);
407 * regress_test_gvariant_v:
409 * Returns: (transfer none): New variant
412 regress_test_gvariant_v (void)
414 return g_variant_new_variant (g_variant_new_string ("contents"));
418 * regress_test_gvariant_as:
420 * Returns: (transfer none): New variant
423 regress_test_gvariant_as (void)
425 const char *as[] = { "one", "two", "three", NULL };
427 return g_variant_new_strv (as, -1);
430 /************************************************************************/
432 /* insert BLACK HEART SUIT to ensure UTF-8 doesn't get mangled */
433 static const char utf8_const[] = "const \xe2\x99\xa5 utf8";
434 static const char utf8_nonconst[] = "nonconst \xe2\x99\xa5 utf8";
437 * regress_test_utf8_const_return:
439 * Return value: UTF-8 string
442 regress_test_utf8_const_return (void)
444 /* transfer mode none */
449 * regress_test_utf8_nonconst_return:
451 * Return value: (transfer full): UTF-8 string
454 regress_test_utf8_nonconst_return (void)
456 return g_strdup (utf8_nonconst);
460 * regress_test_utf8_const_in:
464 regress_test_utf8_const_in (const char *in)
466 /* transfer mode none */
467 g_assert (strcmp (in, utf8_const) == 0);
471 * regress_test_utf8_out:
472 * @out: (out) (transfer full):
475 regress_test_utf8_out (char **out)
477 /* out parameter, transfer mode full */
478 *out = g_strdup (utf8_nonconst);
482 * regress_test_utf8_inout:
483 * @inout: (inout) (transfer full):
486 regress_test_utf8_inout (char **inout)
488 /* inout parameter, transfer mode full */
489 g_assert (strcmp (*inout, utf8_const) == 0);
490 *inout = g_strdup (utf8_nonconst);
494 * regress_test_filename_return:
496 * Return value: (element-type filename) (transfer full): list of strings
499 regress_test_filename_return (void)
501 GSList *filenames = NULL;
502 filenames = g_slist_prepend (filenames, g_filename_from_utf8("/etc/fstab", -1, NULL, NULL, NULL));
503 filenames = g_slist_prepend (filenames, g_filename_from_utf8("åäö", -1, NULL, NULL, NULL));
507 /* in arguments after out arguments */
510 * regress_test_int_out_utf8:
515 regress_test_int_out_utf8 (int *length, const char *in)
517 *length = g_utf8_strlen(in, -1);
521 /* multiple output arguments */
524 * regress_test_multi_double_args:
530 regress_test_multi_double_args (gdouble in, gdouble *one, gdouble *two)
537 * regress_test_utf8_out_out:
538 * @out0: (out) (transfer full): a copy of "first"
539 * @out1: (out) (transfer full): a copy of "second"
542 regress_test_utf8_out_out (char **out0, char **out1)
544 *out0 = g_strdup ("first");
545 *out1 = g_strdup ("second");
549 * regress_test_utf8_out_nonconst_return:
550 * @out: (out) (transfer full): a copy of "second"
552 * Returns: (transfer full): a copy of "first"
555 regress_test_utf8_out_nonconst_return (char **out)
557 *out = g_strdup ("second");
558 return g_strdup ("first");
562 * regress_test_utf8_null_in:
566 regress_test_utf8_null_in (char *in)
568 g_assert (in == NULL);
572 * regress_test_utf8_null_out:
573 * @char_out: (allow-none) (out):
575 void regress_test_utf8_null_out (char **char_out)
581 /* non-basic-types */
583 static const char *test_sequence[] = {"1", "2", "3"};
588 * regress_test_array_int_in:
590 * @ints: (array length=n_ints): List of ints
593 regress_test_array_int_in (int n_ints, int *ints)
596 for (i = 0; i < n_ints; i++)
602 * regress_test_array_int_out:
603 * @n_ints: (out): the length of @ints
604 * @ints: (out) (array length=n_ints) (transfer full): a list of 5 integers, from 0 to 4 in consecutive order
607 regress_test_array_int_out (int *n_ints, int **ints)
611 *ints = g_malloc0(sizeof(**ints) * *n_ints);
612 for (i = 1; i < *n_ints; i++)
613 (*ints)[i] = (*ints)[i-1] + 1;
617 * regress_test_array_int_inout:
618 * @n_ints: (inout): the length of @ints
619 * @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
622 regress_test_array_int_inout (int *n_ints, int **ints)
630 new_ints = g_malloc(sizeof(**ints) * *n_ints);
631 for (i = 0; i < *n_ints; i++)
632 new_ints[i] = (*ints)[i + 1] + 1;
638 * regress_test_array_gint8_in:
640 * @ints: (array length=n_ints): List of ints
643 regress_test_array_gint8_in (int n_ints, gint8 *ints)
646 for (i = 0; i < n_ints; i++)
652 * regress_test_array_gint16_in:
654 * @ints: (array length=n_ints): List of ints
657 regress_test_array_gint16_in (int n_ints, gint16 *ints)
660 for (i = 0; i < n_ints; i++)
666 * regress_test_array_gint32_in:
668 * @ints: (array length=n_ints): List of ints
671 regress_test_array_gint32_in (int n_ints, gint32 *ints)
675 for (i = 0; i < n_ints; i++)
681 * regress_test_array_gint64_in:
683 * @ints: (array length=n_ints): List of ints
686 regress_test_array_gint64_in (int n_ints, gint64 *ints)
690 for (i = 0; i < n_ints; i++)
696 * regress_test_strv_in:
697 * @arr: (array zero-terminated=1) (transfer none):
700 regress_test_strv_in (char **arr)
702 if (g_strv_length (arr) != 3)
704 if (strcmp (arr[0], "1") != 0)
706 if (strcmp (arr[1], "2") != 0)
708 if (strcmp (arr[2], "3") != 0)
714 * regress_test_array_gtype_in:
716 * @types: (array length=n_types): List of types
718 * Return value: (transfer full): string representation of provided types
721 regress_test_array_gtype_in (int n_types, GType *types)
726 string = g_string_new ("[");
727 for (i = 0; i < n_types; i++)
729 g_string_append (string, g_type_name (types[i]));
730 g_string_append_c (string, ',');
732 g_string_append_c (string, ']');
733 return g_string_free (string, FALSE);
737 * regress_test_strv_out:
739 * Returns: (transfer full):
742 regress_test_strv_out (void)
746 char **ret = g_new (char *, n);
747 ret[i++] = g_strdup ("thanks");
748 ret[i++] = g_strdup ("for");
749 ret[i++] = g_strdup ("all");
750 ret[i++] = g_strdup ("the");
751 ret[i++] = g_strdup ("fish");
758 * regress_test_strv_out_container:
760 * Return value: (array zero-terminated=1) (transfer container):
763 regress_test_strv_out_container (void)
765 char **ret = g_new (char *, 4);
774 * regress_test_strv_outarg:
775 * @retp: (array zero-terminated=1) (out) (transfer container):
778 regress_test_strv_outarg (char ***retp)
780 char **ret = g_new (char *, 4);
789 * regress_test_array_fixed_size_int_in:
790 * @ints: (array fixed-size=5): a list of 5 integers
792 * Returns: the sum of the items in @ints
795 regress_test_array_fixed_size_int_in (int *ints)
798 for (i = 0; i < 5; i++)
804 * regress_test_array_fixed_size_int_out:
805 * @ints: (out) (array fixed-size=5) (transfer full): a list of 5 integers ranging from 0 to 4
808 regress_test_array_fixed_size_int_out (int **ints)
811 *ints = g_malloc0(sizeof(**ints) * 5);
812 for (i = 1; i < 5; i++)
813 (*ints)[i] = (*ints)[i-1] + 1;
817 * regress_test_array_fixed_size_int_return:
819 * Returns: (array fixed-size=5) (transfer full): a list of 5 integers ranging from 0 to 4
822 regress_test_array_fixed_size_int_return (void)
825 ints = g_malloc0(sizeof(*ints) * 5);
826 for (i = 1; i < 5; i++)
827 ints[i] = ints[i-1] + 1;
832 * regress_test_strv_out_c:
834 * Returns: (transfer none):
837 regress_test_strv_out_c (void)
839 static char **ret = NULL;
842 ret = regress_test_strv_out ();
844 return (const char * const *) ret;
848 * regress_test_array_int_full_out:
849 * @len: length of the returned array.
851 * Returns: (array length=len) (transfer full): a new array of integers.
854 regress_test_array_int_full_out(int *len)
858 result = g_malloc0(sizeof(*result) * (*len));
859 for (i=1; i < (*len); i++)
860 result[i] = result[i-1] + 1;
865 * regress_test_array_int_none_out:
866 * @len: length of the returned array.
868 * Returns: (array length=len) (transfer none): a static array of integers.
871 regress_test_array_int_none_out(int *len)
873 static int result[5] = { 1, 2, 3, 4, 5 };
879 * regress_test_array_int_null_in:
880 * @arr: (array length=len) (allow-none):
884 regress_test_array_int_null_in (int *arr, int len)
886 g_assert (arr == NULL);
890 * regress_test_array_int_null_out:
891 * @arr: (out) (array length=len) (allow-none):
892 * @len: (out) : length
895 regress_test_array_int_null_out (int **arr, int *len)
903 /************************************************************************/
906 static /*const*/ GList *
907 regress_test_sequence_list()
909 static GList *list = NULL;
912 for (i = 0; i < G_N_ELEMENTS(test_sequence); ++i) {
913 list = g_list_prepend (list, (gpointer)test_sequence[i]);
915 list = g_list_reverse (list);
921 * regress_test_glist_nothing_return:
923 * Return value: (element-type utf8) (transfer none):
926 regress_test_glist_nothing_return (void)
928 return regress_test_sequence_list ();
932 * regress_test_glist_nothing_return2:
934 * Return value: (element-type utf8) (transfer none):
937 regress_test_glist_nothing_return2 (void)
939 return regress_test_sequence_list ();
943 * regress_test_glist_container_return:
945 * Return value: (element-type utf8) (transfer container):
948 regress_test_glist_container_return (void)
950 return g_list_copy (regress_test_sequence_list ());
954 * regress_test_glist_everything_return:
956 * Return value: (element-type utf8) (transfer full):
959 regress_test_glist_everything_return (void)
964 list = g_list_copy (regress_test_sequence_list ());
965 for (l = list; l != NULL; l = l->next)
966 l->data = g_strdup (l->data);
971 regress_assert_test_sequence_list (const GList *in)
976 for (i = 0, l = in; l != NULL; ++i, l = l->next) {
977 g_assert (i < G_N_ELEMENTS(test_sequence));
978 g_assert (strcmp (l->data, test_sequence[i]) == 0);
980 g_assert (i == G_N_ELEMENTS(test_sequence));
984 * regress_test_glist_nothing_in:
985 * @in: (element-type utf8):
988 regress_test_glist_nothing_in (const GList *in)
990 regress_assert_test_sequence_list (in);
994 * regress_test_glist_nothing_in2:
995 * @in: (element-type utf8):
998 regress_test_glist_nothing_in2 (GList *in)
1000 regress_assert_test_sequence_list (in);
1004 * regress_test_glist_null_in:
1005 * @in: (element-type utf8) (allow-none):
1008 regress_test_glist_null_in (GSList *in)
1010 g_assert (in == NULL);
1014 * regress_test_glist_null_out:
1015 * @out_list: (out) (element-type utf8) (allow-none):
1018 regress_test_glist_null_out (GSList **out_list)
1024 /************************************************************************/
1027 static /*const*/ GSList *
1028 regress_test_sequence_slist()
1030 static GSList *list = NULL;
1033 for (i = 0; i < G_N_ELEMENTS(test_sequence); ++i) {
1034 list = g_slist_prepend (list, (gpointer)test_sequence[i]);
1036 list = g_slist_reverse (list);
1042 * regress_test_gslist_nothing_return:
1044 * Return value: (element-type utf8) (transfer none):
1047 regress_test_gslist_nothing_return (void)
1049 return regress_test_sequence_slist ();
1053 * regress_test_gslist_nothing_return2:
1055 * Return value: (element-type utf8) (transfer none):
1058 regress_test_gslist_nothing_return2 (void)
1060 return regress_test_sequence_slist ();
1064 * regress_test_gslist_container_return:
1066 * Return value: (element-type utf8) (transfer container):
1069 regress_test_gslist_container_return (void)
1071 return g_slist_copy (regress_test_sequence_slist ());
1075 * regress_test_gslist_everything_return:
1077 * Return value: (element-type utf8) (transfer full):
1080 regress_test_gslist_everything_return (void)
1085 list = g_slist_copy (regress_test_sequence_slist ());
1086 for (l = list; l != NULL; l = l->next)
1087 l->data = g_strdup (l->data);
1092 regress_assert_test_sequence_slist (const GSList *in)
1097 for (i = 0, l = in; l != NULL; ++i, l = l->next) {
1098 g_assert (i < G_N_ELEMENTS(test_sequence));
1099 g_assert (strcmp (l->data, test_sequence[i]) == 0);
1101 g_assert (i == G_N_ELEMENTS(test_sequence));
1105 * regress_test_gslist_nothing_in:
1106 * @in: (element-type utf8):
1109 regress_test_gslist_nothing_in (const GSList *in)
1111 regress_assert_test_sequence_slist (in);
1115 * regress_test_gslist_nothing_in2:
1116 * @in: (element-type utf8):
1119 regress_test_gslist_nothing_in2 (GSList *in)
1121 regress_assert_test_sequence_slist (in);
1125 * regress_test_gslist_null_in:
1126 * @in: (element-type utf8) (allow-none):
1129 regress_test_gslist_null_in (GSList *in)
1131 g_assert (in == NULL);
1135 * regress_test_gslist_null_out:
1136 * @out_list: (out) (element-type utf8) (allow-none):
1139 regress_test_gslist_null_out (GSList **out_list)
1144 /************************************************************************/
1147 static char *table_data[3][2] = {
1148 { "foo", "bar" }, { "baz", "bat" }, { "qux", "quux" }
1152 regress_test_table_ghash_new_container()
1156 hash = g_hash_table_new(g_str_hash, g_str_equal);
1158 g_hash_table_insert(hash, table_data[i][0], table_data[i][1]);
1163 regress_test_table_ghash_new_full()
1167 hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
1169 g_hash_table_insert(hash,
1170 g_strdup(table_data[i][0]),
1171 g_strdup(table_data[i][1]));
1175 static /*const*/ GHashTable *
1176 regress_test_table_ghash_const()
1178 static GHashTable *hash = NULL;
1180 hash = regress_test_table_ghash_new_container();
1186 * regress_test_ghash_null_return:
1188 * Return value: (element-type utf8 utf8) (transfer none) (allow-none):
1191 regress_test_ghash_null_return (void)
1197 * regress_test_ghash_nothing_return:
1199 * Return value: (element-type utf8 utf8) (transfer none):
1202 regress_test_ghash_nothing_return (void)
1204 return regress_test_table_ghash_const ();
1208 * regress_test_ghash_nothing_return2:
1210 * Return value: (element-type utf8 utf8) (transfer none):
1213 regress_test_ghash_nothing_return2 (void)
1215 return regress_test_table_ghash_const ();
1219 g_value_new (GType type)
1221 GValue *value = g_slice_new0(GValue);
1222 g_value_init(value, type);
1227 g_value_free (GValue *value)
1229 g_value_unset(value);
1230 g_slice_free(GValue, value);
1233 static const gchar *string_array[] = {
1241 * regress_test_ghash_gvalue_return:
1243 * Return value: (element-type utf8 GValue) (transfer none):
1246 regress_test_ghash_gvalue_return (void)
1250 hash = g_hash_table_new_full(g_str_hash, g_str_equal,
1251 g_free, (GDestroyNotify)g_value_free);
1253 value = g_value_new(G_TYPE_INT);
1254 g_value_set_int(value, 12);
1255 g_hash_table_insert(hash, g_strdup("integer"), value);
1257 value = g_value_new(G_TYPE_BOOLEAN);
1258 g_value_set_boolean(value, TRUE);
1259 g_hash_table_insert(hash, g_strdup("boolean"), value);
1261 value = g_value_new(G_TYPE_STRING);
1262 g_value_set_string(value, "some text");
1263 g_hash_table_insert(hash, g_strdup("string"), value);
1265 value = g_value_new(G_TYPE_STRV);
1266 g_value_set_boxed(value, string_array);
1267 g_hash_table_insert(hash, g_strdup("strings"), value);
1269 value = g_value_new(REGRESS_TEST_TYPE_FLAGS);
1270 g_value_set_flags(value, REGRESS_TEST_FLAG1 | REGRESS_TEST_FLAG3);
1271 g_hash_table_insert(hash, g_strdup("flags"), value);
1273 value = g_value_new(regress_test_enum_get_type());
1274 g_value_set_enum(value, REGRESS_TEST_VALUE2);
1275 g_hash_table_insert(hash, g_strdup("enum"), value);
1281 * regress_test_ghash_gvalue_in:
1282 * @hash: (element-type utf8 GValue): the hash table returned by
1283 * regress_test_ghash_gvalue_return().
1286 regress_test_ghash_gvalue_in (GHashTable *hash)
1289 const gchar **strings;
1292 g_assert(hash != NULL);
1294 value = g_hash_table_lookup(hash, "integer");
1295 g_assert(value != NULL);
1296 g_assert(G_VALUE_HOLDS_INT(value));
1297 g_assert(g_value_get_int(value) == 12);
1299 value = g_hash_table_lookup(hash, "boolean");
1300 g_assert(value != NULL);
1301 g_assert(G_VALUE_HOLDS_BOOLEAN(value));
1302 g_assert(g_value_get_boolean(value) == TRUE);
1304 value = g_hash_table_lookup(hash, "string");
1305 g_assert(value != NULL);
1306 g_assert(G_VALUE_HOLDS_STRING(value));
1307 g_assert(strcmp(g_value_get_string(value), "some text") == 0);
1309 value = g_hash_table_lookup(hash, "strings");
1310 g_assert(value != NULL);
1311 g_assert(G_VALUE_HOLDS(value, G_TYPE_STRV));
1312 strings = g_value_get_boxed(value);
1313 g_assert(strings != NULL);
1314 for (i = 0; string_array[i] != NULL; i++)
1315 g_assert(strcmp(strings[i], string_array[i]) == 0);
1317 value = g_hash_table_lookup(hash, "flags");
1318 g_assert(value != NULL);
1319 g_assert(G_VALUE_HOLDS_FLAGS(value));
1320 g_assert(g_value_get_flags(value) == (REGRESS_TEST_FLAG1 | REGRESS_TEST_FLAG3));
1322 value = g_hash_table_lookup(hash, "enum");
1323 g_assert(value != NULL);
1324 g_assert(G_VALUE_HOLDS_ENUM(value));
1325 g_assert(g_value_get_enum(value) == REGRESS_TEST_VALUE2);
1329 * regress_test_ghash_container_return:
1331 * Return value: (element-type utf8 utf8) (transfer container):
1334 regress_test_ghash_container_return (void)
1336 return regress_test_table_ghash_new_container ();
1340 * regress_test_ghash_everything_return:
1342 * Return value: (element-type utf8 utf8) (transfer full):
1345 regress_test_ghash_everything_return (void)
1347 return regress_test_table_ghash_new_full ();
1351 assert_test_table_ghash (const GHashTable *in)
1353 GHashTable *h = regress_test_table_ghash_const();
1354 GHashTableIter iter;
1355 gpointer key, value;
1357 g_assert(g_hash_table_size(h) ==
1358 g_hash_table_size((GHashTable*)in));
1360 g_hash_table_iter_init(&iter, (GHashTable*)in);
1361 while (g_hash_table_iter_next (&iter, &key, &value))
1362 g_assert( strcmp(g_hash_table_lookup(h, (char*)key), (char*)value) == 0);
1366 * regress_test_ghash_null_in:
1367 * @in: (element-type utf8 utf8) (allow-none):
1370 regress_test_ghash_null_in (const GHashTable *in)
1372 g_assert (in == NULL);
1376 * regress_test_ghash_null_out:
1377 * @out: (element-type utf8 utf8) (allow-none) (out):
1380 regress_test_ghash_null_out (const GHashTable **out)
1386 * regress_test_ghash_nothing_in:
1387 * @in: (element-type utf8 utf8):
1390 regress_test_ghash_nothing_in (const GHashTable *in)
1392 assert_test_table_ghash (in);
1396 * regress_test_ghash_nothing_in2:
1397 * @in: (element-type utf8 utf8):
1400 regress_test_ghash_nothing_in2 (GHashTable *in)
1402 assert_test_table_ghash (in);
1405 /* Nested collection types */
1408 * regress_test_ghash_nested_everything_return:
1410 * Specify nested parameterized types directly with the (type ) annotation.
1412 * Return value: (type GLib.HashTable<utf8,GLib.HashTable<utf8,utf8>>) (transfer full):
1415 regress_test_ghash_nested_everything_return (void)
1418 hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
1419 (void (*) (gpointer)) g_hash_table_destroy);
1420 g_hash_table_insert(hash, g_strdup("wibble"), regress_test_table_ghash_new_full());
1425 * regress_test_ghash_nested_everything_return2:
1427 * Another way of specifying nested parameterized types: using the
1428 * element-type annotation.
1430 * Return value: (element-type utf8 GLib.HashTable<utf8,utf8>) (transfer full):
1433 regress_test_ghash_nested_everything_return2 (void)
1435 return regress_test_ghash_nested_everything_return();
1438 /************************************************************************/
1441 * regress_test_garray_container_return:
1443 * Returns: (transfer container) (type GLib.PtrArray) (element-type utf8):
1446 regress_test_garray_container_return (void)
1450 array = g_ptr_array_new_with_free_func (g_free);
1451 g_ptr_array_add (array, g_strdup ("regress"));
1457 * regress_test_garray_full_return:
1459 * Returns: (transfer full) (type GLib.PtrArray) (element-type utf8):
1462 regress_test_garray_full_return (void)
1466 array = g_ptr_array_new ();
1467 g_ptr_array_add (array, g_strdup ("regress"));
1472 /************************************************************************/
1479 * NUM_REGRESS_FOO: (skip)
1481 * num of elements in RegressFoo
1485 regress_test_enum_get_type (void)
1487 static GType etype = 0;
1488 if (G_UNLIKELY(etype == 0)) {
1489 static const GEnumValue values[] = {
1490 { REGRESS_TEST_VALUE1, "REGRESS_TEST_VALUE1", "value1" },
1491 { REGRESS_TEST_VALUE2, "REGRESS_TEST_VALUE2", "value2" },
1492 { REGRESS_TEST_VALUE3, "REGRESS_TEST_VALUE3", "value3" },
1493 { REGRESS_TEST_VALUE4, "REGRESS_TEST_VALUE4", "value4" },
1496 etype = g_enum_register_static (g_intern_static_string ("RegressTestEnum"), values);
1503 regress_test_enum_unsigned_get_type (void)
1505 static GType etype = 0;
1506 if (G_UNLIKELY(etype == 0)) {
1507 static const GEnumValue values[] = {
1508 { REGRESS_TEST_UNSIGNED_VALUE1, "REGRESS_TEST_UNSIGNED_VALUE1", "value1" },
1509 { REGRESS_TEST_UNSIGNED_VALUE2, "REGRESS_TEST_UNSIGNED_VALUE2", "value2" },
1512 etype = g_enum_register_static (g_intern_static_string ("RegressTestEnumUnsigned"), values);
1519 regress_test_flags_get_type (void)
1521 static GType etype = 0;
1522 if (G_UNLIKELY(etype == 0)) {
1523 static const GFlagsValue values[] = {
1524 { REGRESS_TEST_FLAG1, "TEST_FLAG1", "flag1" },
1525 { REGRESS_TEST_FLAG2, "TEST_FLAG2", "flag2" },
1526 { REGRESS_TEST_FLAG3, "TEST_FLAG3", "flag3" },
1529 etype = g_flags_register_static (g_intern_static_string ("RegressTestFlags"), values);
1536 regress_test_enum_param(RegressTestEnum e)
1541 ec = g_type_class_ref (regress_test_enum_get_type ());
1542 ev = g_enum_get_value (ec, e);
1543 g_type_class_unref (ec);
1545 return ev->value_nick;
1549 regress_test_unsigned_enum_param(RegressTestEnumUnsigned e)
1554 ec = g_type_class_ref (regress_test_enum_unsigned_get_type ());
1555 ev = g_enum_get_value (ec, e);
1556 g_type_class_unref (ec);
1558 return ev->value_nick;
1562 * regress_global_get_flags_out:
1563 * @v: (out): A flags value
1567 regress_global_get_flags_out (RegressTestFlags *v)
1569 *v = REGRESS_TEST_FLAG1 | REGRESS_TEST_FLAG3;
1575 * regress_test_struct_a_clone:
1577 * @a_out: (out caller-allocates): the cloned structure
1579 * Make a copy of a RegressTestStructA
1582 regress_test_struct_a_clone (RegressTestStructA *a,
1583 RegressTestStructA *a_out)
1589 * regress_test_struct_b_clone:
1591 * @b_out: (out): the cloned structure
1593 * Make a copy of a RegressTestStructB
1596 regress_test_struct_b_clone (RegressTestStructB *b,
1597 RegressTestStructB *b_out)
1602 /* plain-old-data boxed types */
1604 RegressTestSimpleBoxedA *
1605 regress_test_simple_boxed_a_copy (RegressTestSimpleBoxedA *a)
1607 RegressTestSimpleBoxedA *new_a = g_slice_new (RegressTestSimpleBoxedA);
1615 regress_test_simple_boxed_a_free (RegressTestSimpleBoxedA *a)
1617 g_slice_free (RegressTestSimpleBoxedA, a);
1621 regress_test_simple_boxed_a_get_gtype (void)
1623 static GType our_type = 0;
1626 our_type = g_boxed_type_register_static (g_intern_static_string ("RegressTestSimpleBoxedA"),
1627 (GBoxedCopyFunc)regress_test_simple_boxed_a_copy,
1628 (GBoxedFreeFunc)regress_test_simple_boxed_a_free);
1632 RegressTestSimpleBoxedB *
1633 regress_test_simple_boxed_b_copy (RegressTestSimpleBoxedB *b)
1635 RegressTestSimpleBoxedB *new_b = g_slice_new (RegressTestSimpleBoxedB);
1643 regress_test_simple_boxed_a_equals (RegressTestSimpleBoxedA *a,
1644 RegressTestSimpleBoxedA *other_a)
1646 return (a->some_int == other_a->some_int &&
1647 a->some_int8 == other_a->some_int8 &&
1648 a->some_double == other_a->some_double);
1651 const RegressTestSimpleBoxedA*
1652 regress_test_simple_boxed_a_const_return (void)
1654 static RegressTestSimpleBoxedA simple_a = {
1662 regress_test_simple_boxed_b_free (RegressTestSimpleBoxedB *a)
1664 g_slice_free (RegressTestSimpleBoxedB, a);
1668 regress_test_simple_boxed_b_get_type (void)
1670 static GType our_type = 0;
1673 our_type = g_boxed_type_register_static (g_intern_static_string ("RegressTestSimpleBoxedB"),
1674 (GBoxedCopyFunc)regress_test_simple_boxed_b_copy,
1675 (GBoxedFreeFunc)regress_test_simple_boxed_b_free);
1681 struct _RegressTestBoxedPrivate
1687 * regress_test_boxed_new:
1689 * Returns: (transfer full):
1692 regress_test_boxed_new (void)
1694 RegressTestBoxed *boxed = g_slice_new0(RegressTestBoxed);
1695 boxed->priv = g_slice_new0(RegressTestBoxedPrivate);
1696 boxed->priv->magic = 0xdeadbeef;
1702 * regress_test_boxed_new_alternative_constructor1:
1704 * Returns: (transfer full):
1707 regress_test_boxed_new_alternative_constructor1 (int i)
1709 RegressTestBoxed *boxed = g_slice_new0(RegressTestBoxed);
1710 boxed->priv = g_slice_new0(RegressTestBoxedPrivate);
1711 boxed->priv->magic = 0xdeadbeef;
1712 boxed->some_int8 = i;
1718 * regress_test_boxed_new_alternative_constructor2:
1720 * Returns: (transfer full):
1723 regress_test_boxed_new_alternative_constructor2 (int i, int j)
1725 RegressTestBoxed *boxed = g_slice_new0(RegressTestBoxed);
1726 boxed->priv = g_slice_new0(RegressTestBoxedPrivate);
1727 boxed->priv->magic = 0xdeadbeef;
1728 boxed->some_int8 = i + j;
1734 * regress_test_boxed_new_alternative_constructor3:
1736 * Returns: (transfer full):
1739 regress_test_boxed_new_alternative_constructor3 (char *s)
1741 RegressTestBoxed *boxed = g_slice_new0(RegressTestBoxed);
1742 boxed->priv = g_slice_new0(RegressTestBoxedPrivate);
1743 boxed->priv->magic = 0xdeadbeef;
1744 boxed->some_int8 = atoi(s);
1750 * regress_test_boxed_copy:
1752 * Returns: (transfer full):
1755 regress_test_boxed_copy (RegressTestBoxed *boxed)
1757 RegressTestBoxed *new_boxed = regress_test_boxed_new();
1758 RegressTestBoxedPrivate *save;
1760 save = new_boxed->priv;
1761 *new_boxed = *boxed;
1762 new_boxed->priv = save;
1768 regress_test_boxed_equals (RegressTestBoxed *boxed,
1769 RegressTestBoxed *other)
1771 return (other->some_int8 == boxed->some_int8 &&
1772 regress_test_simple_boxed_a_equals(&other->nested_a, &boxed->nested_a));
1776 regress_test_boxed_free (RegressTestBoxed *boxed)
1778 g_assert (boxed->priv->magic == 0xdeadbeef);
1780 g_slice_free (RegressTestBoxedPrivate, boxed->priv);
1781 g_slice_free (RegressTestBoxed, boxed);
1785 regress_test_boxed_get_type (void)
1787 static GType our_type = 0;
1790 our_type = g_boxed_type_register_static (g_intern_static_string ("RegressTestBoxed"),
1791 (GBoxedCopyFunc)regress_test_boxed_copy,
1792 (GBoxedFreeFunc)regress_test_boxed_free);
1797 regress_test_boxed_b_new (gint8 some_int8, glong some_long)
1799 RegressTestBoxedB *boxed;
1801 boxed = g_slice_new (RegressTestBoxedB);
1802 boxed->some_int8 = some_int8;
1803 boxed->some_long = some_long;
1809 regress_test_boxed_b_copy (RegressTestBoxedB *boxed)
1811 return regress_test_boxed_b_new (boxed->some_int8, boxed->some_long);
1815 regress_test_boxed_b_free (RegressTestBoxedB *boxed)
1817 g_slice_free (RegressTestBoxedB, boxed);
1820 G_DEFINE_BOXED_TYPE(RegressTestBoxedB,
1821 regress_test_boxed_b,
1822 regress_test_boxed_b_copy,
1823 regress_test_boxed_b_free);
1825 G_DEFINE_TYPE(RegressTestObj, regress_test_obj, G_TYPE_OBJECT);
1829 PROP_TEST_OBJ_BARE = 1,
1830 PROP_TEST_OBJ_BOXED,
1831 PROP_TEST_OBJ_HASH_TABLE,
1833 PROP_TEST_OBJ_HASH_TABLE_OLD,
1834 PROP_TEST_OBJ_LIST_OLD,
1836 PROP_TEST_OBJ_FLOAT,
1837 PROP_TEST_OBJ_DOUBLE,
1838 PROP_TEST_OBJ_STRING,
1843 regress_test_obj_set_property (GObject *object,
1845 const GValue *value,
1848 RegressTestObj *self = REGRESS_TEST_OBJECT (object);
1851 switch (property_id)
1853 case PROP_TEST_OBJ_BARE:
1854 regress_test_obj_set_bare (self, g_value_get_object (value));
1857 case PROP_TEST_OBJ_BOXED:
1859 regress_test_boxed_free (self->boxed);
1860 self->boxed = g_value_dup_boxed (value);
1863 case PROP_TEST_OBJ_HASH_TABLE:
1864 case PROP_TEST_OBJ_HASH_TABLE_OLD:
1865 if (self->hash_table)
1866 g_hash_table_unref (self->hash_table);
1867 self->hash_table = g_hash_table_ref (g_value_get_boxed (value));
1870 case PROP_TEST_OBJ_LIST:
1871 case PROP_TEST_OBJ_LIST_OLD:
1872 if (self->list != NULL)
1874 for (list = self->list; list != NULL; list = g_list_next (list))
1875 g_free (list->data);
1876 g_list_free (self->list);
1879 for (list = g_value_get_pointer (value); list != NULL; list = g_list_next (list))
1880 self->list = g_list_append (self->list, g_strdup (list->data));
1883 case PROP_TEST_OBJ_INT:
1884 self->some_int8 = g_value_get_int (value);
1887 case PROP_TEST_OBJ_FLOAT:
1888 self->some_float = g_value_get_float (value);
1891 case PROP_TEST_OBJ_DOUBLE:
1892 self->some_double = g_value_get_double (value);
1895 case PROP_TEST_OBJ_STRING:
1896 self->string = g_value_dup_string (value);
1899 case PROP_TEST_OBJ_GTYPE:
1900 self->gtype = g_value_get_gtype (value);
1904 /* We don't have any other property... */
1905 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
1911 regress_test_obj_get_property (GObject *object,
1916 RegressTestObj *self = REGRESS_TEST_OBJECT (object);
1918 switch (property_id)
1920 case PROP_TEST_OBJ_BARE:
1921 g_value_set_object (value, self->bare);
1924 case PROP_TEST_OBJ_BOXED:
1925 g_value_set_boxed (value, self->boxed);
1928 case PROP_TEST_OBJ_HASH_TABLE:
1929 case PROP_TEST_OBJ_HASH_TABLE_OLD:
1930 if (self->hash_table != NULL)
1931 g_hash_table_ref (self->hash_table);
1932 g_value_set_boxed (value, self->hash_table);
1935 case PROP_TEST_OBJ_LIST:
1936 case PROP_TEST_OBJ_LIST_OLD:
1937 g_value_set_pointer (value, self->list);
1940 case PROP_TEST_OBJ_INT:
1941 g_value_set_int (value, self->some_int8);
1944 case PROP_TEST_OBJ_FLOAT:
1945 g_value_set_float (value, self->some_float);
1948 case PROP_TEST_OBJ_DOUBLE:
1949 g_value_set_double (value, self->some_double);
1952 case PROP_TEST_OBJ_STRING:
1953 g_value_set_string (value, self->string);
1956 case PROP_TEST_OBJ_GTYPE:
1957 g_value_set_gtype (value, self->gtype);
1961 /* We don't have any other property... */
1962 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
1968 regress_test_obj_dispose (GObject *gobject)
1970 RegressTestObj *self = REGRESS_TEST_OBJECT (gobject);
1974 g_object_unref (self->bare);
1981 regress_test_boxed_free (self->boxed);
1985 /* Chain up to the parent class */
1986 G_OBJECT_CLASS (regress_test_obj_parent_class)->dispose (gobject);
1990 regress_test_obj_default_matrix (RegressTestObj *obj, const char *somestr)
1996 REGRESS_TEST_OBJ_SIGNAL_SIG_NEW_WITH_ARRAY_PROP,
1997 REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_HASH_PROP,
1998 REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_STRV,
1999 REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_OBJ,
2000 REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_FOREIGN_STRUCT,
2001 REGRESS_TEST_OBJ_SIGNAL_FIRST,
2002 REGRESS_TEST_OBJ_SIGNAL_CLEANUP,
2003 REGRESS_TEST_OBJ_SIGNAL_ALL,
2004 N_REGRESS_TEST_OBJ_SIGNALS
2007 static guint regress_test_obj_signals[N_REGRESS_TEST_OBJ_SIGNALS] = { 0 };
2010 regress_test_obj_class_init (RegressTestObjClass *klass)
2012 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
2014 GType param_types[1];
2016 klass->test_signal =
2017 g_signal_newv ("test",
2018 G_TYPE_FROM_CLASS (gobject_class),
2019 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
2021 NULL /* accumulator */,
2022 NULL /* accumulator data */,
2023 g_cclosure_marshal_VOID__VOID,
2024 G_TYPE_NONE /* return_type */,
2026 NULL /* param_types */);
2028 param_types[0] = regress_test_simple_boxed_a_get_gtype() | G_SIGNAL_TYPE_STATIC_SCOPE;
2029 klass->test_signal_with_static_scope_arg =
2030 g_signal_newv ("test-with-static-scope-arg",
2031 G_TYPE_FROM_CLASS (gobject_class),
2032 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
2034 NULL /* accumulator */,
2035 NULL /* accumulator data */,
2036 g_cclosure_marshal_VOID__BOXED,
2037 G_TYPE_NONE /* return_type */,
2042 * RegressTestObj::sig-with-array-prop:
2044 * @arr: (type GArray) (element-type uint): numbers
2046 * This test signal is like TelepathyGlib's
2047 * TpChannel:: group-members-changed-detailed:
2049 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_SIG_NEW_WITH_ARRAY_PROP] =
2050 g_signal_new ("sig-with-array-prop",
2051 G_TYPE_FROM_CLASS (gobject_class),
2056 g_cclosure_marshal_VOID__BOXED,
2062 * RegressTestObj::sig-with-hash-prop:
2064 * @hash: (element-type utf8 GObject.Value):
2066 * This test signal is like TelepathyGlib's
2067 * TpAccount::status-changed
2069 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_HASH_PROP] =
2070 g_signal_new ("sig-with-hash-prop",
2071 G_TYPE_FROM_CLASS (gobject_class),
2076 g_cclosure_marshal_VOID__BOXED,
2082 * RegressTestObj::sig-with-strv:
2086 * Test GStrv as a param.
2088 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_STRV] =
2089 g_signal_new ("sig-with-strv",
2090 G_TYPE_FROM_CLASS (gobject_class),
2095 g_cclosure_marshal_VOID__BOXED,
2101 * RegressTestObj::sig-with-obj:
2103 * @obj: (transfer none): A newly created RegressTestObj
2105 * Test transfer none GObject as a param (tests refcounting).
2106 * Use with regress_test_obj_emit_sig_with_obj
2108 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_OBJ] =
2109 g_signal_new ("sig-with-obj",
2110 G_TYPE_FROM_CLASS (gobject_class),
2115 g_cclosure_marshal_VOID__OBJECT,
2121 * RegressTestObj::sig-with-foreign-struct:
2123 * @cr: (transfer none): A cairo context.
2125 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_SIG_WITH_FOREIGN_STRUCT] =
2126 g_signal_new ("sig-with-foreign-struct",
2127 G_TYPE_FROM_CLASS (gobject_class),
2135 CAIRO_GOBJECT_TYPE_CONTEXT);
2137 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_FIRST] =
2138 g_signal_new ("first",
2139 G_TYPE_FROM_CLASS (gobject_class),
2144 g_cclosure_marshal_VOID__VOID,
2148 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_CLEANUP] =
2149 g_signal_new ("cleanup",
2150 G_TYPE_FROM_CLASS (gobject_class),
2151 G_SIGNAL_RUN_CLEANUP,
2155 g_cclosure_marshal_VOID__VOID,
2159 regress_test_obj_signals[REGRESS_TEST_OBJ_SIGNAL_ALL] =
2160 g_signal_new ("all",
2161 G_TYPE_FROM_CLASS (gobject_class),
2162 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_ACTION | G_SIGNAL_NO_HOOKS,
2166 g_cclosure_marshal_VOID__VOID,
2170 gobject_class->set_property = regress_test_obj_set_property;
2171 gobject_class->get_property = regress_test_obj_get_property;
2172 gobject_class->dispose = regress_test_obj_dispose;
2174 pspec = g_param_spec_object ("bare",
2176 "A contained object",
2179 g_object_class_install_property (gobject_class,
2183 pspec = g_param_spec_boxed ("boxed",
2185 "A contained boxed struct",
2186 REGRESS_TEST_TYPE_BOXED,
2188 g_object_class_install_property (gobject_class,
2189 PROP_TEST_OBJ_BOXED,
2193 * RegressTestObj:hash-table:
2195 * Type: GLib.HashTable(utf8,gint8)
2196 * Transfer: container
2198 pspec = g_param_spec_boxed ("hash-table",
2199 "GHashTable property",
2200 "A contained GHashTable",
2203 g_object_class_install_property (gobject_class,
2204 PROP_TEST_OBJ_HASH_TABLE,
2208 * RegressTestObj:list:
2210 * Type: GLib.List(utf8)
2213 pspec = g_param_spec_pointer ("list",
2215 "A contained GList",
2217 g_object_class_install_property (gobject_class,
2222 * RegressTestObj:hash-table-old:
2224 * Type: GLib.HashTable<utf8,gint8>
2225 * Transfer: container
2227 pspec = g_param_spec_boxed ("hash-table-old",
2228 "GHashTable property with <>",
2229 "A contained GHashTable with <>",
2232 g_object_class_install_property (gobject_class,
2233 PROP_TEST_OBJ_HASH_TABLE_OLD,
2237 * RegressTestObj:list-old:
2239 * Type: GLib.List<utf8>
2242 pspec = g_param_spec_pointer ("list-old",
2243 "GList property with ()",
2244 "A contained GList with <>",
2246 g_object_class_install_property (gobject_class,
2247 PROP_TEST_OBJ_LIST_OLD,
2255 pspec = g_param_spec_int ("int",
2262 g_object_class_install_property (gobject_class,
2269 pspec = g_param_spec_float ("float",
2271 "A contained float",
2276 g_object_class_install_property (gobject_class,
2277 PROP_TEST_OBJ_FLOAT,
2283 pspec = g_param_spec_double ("double",
2285 "A contained double",
2290 g_object_class_install_property (gobject_class,
2291 PROP_TEST_OBJ_DOUBLE,
2297 pspec = g_param_spec_string ("string",
2299 "A contained string",
2302 g_object_class_install_property (gobject_class,
2303 PROP_TEST_OBJ_STRING,
2310 pspec = g_param_spec_gtype ("gtype",
2315 g_object_class_install_property (gobject_class,
2316 PROP_TEST_OBJ_GTYPE,
2319 klass->matrix = regress_test_obj_default_matrix;
2323 regress_test_obj_init (RegressTestObj *obj)
2327 obj->hash_table = NULL;
2328 obj->gtype = G_TYPE_INVALID;
2332 * regress_test_obj_new: (constructor)
2333 * @obj: A #RegressTestObj
2336 regress_test_obj_new (RegressTestObj *obj)
2338 return g_object_new (REGRESS_TEST_TYPE_OBJ, NULL);
2342 * regress_constructor: (constructor)
2346 regress_constructor (void)
2348 return g_object_new (REGRESS_TEST_TYPE_OBJ, NULL);
2352 * regress_test_obj_new_from_file:
2355 regress_test_obj_new_from_file (const char *x, GError **error)
2357 return g_object_new (REGRESS_TEST_TYPE_OBJ, NULL);
2361 * regress_test_obj_set_bare:
2362 * @bare: (allow-none):
2365 regress_test_obj_set_bare (RegressTestObj *obj, GObject *bare)
2368 g_object_unref (obj->bare);
2371 g_object_ref (obj->bare);
2375 regress_test_obj_emit_sig_with_obj (RegressTestObj *obj)
2377 RegressTestObj *obj_param = regress_constructor ();
2378 g_object_set (obj_param, "int", 3, NULL);
2379 g_signal_emit_by_name (obj, "sig-with-obj", obj_param);
2380 g_object_unref (obj_param);
2384 regress_test_obj_emit_sig_with_foreign_struct (RegressTestObj *obj)
2386 cairo_t *cr = regress_test_cairo_context_full_return ();
2387 g_signal_emit_by_name (obj, "sig-with-foreign-struct", cr);
2392 regress_test_obj_instance_method (RegressTestObj *obj)
2398 regress_test_obj_static_method (int x)
2404 * regress_forced_method: (method)
2405 * @obj: A #RegressTestObj
2409 regress_forced_method (RegressTestObj *obj)
2414 * regress_test_obj_torture_signature_0:
2415 * @obj: A #RegressTestObj
2425 regress_test_obj_torture_signature_0 (RegressTestObj *obj,
2435 *q = g_utf8_strlen (foo, -1) + m;
2439 * regress_test_obj_torture_signature_1:
2440 * @obj: A #RegressTestObj
2449 * This function throws an error if m is odd.
2452 regress_test_obj_torture_signature_1 (RegressTestObj *obj,
2463 *q = g_utf8_strlen (foo, -1) + m;
2466 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "m is odd");
2471 * regress_test_obj_skip_return_val:
2472 * @obj: a #RegressTestObj
2474 * @out_b: (out): A return value.
2475 * @c: Other parameter.
2476 * @inout_d: (inout): Will be incremented.
2477 * @out_sum: (out): Return value.
2480 * @error: Return location for error.
2482 * Check that the return value is skipped
2484 * Returns: (skip): %TRUE if the call succeeds, %FALSE if @error is set.
2487 regress_test_obj_skip_return_val (RegressTestObj *obj,
2499 if (inout_d != NULL)
2500 *inout_d = *inout_d + 1;
2501 if (out_sum != NULL)
2502 *out_sum = num1 + 10*num2;
2507 * regress_test_obj_skip_return_val_no_out:
2508 * @obj: a #RegressTestObj
2510 * @error: Return location for error.
2512 * Check that the return value is skipped. Succeed if a is nonzero, otherwise
2515 * Returns: (skip): %TRUE if the call succeeds, %FALSE if @error is set.
2518 regress_test_obj_skip_return_val_no_out (RegressTestObj *obj,
2523 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "a is zero");
2531 * regress_test_obj_skip_param:
2532 * @obj: A #RegressTestObj.
2534 * @out_b: (out): Return value.
2535 * @c: (skip): Other parameter.
2536 * @inout_d: (inout): Will be incremented.
2537 * @out_sum: (out): Return value.
2540 * @error: Return location for error.
2542 * Check that a parameter is skipped
2544 * Returns: %TRUE if the call succeeds, %FALSE if @error is set.
2547 regress_test_obj_skip_param (RegressTestObj *obj,
2559 if (inout_d != NULL)
2560 *inout_d = *inout_d + 1;
2561 if (out_sum != NULL)
2562 *out_sum = num1 + 10*num2;
2567 * regress_test_obj_skip_out_param:
2568 * @obj: A #RegressTestObj.
2570 * @out_b: (out) (skip): Return value.
2571 * @c: Other parameter.
2572 * @inout_d: (inout): Will be incremented.
2573 * @out_sum: (out): Return value.
2576 * @error: Return location for error.
2578 * Check that the out value is skipped
2580 * Returns: %TRUE if the call succeeds, %FALSE if @error is set.
2583 regress_test_obj_skip_out_param (RegressTestObj *obj,
2595 if (inout_d != NULL)
2596 *inout_d = *inout_d + 1;
2597 if (out_sum != NULL)
2598 *out_sum = num1 + 10*num2;
2603 * regress_test_obj_skip_inout_param:
2604 * @obj: A #RegressTestObj.
2606 * @out_b: (out): Return value.
2607 * @c: Other parameter.
2608 * @inout_d: (inout) (skip): Will be incremented.
2609 * @out_sum: (out): Return value.
2612 * @error: Return location for error.
2614 * Check that the out value is skipped
2616 * Returns: %TRUE if the call succeeds, %FALSE if @error is set.
2619 regress_test_obj_skip_inout_param (RegressTestObj *obj,
2631 if (inout_d != NULL)
2632 *inout_d = *inout_d + 1;
2633 if (out_sum != NULL)
2634 *out_sum = num1 + 10*num2;
2639 * regress_test_obj_do_matrix:
2640 * @obj: A #RegressTestObj
2641 * @somestr: Meaningless string
2643 * This method is virtual. Notably its name differs from the virtual
2644 * slot name, which makes it useful for testing bindings handle this
2650 regress_test_obj_do_matrix (RegressTestObj *obj, const char *somestr)
2652 return REGRESS_TEST_OBJ_GET_CLASS (obj)->matrix (obj, somestr);
2656 * regress_func_obj_null_in:
2657 * @obj: (allow-none): A #RegressTestObj
2660 regress_func_obj_null_in (RegressTestObj *obj)
2665 * regress_test_obj_null_out:
2666 * @obj: (allow-none) (out): A #RegressTestObj
2669 regress_test_obj_null_out (RegressTestObj **obj)
2676 * regress_test_array_fixed_out_objects:
2677 * @objs: (out) (array fixed-size=2) (transfer full): An array of #RegressTestObj
2680 regress_test_array_fixed_out_objects (RegressTestObj ***objs)
2682 RegressTestObj **values = (RegressTestObj**)g_new(gpointer, 2);
2684 values[0] = regress_constructor();
2685 values[1] = regress_constructor();
2690 typedef struct _CallbackInfo CallbackInfo;
2692 struct _CallbackInfo
2694 RegressTestCallbackUserData callback;
2695 GDestroyNotify notify;
2700 G_DEFINE_TYPE(RegressTestSubObj, regress_test_sub_obj, REGRESS_TEST_TYPE_OBJ);
2703 regress_test_sub_obj_class_init (RegressTestSubObjClass *klass)
2708 regress_test_sub_obj_init (RegressTestSubObj *obj)
2713 regress_test_sub_obj_new ()
2715 return g_object_new (REGRESS_TEST_TYPE_SUB_OBJ, NULL);
2719 regress_test_sub_obj_instance_method (RegressTestSubObj *obj)
2725 regress_test_sub_obj_unset_bare (RegressTestSubObj *obj)
2727 regress_test_obj_set_bare(REGRESS_TEST_OBJECT(obj), NULL);
2730 /* RegressTestFundamental */
2733 * regress_test_fundamental_object_ref:
2735 * Returns: (transfer full): A new #RegressTestFundamentalObject
2737 RegressTestFundamentalObject *
2738 regress_test_fundamental_object_ref (RegressTestFundamentalObject * fundamental_object)
2740 g_return_val_if_fail (fundamental_object != NULL, NULL);
2741 g_atomic_int_inc (&fundamental_object->refcount);
2743 return fundamental_object;
2747 regress_test_fundamental_object_free (RegressTestFundamentalObject * fundamental_object)
2749 RegressTestFundamentalObjectClass *mo_class;
2750 regress_test_fundamental_object_ref (fundamental_object);
2752 mo_class = REGRESS_TEST_FUNDAMENTAL_OBJECT_GET_CLASS (fundamental_object);
2753 mo_class->finalize (fundamental_object);
2755 if (G_LIKELY (g_atomic_int_dec_and_test (&fundamental_object->refcount))) {
2756 g_type_free_instance ((GTypeInstance *) fundamental_object);
2761 regress_test_fundamental_object_unref (RegressTestFundamentalObject * fundamental_object)
2763 g_return_if_fail (fundamental_object != NULL);
2764 g_return_if_fail (fundamental_object->refcount > 0);
2766 if (G_UNLIKELY (g_atomic_int_dec_and_test (&fundamental_object->refcount))) {
2767 regress_test_fundamental_object_free (fundamental_object);
2772 regress_test_fundamental_object_replace (RegressTestFundamentalObject ** olddata, RegressTestFundamentalObject * newdata)
2774 RegressTestFundamentalObject *olddata_val;
2776 g_return_if_fail (olddata != NULL);
2778 olddata_val = g_atomic_pointer_get ((gpointer *) olddata);
2780 if (olddata_val == newdata)
2784 regress_test_fundamental_object_ref (newdata);
2786 while (!g_atomic_pointer_compare_and_exchange ((gpointer *) olddata,
2787 olddata_val, newdata)) {
2788 olddata_val = g_atomic_pointer_get ((gpointer *) olddata);
2792 regress_test_fundamental_object_unref (olddata_val);
2796 regress_test_value_fundamental_object_init (GValue * value)
2798 value->data[0].v_pointer = NULL;
2802 regress_test_value_fundamental_object_free (GValue * value)
2804 if (value->data[0].v_pointer) {
2805 regress_test_fundamental_object_unref (REGRESS_TEST_FUNDAMENTAL_OBJECT_CAST (value->data[0].v_pointer));
2810 regress_test_value_fundamental_object_copy (const GValue * src_value, GValue * dest_value)
2812 if (src_value->data[0].v_pointer) {
2813 dest_value->data[0].v_pointer =
2814 regress_test_fundamental_object_ref (REGRESS_TEST_FUNDAMENTAL_OBJECT_CAST (src_value->data[0].
2817 dest_value->data[0].v_pointer = NULL;
2822 regress_test_value_fundamental_object_peek_pointer (const GValue * value)
2824 return value->data[0].v_pointer;
2828 regress_test_value_fundamental_object_collect (GValue * value,
2829 guint n_collect_values,
2830 GTypeCValue * collect_values,
2831 guint collect_flags)
2833 if (collect_values[0].v_pointer) {
2834 value->data[0].v_pointer =
2835 regress_test_fundamental_object_ref (collect_values[0].v_pointer);
2837 value->data[0].v_pointer = NULL;
2844 regress_test_value_fundamental_object_lcopy (const GValue * value,
2845 guint n_collect_values,
2846 GTypeCValue * collect_values,
2847 guint collect_flags)
2849 gpointer *fundamental_object_p = collect_values[0].v_pointer;
2851 if (!fundamental_object_p) {
2852 return g_strdup_printf ("value location for '%s' passed as NULL",
2853 G_VALUE_TYPE_NAME (value));
2856 if (!value->data[0].v_pointer)
2857 *fundamental_object_p = NULL;
2858 else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
2859 *fundamental_object_p = value->data[0].v_pointer;
2861 *fundamental_object_p = regress_test_fundamental_object_ref (value->data[0].v_pointer);
2867 regress_test_fundamental_object_finalize (RegressTestFundamentalObject * obj)
2872 static RegressTestFundamentalObject *
2873 regress_test_fundamental_object_copy_default (const RegressTestFundamentalObject * obj)
2875 g_warning ("RegressTestFundamentalObject classes must implement RegressTestFundamentalObject::copy");
2880 regress_test_fundamental_object_class_init (gpointer g_class, gpointer class_data)
2882 RegressTestFundamentalObjectClass *mo_class = REGRESS_TEST_FUNDAMENTAL_OBJECT_CLASS (g_class);
2884 mo_class->copy = regress_test_fundamental_object_copy_default;
2885 mo_class->finalize = regress_test_fundamental_object_finalize;
2889 regress_test_fundamental_object_init (GTypeInstance * instance, gpointer klass)
2891 RegressTestFundamentalObject *fundamental_object = REGRESS_TEST_FUNDAMENTAL_OBJECT_CAST (instance);
2893 fundamental_object->refcount = 1;
2897 * RegressTestFundamentalObject:
2899 * Ref Func: regress_test_fundamental_object_ref
2900 * Unref Func: regress_test_fundamental_object_unref
2901 * Set Value Func: regress_test_value_set_fundamental_object
2902 * Get Value Func: regress_test_value_get_fundamental_object
2906 regress_test_fundamental_object_get_type (void)
2908 static GType _test_fundamental_object_type = 0;
2910 if (G_UNLIKELY (_test_fundamental_object_type == 0)) {
2911 static const GTypeValueTable value_table = {
2912 regress_test_value_fundamental_object_init,
2913 regress_test_value_fundamental_object_free,
2914 regress_test_value_fundamental_object_copy,
2915 regress_test_value_fundamental_object_peek_pointer,
2917 regress_test_value_fundamental_object_collect,
2919 regress_test_value_fundamental_object_lcopy
2921 static const GTypeInfo fundamental_object_info = {
2922 sizeof (RegressTestFundamentalObjectClass),
2924 regress_test_fundamental_object_class_init,
2927 sizeof (RegressTestFundamentalObject),
2929 (GInstanceInitFunc) regress_test_fundamental_object_init,
2932 static const GTypeFundamentalInfo fundamental_object_fundamental_info = {
2933 (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE |
2934 G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE)
2937 _test_fundamental_object_type = g_type_fundamental_next ();
2938 g_type_register_fundamental (_test_fundamental_object_type, "RegressTestFundamentalObject",
2939 &fundamental_object_info, &fundamental_object_fundamental_info, G_TYPE_FLAG_ABSTRACT);
2943 return _test_fundamental_object_type;
2947 * regress_test_value_set_fundamental_object: (skip)
2949 * @fundamental_object:
2952 regress_test_value_set_fundamental_object (GValue * value, RegressTestFundamentalObject * fundamental_object)
2954 gpointer *pointer_p;
2956 g_return_if_fail (REGRESS_TEST_VALUE_HOLDS_FUNDAMENTAL_OBJECT (value));
2957 g_return_if_fail (fundamental_object == NULL || REGRESS_TEST_IS_FUNDAMENTAL_OBJECT (fundamental_object));
2959 pointer_p = &value->data[0].v_pointer;
2961 regress_test_fundamental_object_replace ((RegressTestFundamentalObject **) pointer_p, fundamental_object);
2965 * regress_test_value_get_fundamental_object: (skip)
2968 RegressTestFundamentalObject *
2969 regress_test_value_get_fundamental_object (const GValue * value)
2971 g_return_val_if_fail (REGRESS_TEST_VALUE_HOLDS_FUNDAMENTAL_OBJECT (value), NULL);
2973 return value->data[0].v_pointer;
2976 static RegressTestFundamentalObjectClass *parent_class = NULL;
2978 G_DEFINE_TYPE (RegressTestFundamentalSubObject, regress_test_fundamental_sub_object, REGRESS_TEST_TYPE_FUNDAMENTAL_OBJECT);
2980 static RegressTestFundamentalSubObject *
2981 _regress_test_fundamental_sub_object_copy (RegressTestFundamentalSubObject * fundamental_sub_object)
2983 RegressTestFundamentalSubObject *copy;
2985 copy = regress_test_fundamental_sub_object_new(NULL);
2986 copy->data = g_strdup(fundamental_sub_object->data);
2991 regress_test_fundamental_sub_object_finalize (RegressTestFundamentalSubObject * fundamental_sub_object)
2993 g_return_if_fail (fundamental_sub_object != NULL);
2995 g_free(fundamental_sub_object->data);
2996 regress_test_fundamental_object_finalize (REGRESS_TEST_FUNDAMENTAL_OBJECT (fundamental_sub_object));
3000 regress_test_fundamental_sub_object_class_init (RegressTestFundamentalSubObjectClass * klass)
3002 parent_class = g_type_class_peek_parent (klass);
3004 klass->fundamental_object_class.copy = (RegressTestFundamentalObjectCopyFunction) _regress_test_fundamental_sub_object_copy;
3005 klass->fundamental_object_class.finalize =
3006 (RegressTestFundamentalObjectFinalizeFunction) regress_test_fundamental_sub_object_finalize;
3010 regress_test_fundamental_sub_object_init(RegressTestFundamentalSubObject *object)
3016 * regress_test_fundamental_sub_object_new:
3018 RegressTestFundamentalSubObject *
3019 regress_test_fundamental_sub_object_new (const char * data)
3021 RegressTestFundamentalSubObject *object;
3023 object = (RegressTestFundamentalSubObject *) g_type_create_instance (regress_test_fundamental_sub_object_get_type());
3024 object->data = g_strdup(data);
3030 * regress_test_callback:
3031 * @callback: (scope call) (allow-none):
3035 regress_test_callback (RegressTestCallback callback)
3037 if (callback != NULL)
3043 * regress_test_multi_callback:
3044 * @callback: (scope call) (allow-none):
3048 regress_test_multi_callback (RegressTestCallback callback)
3051 if (callback != NULL) {
3060 * regress_test_array_callback:
3061 * @callback: (scope call):
3064 int regress_test_array_callback (RegressTestCallbackArray callback)
3066 static const char *strings[] = { "one", "two", "three" };
3067 static int ints[] = { -1, 0, 1, 2 };
3070 sum += callback(ints, 4, strings, 3);
3071 sum += callback(ints, 4, strings, 3);
3077 * regress_test_simple_callback:
3078 * @callback: (scope call) (allow-none):
3082 regress_test_simple_callback (RegressTestSimpleCallback callback)
3084 if (callback != NULL)
3091 * regress_test_callback_user_data:
3092 * @callback: (scope call):
3094 * Call - callback parameter persists for the duration of the method
3095 * call and can be released on return.
3098 regress_test_callback_user_data (RegressTestCallbackUserData callback,
3101 return callback(user_data);
3104 static GSList *notified_callbacks = NULL;
3107 * regress_test_callback_destroy_notify:
3108 * @callback: (scope notified):
3110 * Notified - callback persists until a DestroyNotify delegate
3114 regress_test_callback_destroy_notify (RegressTestCallbackUserData callback,
3116 GDestroyNotify notify)
3121 retval = callback(user_data);
3123 info = g_slice_new(CallbackInfo);
3124 info->callback = callback;
3125 info->notify = notify;
3126 info->user_data = user_data;
3128 notified_callbacks = g_slist_prepend(notified_callbacks, info);
3134 * regress_test_callback_thaw_notifications:
3136 * Invokes all callbacks installed by #test_callback_destroy_notify(),
3137 * adding up their return values, and removes them, invoking the
3138 * corresponding destroy notfications.
3140 * Return value: Sum of the return values of the invoked callbacks.
3143 regress_test_callback_thaw_notifications (void)
3148 for (node = notified_callbacks; node != NULL; node = node->next)
3150 CallbackInfo *info = node->data;
3151 retval += info->callback (info->user_data);
3153 info->notify (info->user_data);
3154 g_slice_free (CallbackInfo, info);
3157 g_slist_free (notified_callbacks);
3158 notified_callbacks = NULL;
3163 static GSList *async_callbacks = NULL;
3166 * regress_test_callback_async:
3167 * @callback: (scope async):
3171 regress_test_callback_async (RegressTestCallbackUserData callback,
3176 info = g_slice_new(CallbackInfo);
3177 info->callback = callback;
3178 info->user_data = user_data;
3180 async_callbacks = g_slist_prepend(async_callbacks, info);
3184 * regress_test_callback_thaw_async:
3187 regress_test_callback_thaw_async (void)
3192 for (node = async_callbacks; node != NULL; node = node->next)
3194 CallbackInfo *info = node->data;
3195 retval = info->callback (info->user_data);
3196 g_slice_free (CallbackInfo, info);
3199 g_slist_free (async_callbacks);
3200 async_callbacks = NULL;
3205 regress_test_async_ready_callback (GAsyncReadyCallback callback)
3207 GSimpleAsyncResult *result = g_simple_async_result_new (NULL, callback, NULL,
3208 regress_test_async_ready_callback);
3209 g_simple_async_result_complete_in_idle (result);
3213 * regress_test_obj_instance_method_callback:
3214 * @callback: (scope call) (allow-none):
3218 regress_test_obj_instance_method_callback (RegressTestObj *obj, RegressTestCallback callback)
3220 if (callback != NULL)
3225 * regress_test_obj_static_method_callback:
3226 * @callback: (scope call) (allow-none):
3230 regress_test_obj_static_method_callback (RegressTestCallback callback)
3232 if (callback != NULL)
3237 * regress_test_obj_new_callback:
3238 * @callback: (scope notified):
3241 regress_test_obj_new_callback (RegressTestCallbackUserData callback, gpointer user_data,
3242 GDestroyNotify notify)
3246 callback(user_data);
3248 info = g_slice_new(CallbackInfo);
3249 info->callback = callback;
3250 info->notify = notify;
3251 info->user_data = user_data;
3253 notified_callbacks = g_slist_prepend(notified_callbacks, info);
3255 return g_object_new (REGRESS_TEST_TYPE_OBJ, NULL);
3259 * regress_test_hash_table_callback:
3260 * @data: (element-type utf8 gint): GHashTable that gets passed to callback
3261 * @callback: (scope call):
3264 regress_test_hash_table_callback (GHashTable *data, RegressTestCallbackHashtable callback)
3270 * regress_test_gerror_callback:
3271 * @callback: (scope call):
3274 regress_test_gerror_callback (RegressTestCallbackGError callback)
3278 error = g_error_new_literal (G_IO_ERROR,
3279 G_IO_ERROR_NOT_SUPPORTED,
3280 "regression test error");
3282 g_error_free (error);
3286 * regress_test_null_gerror_callback:
3287 * @callback: (scope call):
3290 regress_test_null_gerror_callback (RegressTestCallbackGError callback)
3296 * regress_test_owned_gerror_callback:
3297 * @callback: (scope call):
3300 regress_test_owned_gerror_callback (RegressTestCallbackOwnedGError callback)
3304 error = g_error_new_literal (G_IO_ERROR,
3305 G_IO_ERROR_PERMISSION_DENIED,
3306 "regression test owned error");
3313 regress_test_interface_class_init(void *g_iface)
3318 regress_test_interface_get_type(void)
3320 static GType type = 0;
3322 type = g_type_register_static_simple (G_TYPE_INTERFACE,
3323 "RegressTestInterface",
3324 sizeof (RegressTestInterfaceIface),
3325 (GClassInitFunc) regress_test_interface_class_init,
3332 /* gobject with non-standard prefix */
3333 G_DEFINE_TYPE(RegressTestWi8021x, regress_test_wi_802_1x, G_TYPE_OBJECT);
3337 PROP_TEST_WI_802_1X_TESTBOOL = 1
3341 regress_test_wi_802_1x_set_property (GObject *object,
3343 const GValue *value,
3346 RegressTestWi8021x *self = REGRESS_TEST_WI_802_1X (object);
3348 switch (property_id)
3350 case PROP_TEST_WI_802_1X_TESTBOOL:
3351 regress_test_wi_802_1x_set_testbool (self, g_value_get_boolean (value));
3355 /* We don't have any other property... */
3356 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
3362 regress_test_wi_802_1x_get_property (GObject *object,
3367 RegressTestWi8021x *self = REGRESS_TEST_WI_802_1X (object);
3369 switch (property_id)
3371 case PROP_TEST_WI_802_1X_TESTBOOL:
3372 g_value_set_boolean (value, regress_test_wi_802_1x_get_testbool (self));
3376 /* We don't have any other property... */
3377 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
3383 regress_test_wi_802_1x_dispose (GObject *gobject)
3385 /* Chain up to the parent class */
3386 G_OBJECT_CLASS (regress_test_wi_802_1x_parent_class)->dispose (gobject);
3390 regress_test_wi_802_1x_class_init (RegressTestWi8021xClass *klass)
3392 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
3395 gobject_class->set_property = regress_test_wi_802_1x_set_property;
3396 gobject_class->get_property = regress_test_wi_802_1x_get_property;
3397 gobject_class->dispose = regress_test_wi_802_1x_dispose;
3399 pspec = g_param_spec_boolean ("testbool",
3400 "Nick for testbool",
3401 "Blurb for testbool",
3404 g_object_class_install_property (gobject_class,
3405 PROP_TEST_WI_802_1X_TESTBOOL,
3410 regress_test_wi_802_1x_init (RegressTestWi8021x *obj)
3412 obj->testbool = TRUE;
3415 RegressTestWi8021x *
3416 regress_test_wi_802_1x_new (void)
3418 return g_object_new (REGRESS_TEST_TYPE_WI_802_1X, NULL);
3422 regress_test_wi_802_1x_set_testbool (RegressTestWi8021x *obj, gboolean val)
3424 obj->testbool = val;
3428 regress_test_wi_802_1x_get_testbool (RegressTestWi8021x *obj)
3430 return obj->testbool;
3434 regress_test_wi_802_1x_static_method (int x)
3439 /* floating gobject */
3440 G_DEFINE_TYPE(RegressTestFloating, regress_test_floating, G_TYPE_INITIALLY_UNOWNED);
3443 regress_test_floating_finalize(GObject *object)
3445 g_assert(!g_object_is_floating (object));
3447 G_OBJECT_CLASS(regress_test_floating_parent_class)->finalize(object);
3451 regress_test_floating_class_init (RegressTestFloatingClass *klass)
3453 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
3454 gobject_class->finalize = regress_test_floating_finalize;
3458 regress_test_floating_init (RegressTestFloating *obj)
3463 * regress_test_floating_new:
3465 * Returns:: A new floating #RegressTestFloating
3467 RegressTestFloating *
3468 regress_test_floating_new (void)
3470 return g_object_new (REGRESS_TEST_TYPE_FLOATING, NULL);
3475 * regress_test_torture_signature_0:
3485 regress_test_torture_signature_0 (int x,
3494 *q = g_utf8_strlen (foo, -1) + m;
3498 * regress_test_torture_signature_1:
3507 * This function throws an error if m is odd.
3510 regress_test_torture_signature_1 (int x,
3520 *q = g_utf8_strlen (foo, -1) + m;
3523 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "m is odd");
3528 * regress_test_torture_signature_2:
3541 regress_test_torture_signature_2 (int x,
3542 RegressTestCallbackUserData callback,
3544 GDestroyNotify notify,
3553 *q = g_utf8_strlen (foo, -1) + m;
3558 * regress_test_date_in_gvalue:
3560 * Returns: (transfer full):
3563 regress_test_date_in_gvalue (void)
3565 GValue *value = g_new0 (GValue, 1);
3566 GDate *date = g_date_new_dmy (5, 12, 1984);
3568 g_value_init (value, G_TYPE_DATE);
3569 g_value_take_boxed (value, date);
3575 * regress_test_strv_in_gvalue:
3577 * Returns: (transfer full):
3580 regress_test_strv_in_gvalue (void)
3582 GValue *value = g_new0 (GValue, 1);
3583 const char *strv[] = { "one", "two", "three", NULL };
3585 g_value_init (value, G_TYPE_STRV);
3586 g_value_set_boxed (value, strv);
3592 * regress_test_multiline_doc_comments:
3594 * This is a function.
3596 * It has multiple lines in the documentation.
3600 * You will give me your credit card number.
3603 regress_test_multiline_doc_comments (void)
3608 * regress_test_nested_parameter:
3615 * <entry>Syntax</entry>
3616 * <entry>Explanation</entry>
3617 * <entry>Examples</entry>
3622 * <entry>rgb(@r, @g, @b)</entry>
3623 * <entry>An opaque color; @r, @g, @b can be either integers between
3624 * 0 and 255 or percentages</entry>
3625 * <entry><literallayout>rgb(128, 10, 54)
3626 * rgb(20%, 30%, 0%)</literallayout></entry>
3629 * <entry>rgba(@r, @g, @b, @a)</entry>
3630 * <entry>A translucent color; @r, @g, @b are as in the previous row,
3631 * @a is a floating point number between 0 and 1</entry>
3632 * <entry><literallayout>rgba(255, 255, 0, 0.5)</literallayout></entry>
3638 * What we're testing here is that the scanner ignores the @a nested inside XML.
3641 regress_test_nested_parameter (int a)
3646 * regress_introspectable_via_alias:
3650 regress_introspectable_via_alias (RegressPtrArrayAlias *data)
3655 * regress_not_introspectable_via_alias:
3659 regress_not_introspectable_via_alias (RegressVaListAlias ok)
3664 * regress_aliased_caller_alloc:
3667 void regress_aliased_caller_alloc (RegressAliasedTestBoxed *boxed)
3669 boxed->priv = g_slice_new0 (RegressTestBoxedPrivate);
3670 boxed->priv->magic = 0xdeadbeef;
3674 regress_test_struct_fixed_array_frob (RegressTestStructFixedArray *str)
3679 for (i = 0; i < G_N_ELEMENTS(str->array); i++)
3680 str->array[i] = 42 + i;
3684 * regress_has_parameter_named_attrs:
3686 * @attributes: (type guint32) (array fixed-size=32): list of attributes
3688 * This test case mirrors GnomeKeyringPasswordSchema from
3692 regress_has_parameter_named_attrs (int foo,
3693 gpointer attributes)