(root)/
glib-2.79.0/
gobject/
tests/
type.c
       1  #include <glib-object.h>
       2  
       3  static void
       4  test_registration_serial (void)
       5  {
       6    gint serial1, serial2, serial3;
       7  
       8    serial1 = g_type_get_type_registration_serial ();
       9    g_pointer_type_register_static ("my+pointer");
      10    serial2 = g_type_get_type_registration_serial ();
      11    g_assert (serial1 != serial2);
      12    serial3 = g_type_get_type_registration_serial ();
      13    g_assert (serial2 == serial3);
      14  }
      15  
      16  typedef struct {
      17    GTypeInterface g_iface;
      18  } BarInterface;
      19  
      20  GType bar_get_type (void);
      21  
      22  G_DEFINE_INTERFACE (Bar, bar, G_TYPE_OBJECT)
      23  
      24  static void
      25  bar_default_init (BarInterface *iface)
      26  {
      27  }
      28  
      29  typedef struct {
      30    GTypeInterface g_iface;
      31  } FooInterface;
      32  
      33  GType foo_get_type (void);
      34  
      35  G_DEFINE_INTERFACE_WITH_CODE (Foo, foo, G_TYPE_OBJECT,
      36                                g_type_interface_add_prerequisite (g_define_type_id, bar_get_type ()))
      37  
      38  static void
      39  foo_default_init (FooInterface *iface)
      40  {
      41  }
      42  
      43  typedef struct {
      44    GTypeInterface g_iface;
      45  } BaaInterface;
      46  
      47  GType baa_get_type (void);
      48  
      49  G_DEFINE_INTERFACE (Baa, baa, G_TYPE_INVALID)
      50  
      51  static void
      52  baa_default_init (BaaInterface *iface)
      53  {
      54  }
      55  
      56  typedef struct {
      57    GTypeInterface g_iface;
      58  } BooInterface;
      59  
      60  GType boo_get_type (void);
      61  
      62  G_DEFINE_INTERFACE_WITH_CODE (Boo, boo, G_TYPE_INVALID,
      63                                g_type_interface_add_prerequisite (g_define_type_id, baa_get_type ()))
      64  
      65  static void
      66  boo_default_init (BooInterface *iface)
      67  {
      68  }
      69  
      70  typedef struct {
      71    GTypeInterface g_iface;
      72  } BibiInterface;
      73  
      74  GType bibi_get_type (void);
      75  
      76  G_DEFINE_INTERFACE (Bibi, bibi, G_TYPE_INITIALLY_UNOWNED)
      77  
      78  static void
      79  bibi_default_init (BibiInterface *iface)
      80  {
      81  }
      82  
      83  typedef struct {
      84    GTypeInterface g_iface;
      85  } BozoInterface;
      86  
      87  GType bozo_get_type (void);
      88  
      89  G_DEFINE_INTERFACE_WITH_CODE (Bozo, bozo, G_TYPE_INVALID,
      90                                g_type_interface_add_prerequisite (g_define_type_id, foo_get_type ());
      91                                g_type_interface_add_prerequisite (g_define_type_id, bibi_get_type ()))
      92  
      93  static void
      94  bozo_default_init (BozoInterface *iface)
      95  {
      96  }
      97  
      98  
      99  
     100  static void
     101  test_interface_prerequisite (void)
     102  {
     103    GType *prereqs;
     104    guint n_prereqs;
     105    gpointer iface;
     106    gpointer parent;
     107  
     108    prereqs = g_type_interface_prerequisites (foo_get_type (), &n_prereqs);
     109    g_assert_cmpint (n_prereqs, ==, 2);
     110    g_assert (prereqs[0] == bar_get_type ());
     111    g_assert (prereqs[1] == G_TYPE_OBJECT);
     112    g_assert (g_type_interface_instantiatable_prerequisite (foo_get_type ()) == G_TYPE_OBJECT);
     113  
     114    iface = g_type_default_interface_ref (foo_get_type ());
     115    parent = g_type_interface_peek_parent (iface);
     116    g_assert (parent == NULL);
     117    g_type_default_interface_unref (iface);
     118  
     119    g_free (prereqs);
     120  
     121    g_assert_cmpint (g_type_interface_instantiatable_prerequisite (baa_get_type ()), ==, G_TYPE_INVALID);
     122    g_assert_cmpint (g_type_interface_instantiatable_prerequisite (boo_get_type ()), ==, G_TYPE_INVALID);
     123  
     124    g_assert_cmpint (g_type_interface_instantiatable_prerequisite (bozo_get_type ()), ==, G_TYPE_INITIALLY_UNOWNED);
     125  }
     126  
     127  typedef struct {
     128    GTypeInterface g_iface;
     129  } BazInterface;
     130  
     131  GType baz_get_type (void);
     132  
     133  G_DEFINE_INTERFACE (Baz, baz, G_TYPE_OBJECT)
     134  
     135  static void
     136  baz_default_init (BazInterface *iface)
     137  {
     138  }
     139  
     140  typedef struct {
     141    GObject parent;
     142  } Bazo;
     143  
     144  typedef struct {
     145    GObjectClass parent_class;
     146  } BazoClass;
     147  
     148  GType bazo_get_type (void);
     149  static void bazo_iface_init (BazInterface *i);
     150  
     151  G_DEFINE_TYPE_WITH_CODE (Bazo, bazo, G_TYPE_INITIALLY_UNOWNED,
     152                           G_IMPLEMENT_INTERFACE (baz_get_type (),
     153                                                  bazo_iface_init);)
     154  
     155  static void
     156  bazo_init (Bazo *b)
     157  {
     158  }
     159  
     160  static void
     161  bazo_class_init (BazoClass *c)
     162  {
     163  }
     164  
     165  static void
     166  bazo_iface_init (BazInterface *i)
     167  {
     168  }
     169  
     170  static gint check_called;
     171  
     172  static void
     173  check_func (gpointer check_data,
     174              gpointer g_iface)
     175  {
     176    g_assert (check_data == &check_called);
     177  
     178    check_called++;
     179  }
     180  
     181  static void
     182  test_interface_check (void)
     183  {
     184    GObject *o;
     185  
     186    check_called = 0;
     187    g_type_add_interface_check (&check_called, check_func);
     188    o = g_object_ref_sink (g_object_new (bazo_get_type (), NULL));
     189    g_object_unref (o);
     190    g_assert_cmpint (check_called, ==, 1);
     191    g_type_remove_interface_check (&check_called, check_func);
     192  }
     193  
     194  static void
     195  test_next_base (void)
     196  {
     197    GType type;
     198  
     199    type = g_type_next_base (bazo_get_type (), G_TYPE_OBJECT);
     200  
     201    g_assert (type == G_TYPE_INITIALLY_UNOWNED);
     202  }
     203  
     204  /* Test that the macro an function versions of g_type_is_a
     205   * work the same
     206   */
     207  static void
     208  test_is_a (void)
     209  {
     210    g_assert_true (g_type_is_a (G_TYPE_OBJECT, G_TYPE_OBJECT));
     211    g_assert_true ((g_type_is_a) (G_TYPE_OBJECT, G_TYPE_OBJECT));
     212    g_assert_true (g_type_is_a (bar_get_type (), G_TYPE_OBJECT));
     213    g_assert_true ((g_type_is_a) (bar_get_type (), G_TYPE_OBJECT));
     214    g_assert_false (g_type_is_a (bar_get_type (), bibi_get_type ()));
     215    g_assert_false ((g_type_is_a) (bar_get_type (), bibi_get_type ()));
     216  }
     217  
     218  static void
     219  test_query (void)
     220  {
     221    GTypeQuery results;
     222  
     223    g_test_message ("Invalid types can’t be queried.");
     224    g_type_query (G_TYPE_INVALID, &results);
     225    g_assert_cmpuint (results.type, ==, 0);
     226  
     227    g_test_message ("Unclassed types can’t be queried.");
     228    g_type_query (G_TYPE_INT64, &results);
     229    g_assert_cmpuint (results.type, ==, 0);
     230  }
     231  
     232  int
     233  main (int argc, char *argv[])
     234  {
     235    g_test_init (&argc, &argv, NULL);
     236  
     237    g_test_add_func ("/type/registration-serial", test_registration_serial);
     238    g_test_add_func ("/type/interface-prerequisite", test_interface_prerequisite);
     239    g_test_add_func ("/type/interface-check", test_interface_check);
     240    g_test_add_func ("/type/next-base", test_next_base);
     241    g_test_add_func ("/type/is-a", test_is_a);
     242    g_test_add_func ("/type/query", test_query);
     243  
     244    return g_test_run ();
     245  }