LCOV - code coverage report
Current view: top level - glib/gobject/tests - type-flags.c (source / functions) Hit Total Coverage
Test: unnamed Lines: 81 87 93.1 %
Date: 2024-04-30 05:17:35 Functions: 18 22 81.8 %
Branches: 18 24 75.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: LGPL-2.1-or-later
       2                 :            : // SPDX-FileCopyrightText: 2021  Emmanuele Bassi
       3                 :            : 
       4                 :            : #include <glib-object.h>
       5                 :            : 
       6                 :            : typedef struct
       7                 :            : {
       8                 :            :   GTypeInterface g_iface;
       9                 :            : } TestInterfaceInterface;
      10                 :            : 
      11                 :            : GType test_interface_get_type (void);
      12                 :            : #define TEST_TYPE_INTERFACE test_interface_get_type ()
      13   [ +  +  +  -  :         12 : G_DEFINE_INTERFACE (TestInterface, test_interface, G_TYPE_INVALID)
                   +  + ]
      14                 :            : 
      15                 :            : static void
      16                 :          0 : test_interface_default_init (TestInterfaceInterface *iface)
      17                 :            : {
      18                 :          0 : }
      19                 :            : 
      20                 :            : static void
      21                 :          1 : test_type_flags_interface (void)
      22                 :            : {
      23                 :          1 :   g_assert_false (G_TYPE_IS_ABSTRACT (TEST_TYPE_INTERFACE));
      24                 :          1 :   g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_ABSTRACT));
      25                 :            : 
      26                 :          1 :   g_assert_false (G_TYPE_IS_CLASSED (TEST_TYPE_INTERFACE));
      27                 :          1 :   g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_CLASSED));
      28                 :            : 
      29                 :          1 :   g_assert_false (G_TYPE_IS_DEEP_DERIVABLE (TEST_TYPE_INTERFACE));
      30                 :          1 :   g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_DEEP_DERIVABLE));
      31                 :            : 
      32                 :          1 :   g_assert_true (G_TYPE_IS_DERIVABLE (TEST_TYPE_INTERFACE));
      33                 :          1 :   g_assert_true (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_DERIVABLE));
      34                 :            : 
      35                 :          1 :   g_assert_false (G_TYPE_IS_FINAL (TEST_TYPE_INTERFACE));
      36                 :          1 :   g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_FINAL));
      37                 :            : 
      38                 :          1 :   g_assert_false (G_TYPE_IS_INSTANTIATABLE (TEST_TYPE_INTERFACE));
      39                 :          1 :   g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_INSTANTIATABLE));
      40                 :          1 : }
      41                 :            : 
      42                 :            : #define TEST_TYPE_FINAL (test_final_get_type())
      43                 :            : G_DECLARE_FINAL_TYPE (TestFinal, test_final, TEST, FINAL, GObject)
      44                 :            : 
      45                 :            : struct _TestFinal
      46                 :            : {
      47                 :            :   GObject parent_instance;
      48                 :            : };
      49                 :            : 
      50                 :            : struct _TestFinalClass
      51                 :            : {
      52                 :            :   GObjectClass parent_class;
      53                 :            : };
      54                 :            : 
      55   [ +  +  +  -  :         14 : G_DEFINE_FINAL_TYPE (TestFinal, test_final, G_TYPE_OBJECT)
                   +  + ]
      56                 :            : 
      57                 :            : static void
      58                 :          1 : test_final_class_init (TestFinalClass *klass)
      59                 :            : {
      60                 :          1 : }
      61                 :            : 
      62                 :            : static void
      63                 :          1 : test_final_init (TestFinal *self)
      64                 :            : {
      65                 :          1 : }
      66                 :            : 
      67                 :            : #define TEST_TYPE_FINAL2 (test_final2_get_type())
      68                 :            : G_DECLARE_FINAL_TYPE (TestFinal2, test_final2, TEST, FINAL2, TestFinal)
      69                 :            : 
      70                 :            : struct _TestFinal2
      71                 :            : {
      72                 :            :   TestFinal parent_instance;
      73                 :            : };
      74                 :            : 
      75                 :            : struct _TestFinal2Class
      76                 :            : {
      77                 :            :   TestFinalClass parent_class;
      78                 :            : };
      79                 :            : 
      80   [ +  -  +  -  :          2 : G_DEFINE_TYPE (TestFinal2, test_final2, TEST_TYPE_FINAL)
                   +  - ]
      81                 :            : 
      82                 :            : static void
      83                 :          0 : test_final2_class_init (TestFinal2Class *klass)
      84                 :            : {
      85                 :          0 : }
      86                 :            : 
      87                 :            : static void
      88                 :          0 : test_final2_init (TestFinal2 *self)
      89                 :            : {
      90                 :          0 : }
      91                 :            : 
      92                 :            : /* test_type_flags_final: Check that trying to derive from a final class
      93                 :            :  * will result in a warning from the type system
      94                 :            :  */
      95                 :            : static void
      96                 :          1 : test_type_flags_final (void)
      97                 :            : {
      98                 :            :   GType final2_type;
      99                 :            : 
     100                 :          1 :   g_assert_true (G_TYPE_IS_FINAL (TEST_TYPE_FINAL));
     101                 :          1 :   g_assert_true (g_type_test_flags (TEST_TYPE_FINAL, G_TYPE_FLAG_FINAL));
     102                 :          1 :   g_assert_true (G_TYPE_IS_CLASSED (TEST_TYPE_FINAL));
     103                 :          1 :   g_assert_true (g_type_test_flags (TEST_TYPE_FINAL, G_TYPE_FLAG_CLASSED));
     104                 :          1 :   g_assert_true (G_TYPE_IS_INSTANTIATABLE (TEST_TYPE_FINAL));
     105                 :          1 :   g_assert_true (g_type_test_flags (TEST_TYPE_FINAL, G_TYPE_FLAG_INSTANTIATABLE));
     106                 :          1 :   g_assert_true (g_type_test_flags (TEST_TYPE_FINAL,
     107                 :            :                                     G_TYPE_FLAG_FINAL |
     108                 :            :                                     G_TYPE_FLAG_CLASSED |
     109                 :            :                                     G_TYPE_FLAG_INSTANTIATABLE));
     110                 :          1 :   g_assert_false (g_type_test_flags (TEST_TYPE_FINAL,
     111                 :            :                                      G_TYPE_FLAG_FINAL |
     112                 :            :                                      G_TYPE_FLAG_CLASSED |
     113                 :            :                                      G_TYPE_FLAG_DEPRECATED |
     114                 :            :                                      G_TYPE_FLAG_INSTANTIATABLE));
     115                 :            : 
     116                 :            :   /* This is the message we print out when registering the type */
     117                 :          1 :   g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL,
     118                 :            :                          "*cannot derive*");
     119                 :            : 
     120                 :            :   /* This is the message when we fail to return from the GOnce init
     121                 :            :    * block within the test_final2_get_type() function
     122                 :            :    */
     123                 :          1 :   g_test_expect_message ("GLib", G_LOG_LEVEL_CRITICAL,
     124                 :            :                          "*g_once_init_leave_pointer: assertion*");
     125                 :            : 
     126                 :          1 :   final2_type = TEST_TYPE_FINAL2;
     127                 :          1 :   g_assert_true (final2_type == G_TYPE_INVALID);
     128                 :            : 
     129                 :          1 :   g_test_assert_expected_messages ();
     130                 :          1 : }
     131                 :            : 
     132                 :            : #define TEST_TYPE_DEPRECATED (test_deprecated_get_type())
     133                 :            : G_DECLARE_FINAL_TYPE (TestDeprecated, test_deprecated, TEST, DEPRECATED, GObject)
     134                 :            : 
     135                 :            : struct _TestDeprecated
     136                 :            : {
     137                 :            :   GObject parent_instance;
     138                 :            : };
     139                 :            : 
     140                 :            : struct _TestDeprecatedClass
     141                 :            : {
     142                 :            :   GObjectClass parent_class;
     143                 :            : };
     144                 :            : 
     145   [ +  +  +  -  :          5 : G_DEFINE_TYPE_EXTENDED (TestDeprecated, test_deprecated, G_TYPE_OBJECT, G_TYPE_FLAG_FINAL | G_TYPE_FLAG_DEPRECATED, {})
                   +  + ]
     146                 :            : 
     147                 :            : static void
     148                 :          1 : test_deprecated_class_init (TestDeprecatedClass *klass)
     149                 :            : {
     150                 :          1 : }
     151                 :            : 
     152                 :            : static void
     153                 :          2 : test_deprecated_init (TestDeprecated *self)
     154                 :            : {
     155                 :          2 : }
     156                 :            : 
     157                 :            : static void
     158                 :          1 : test_type_flags_final_instance_check (void)
     159                 :            : {
     160                 :            :   TestFinal *final;
     161                 :            : 
     162                 :          1 :   final = g_object_new (TEST_TYPE_FINAL, NULL);
     163                 :          1 :   g_assert_true (g_type_check_instance_is_a ((GTypeInstance *) final,
     164                 :            :                                               TEST_TYPE_FINAL));
     165                 :          1 :   g_assert_false (g_type_check_instance_is_a ((GTypeInstance *) final,
     166                 :            :                                               TEST_TYPE_DEPRECATED));
     167                 :          1 :   g_assert_true (g_type_check_instance_is_a ((GTypeInstance *) final,
     168                 :            :                                               G_TYPE_OBJECT));
     169                 :          1 :   g_assert_false (g_type_check_instance_is_a ((GTypeInstance *) final,
     170                 :            :                                               G_TYPE_INVALID));
     171                 :            : 
     172                 :          1 :   g_clear_object (&final);
     173                 :          1 : }
     174                 :            : 
     175                 :            : static void
     176                 :          1 : test_type_flags_deprecated (void)
     177                 :            : {
     178                 :            :   GType deprecated_type;
     179                 :          1 :   GObject *deprecated_object = NULL;
     180                 :            : 
     181                 :          1 :   g_test_summary ("Test that trying to instantiate a deprecated type results in a warning.");
     182                 :            : 
     183                 :            :   /* This is the message we print out when registering the type */
     184                 :          1 :   g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_WARNING,
     185                 :            :                          "*The type TestDeprecated is deprecated and shouldn’t be used any more*");
     186                 :            : 
     187                 :            :   /* The type itself should not be considered invalid. */
     188                 :          1 :   deprecated_type = TEST_TYPE_DEPRECATED;
     189                 :          1 :   g_assert_false (deprecated_type == G_TYPE_INVALID);
     190                 :          1 :   g_assert_true (G_TYPE_IS_DEPRECATED (deprecated_type));
     191                 :            : 
     192                 :          1 :   g_assert_true (G_TYPE_IS_FINAL (deprecated_type));
     193                 :          1 :   g_assert_true (g_type_test_flags (deprecated_type, G_TYPE_FLAG_FINAL));
     194                 :            : 
     195                 :          1 :   g_assert_true (g_type_test_flags (deprecated_type,
     196                 :            :                                     G_TYPE_FLAG_DEPRECATED |
     197                 :            :                                     G_TYPE_FLAG_CLASSED |
     198                 :            :                                     G_TYPE_FLAG_FINAL |
     199                 :            :                                     G_TYPE_FLAG_INSTANTIATABLE));
     200                 :          1 :   g_assert_false (g_type_test_flags (deprecated_type,
     201                 :            :                                      G_TYPE_FLAG_DEPRECATED |
     202                 :            :                                      G_TYPE_FLAG_CLASSED |
     203                 :            :                                      G_TYPE_FLAG_FINAL |
     204                 :            :                                      G_TYPE_FLAG_ABSTRACT |
     205                 :            :                                      G_TYPE_FLAG_INSTANTIATABLE));
     206                 :            : 
     207                 :            :   /* Instantiating it should work, but emit a warning. */
     208                 :          1 :   deprecated_object = g_object_new (deprecated_type, NULL);
     209                 :          1 :   g_assert_nonnull (deprecated_object);
     210                 :            : 
     211                 :          1 :   g_test_assert_expected_messages ();
     212                 :            : 
     213                 :          1 :   g_object_unref (deprecated_object);
     214                 :            : 
     215                 :            :   /* Instantiating it again should not emit a second warning. */
     216                 :          1 :   deprecated_object = g_object_new (deprecated_type, NULL);
     217                 :          1 :   g_assert_nonnull (deprecated_object);
     218                 :            : 
     219                 :          1 :   g_assert_true (g_type_check_instance_is_a ((GTypeInstance *) deprecated_object,
     220                 :            :                                               TEST_TYPE_DEPRECATED));
     221                 :          1 :   g_assert_true (g_type_check_instance_is_a ((GTypeInstance *) deprecated_object,
     222                 :            :                                               G_TYPE_OBJECT));
     223                 :          1 :   g_assert_false (g_type_check_instance_is_a ((GTypeInstance *) deprecated_object,
     224                 :            :                                               TEST_TYPE_FINAL));
     225                 :          1 :   g_assert_false (g_type_check_instance_is_a ((GTypeInstance *) deprecated_object,
     226                 :            :                                               G_TYPE_INVALID));
     227                 :            : 
     228                 :          1 :   g_test_assert_expected_messages ();
     229                 :            : 
     230                 :          1 :   g_object_unref (deprecated_object);
     231                 :          1 : }
     232                 :            : 
     233                 :            : int
     234                 :          1 : main (int argc, char *argv[])
     235                 :            : {
     236                 :          1 :   g_test_init (&argc, &argv, NULL);
     237                 :            : 
     238                 :          1 :   g_setenv ("G_ENABLE_DIAGNOSTIC", "1", TRUE);
     239                 :            : 
     240                 :          1 :   g_test_add_func ("/type/flags/interface", test_type_flags_interface);
     241                 :          1 :   g_test_add_func ("/type/flags/final", test_type_flags_final);
     242                 :          1 :   g_test_add_func ("/type/flags/final/instance-check", test_type_flags_final_instance_check);
     243                 :          1 :   g_test_add_func ("/type/flags/deprecated", test_type_flags_deprecated);
     244                 :            : 
     245                 :          1 :   return g_test_run ();
     246                 :            : }

Generated by: LCOV version 1.14