| #include <glib-object.h> |
| |
| static void |
| test_registration_serial (void) |
| { |
| gint serial1, serial2, serial3; |
| |
| serial1 = g_type_get_type_registration_serial (); |
| g_pointer_type_register_static ("my+pointer"); |
| serial2 = g_type_get_type_registration_serial (); |
| g_assert (serial1 != serial2); |
| serial3 = g_type_get_type_registration_serial (); |
| g_assert (serial2 == serial3); |
| } |
| |
| typedef struct { |
| GTypeInterface g_iface; |
| } BarInterface; |
| |
| GType bar_get_type (void); |
| |
| G_DEFINE_INTERFACE (Bar, bar, G_TYPE_OBJECT) |
| |
| static void |
| bar_default_init (BarInterface *iface) |
| { |
| } |
| |
| typedef struct { |
| GTypeInterface g_iface; |
| } FooInterface; |
| |
| GType foo_get_type (void); |
| |
| G_DEFINE_INTERFACE_WITH_CODE (Foo, foo, G_TYPE_OBJECT, |
| g_type_interface_add_prerequisite (g_define_type_id, bar_get_type ());) |
| |
| static void |
| foo_default_init (FooInterface *iface) |
| { |
| } |
| |
| static void |
| test_interface_prerequisite (void) |
| { |
| GType *prereqs; |
| guint n_prereqs; |
| gpointer iface; |
| gpointer parent; |
| |
| prereqs = g_type_interface_prerequisites (foo_get_type (), &n_prereqs); |
| g_assert_cmpint (n_prereqs, ==, 2); |
| g_assert (prereqs[0] == bar_get_type ()); |
| g_assert (prereqs[1] == G_TYPE_OBJECT); |
| |
| iface = g_type_default_interface_ref (foo_get_type ()); |
| parent = g_type_interface_peek_parent (iface); |
| g_assert (parent == NULL); |
| g_type_default_interface_unref (iface); |
| |
| g_free (prereqs); |
| } |
| |
| typedef struct { |
| GTypeInterface g_iface; |
| } BazInterface; |
| |
| GType baz_get_type (void); |
| |
| G_DEFINE_INTERFACE (Baz, baz, G_TYPE_OBJECT) |
| |
| static void |
| baz_default_init (BazInterface *iface) |
| { |
| } |
| |
| typedef struct { |
| GObject parent; |
| } Bazo; |
| |
| typedef struct { |
| GObjectClass parent_class; |
| } BazoClass; |
| |
| GType bazo_get_type (void); |
| static void bazo_iface_init (BazInterface *i); |
| |
| G_DEFINE_TYPE_WITH_CODE (Bazo, bazo, G_TYPE_INITIALLY_UNOWNED, |
| G_IMPLEMENT_INTERFACE (baz_get_type (), |
| bazo_iface_init);) |
| |
| static void |
| bazo_init (Bazo *b) |
| { |
| } |
| |
| static void |
| bazo_class_init (BazoClass *c) |
| { |
| } |
| |
| static void |
| bazo_iface_init (BazInterface *i) |
| { |
| } |
| |
| static gint check_called; |
| |
| static void |
| check_func (gpointer check_data, |
| gpointer g_iface) |
| { |
| g_assert (check_data == &check_called); |
| |
| check_called++; |
| } |
| |
| static void |
| test_interface_check (void) |
| { |
| GObject *o; |
| |
| check_called = 0; |
| g_type_add_interface_check (&check_called, check_func); |
| o = g_object_new (bazo_get_type (), NULL); |
| g_object_unref (o); |
| g_assert_cmpint (check_called, ==, 1); |
| g_type_remove_interface_check (&check_called, check_func); |
| } |
| |
| static void |
| test_next_base (void) |
| { |
| GType type; |
| |
| type = g_type_next_base (bazo_get_type (), G_TYPE_OBJECT); |
| |
| g_assert (type == G_TYPE_INITIALLY_UNOWNED); |
| } |
| |
| int |
| main (int argc, char *argv[]) |
| { |
| g_test_init (&argc, &argv, NULL); |
| |
| g_test_add_func ("/type/registration-serial", test_registration_serial); |
| g_test_add_func ("/type/interface-prerequisite", test_interface_prerequisite); |
| g_test_add_func ("/type/interface-check", test_interface_check); |
| g_test_add_func ("/type/next-base", test_next_base); |
| |
| return g_test_run (); |
| } |