summaryrefslogtreecommitdiff
path: root/gobject/tests/type-flags.c
diff options
context:
space:
mode:
Diffstat (limited to 'gobject/tests/type-flags.c')
-rw-r--r--gobject/tests/type-flags.c160
1 files changed, 159 insertions, 1 deletions
diff --git a/gobject/tests/type-flags.c b/gobject/tests/type-flags.c
index 249153b55..bb67f8c03 100644
--- a/gobject/tests/type-flags.c
+++ b/gobject/tests/type-flags.c
@@ -3,6 +3,42 @@
#include <glib-object.h>
+typedef struct
+{
+ GTypeInterface g_iface;
+} TestInterfaceInterface;
+
+GType test_interface_get_type (void);
+#define TEST_TYPE_INTERFACE test_interface_get_type ()
+G_DEFINE_INTERFACE (TestInterface, test_interface, G_TYPE_INVALID)
+
+static void
+test_interface_default_init (TestInterfaceInterface *iface)
+{
+}
+
+static void
+test_type_flags_interface (void)
+{
+ g_assert_false (G_TYPE_IS_ABSTRACT (TEST_TYPE_INTERFACE));
+ g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_ABSTRACT));
+
+ g_assert_false (G_TYPE_IS_CLASSED (TEST_TYPE_INTERFACE));
+ g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_CLASSED));
+
+ g_assert_false (G_TYPE_IS_DEEP_DERIVABLE (TEST_TYPE_INTERFACE));
+ g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_DEEP_DERIVABLE));
+
+ g_assert_true (G_TYPE_IS_DERIVABLE (TEST_TYPE_INTERFACE));
+ g_assert_true (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_DERIVABLE));
+
+ g_assert_false (G_TYPE_IS_FINAL (TEST_TYPE_INTERFACE));
+ g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_FINAL));
+
+ g_assert_false (G_TYPE_IS_INSTANTIATABLE (TEST_TYPE_INTERFACE));
+ g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_INSTANTIATABLE));
+}
+
#define TEST_TYPE_FINAL (test_final_get_type())
G_DECLARE_FINAL_TYPE (TestFinal, test_final, TEST, FINAL, GObject)
@@ -61,8 +97,24 @@ test_type_flags_final (void)
{
GType final2_type;
+ g_assert_true (G_TYPE_IS_FINAL (TEST_TYPE_FINAL));
+ g_assert_true (g_type_test_flags (TEST_TYPE_FINAL, G_TYPE_FLAG_FINAL));
+ g_assert_true (G_TYPE_IS_CLASSED (TEST_TYPE_FINAL));
+ g_assert_true (g_type_test_flags (TEST_TYPE_FINAL, G_TYPE_FLAG_CLASSED));
+ g_assert_true (G_TYPE_IS_INSTANTIATABLE (TEST_TYPE_FINAL));
+ g_assert_true (g_type_test_flags (TEST_TYPE_FINAL, G_TYPE_FLAG_INSTANTIATABLE));
+ g_assert_true (g_type_test_flags (TEST_TYPE_FINAL,
+ G_TYPE_FLAG_FINAL |
+ G_TYPE_FLAG_CLASSED |
+ G_TYPE_FLAG_INSTANTIATABLE));
+ g_assert_false (g_type_test_flags (TEST_TYPE_FINAL,
+ G_TYPE_FLAG_FINAL |
+ G_TYPE_FLAG_CLASSED |
+ G_TYPE_FLAG_DEPRECATED |
+ G_TYPE_FLAG_INSTANTIATABLE));
+
/* This is the message we print out when registering the type */
- g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_WARNING,
+ g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
"*cannot derive*");
/* This is the message when we fail to return from the GOnce init
@@ -77,12 +129,118 @@ test_type_flags_final (void)
g_test_assert_expected_messages ();
}
+#define TEST_TYPE_DEPRECATED (test_deprecated_get_type())
+G_DECLARE_FINAL_TYPE (TestDeprecated, test_deprecated, TEST, DEPRECATED, GObject)
+
+struct _TestDeprecated
+{
+ GObject parent_instance;
+};
+
+struct _TestDeprecatedClass
+{
+ GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE_EXTENDED (TestDeprecated, test_deprecated, G_TYPE_OBJECT, G_TYPE_FLAG_FINAL | G_TYPE_FLAG_DEPRECATED, {})
+
+static void
+test_deprecated_class_init (TestDeprecatedClass *klass)
+{
+}
+
+static void
+test_deprecated_init (TestDeprecated *self)
+{
+}
+
+static void
+test_type_flags_final_instance_check (void)
+{
+ TestFinal *final;
+
+ final = g_object_new (TEST_TYPE_FINAL, NULL);
+ g_assert_true (g_type_check_instance_is_a ((GTypeInstance *) final,
+ TEST_TYPE_FINAL));
+ g_assert_false (g_type_check_instance_is_a ((GTypeInstance *) final,
+ TEST_TYPE_DEPRECATED));
+ g_assert_true (g_type_check_instance_is_a ((GTypeInstance *) final,
+ G_TYPE_OBJECT));
+ g_assert_false (g_type_check_instance_is_a ((GTypeInstance *) final,
+ G_TYPE_INVALID));
+
+ g_clear_object (&final);
+}
+
+static void
+test_type_flags_deprecated (void)
+{
+ GType deprecated_type;
+ GObject *deprecated_object = NULL;
+
+ g_test_summary ("Test that trying to instantiate a deprecated type results in a warning.");
+
+ /* This is the message we print out when registering the type */
+ g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_WARNING,
+ "*The type TestDeprecated is deprecated and shouldn’t be used any more*");
+
+ /* The type itself should not be considered invalid. */
+ deprecated_type = TEST_TYPE_DEPRECATED;
+ g_assert_false (deprecated_type == G_TYPE_INVALID);
+ g_assert_true (G_TYPE_IS_DEPRECATED (deprecated_type));
+
+ g_assert_true (G_TYPE_IS_FINAL (deprecated_type));
+ g_assert_true (g_type_test_flags (deprecated_type, G_TYPE_FLAG_FINAL));
+
+ g_assert_true (g_type_test_flags (deprecated_type,
+ G_TYPE_FLAG_DEPRECATED |
+ G_TYPE_FLAG_CLASSED |
+ G_TYPE_FLAG_FINAL |
+ G_TYPE_FLAG_INSTANTIATABLE));
+ g_assert_false (g_type_test_flags (deprecated_type,
+ G_TYPE_FLAG_DEPRECATED |
+ G_TYPE_FLAG_CLASSED |
+ G_TYPE_FLAG_FINAL |
+ G_TYPE_FLAG_ABSTRACT |
+ G_TYPE_FLAG_INSTANTIATABLE));
+
+ /* Instantiating it should work, but emit a warning. */
+ deprecated_object = g_object_new (deprecated_type, NULL);
+ g_assert_nonnull (deprecated_object);
+
+ g_test_assert_expected_messages ();
+
+ g_object_unref (deprecated_object);
+
+ /* Instantiating it again should not emit a second warning. */
+ deprecated_object = g_object_new (deprecated_type, NULL);
+ g_assert_nonnull (deprecated_object);
+
+ g_assert_true (g_type_check_instance_is_a ((GTypeInstance *) deprecated_object,
+ TEST_TYPE_DEPRECATED));
+ g_assert_true (g_type_check_instance_is_a ((GTypeInstance *) deprecated_object,
+ G_TYPE_OBJECT));
+ g_assert_false (g_type_check_instance_is_a ((GTypeInstance *) deprecated_object,
+ TEST_TYPE_FINAL));
+ g_assert_false (g_type_check_instance_is_a ((GTypeInstance *) deprecated_object,
+ G_TYPE_INVALID));
+
+ g_test_assert_expected_messages ();
+
+ g_object_unref (deprecated_object);
+}
+
int
main (int argc, char *argv[])
{
g_test_init (&argc, &argv, NULL);
+ g_setenv ("G_ENABLE_DIAGNOSTIC", "1", TRUE);
+
+ g_test_add_func ("/type/flags/interface", test_type_flags_interface);
g_test_add_func ("/type/flags/final", test_type_flags_final);
+ g_test_add_func ("/type/flags/final/instance-check", test_type_flags_final_instance_check);
+ g_test_add_func ("/type/flags/deprecated", test_type_flags_deprecated);
return g_test_run ();
}