(root)/
glib-2.79.0/
girepository/
tests/
repository.c
       1  /*
       2   * Copyright 2023 GNOME Foundation, Inc.
       3   *
       4   * SPDX-License-Identifier: LGPL-2.1-or-later
       5   *
       6   * This library is free software; you can redistribute it and/or
       7   * modify it under the terms of the GNU Lesser General Public
       8   * License as published by the Free Software Foundation; either
       9   * version 2.1 of the License, or (at your option) any later version.
      10   *
      11   * This library is distributed in the hope that it will be useful,
      12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
      13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14   * Lesser General Public License for more details.
      15   *
      16   * You should have received a copy of the GNU Lesser General
      17   * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
      18   *
      19   * Author: Philip Withnall <pwithnall@gnome.org>
      20   */
      21  
      22  #include "glib.h"
      23  #include "girepository.h"
      24  
      25  static void
      26  test_repository_basic (void)
      27  {
      28    GIRepository *repository;
      29    char *gobject_typelib_dir = NULL;
      30    const char * const * search_paths;
      31    GITypelib *typelib = NULL;
      32    char **namespaces = NULL;
      33    const char *expected_namespaces[] = { "GLib", NULL };
      34    GError *local_error = NULL;
      35    char **versions;
      36    size_t n_versions;
      37  
      38    g_test_summary ("Test basic opening of a repository and requiring a typelib");
      39  
      40    gobject_typelib_dir = g_test_build_filename (G_TEST_BUILT, "..", "..", "introspection", NULL);
      41    g_test_message ("Using GI_TYPELIB_DIR = %s", gobject_typelib_dir);
      42    gi_repository_prepend_search_path (gobject_typelib_dir);
      43  
      44    repository = gi_repository_new ();
      45    g_assert_nonnull (repository);
      46  
      47    versions = gi_repository_enumerate_versions (repository, "SomeInvalidNamespace", &n_versions);
      48    g_assert_nonnull (versions);
      49    g_assert_cmpstrv (versions, ((char *[]){NULL}));
      50    g_assert_cmpuint (n_versions, ==, 0);
      51    g_clear_pointer (&versions, g_strfreev);
      52  
      53    versions = gi_repository_enumerate_versions (repository, "GLib", NULL);
      54    g_assert_nonnull (versions);
      55    g_assert_cmpstrv (versions, ((char *[]){"2.0", NULL}));
      56    g_clear_pointer (&versions, g_strfreev);
      57  
      58    search_paths = gi_repository_get_search_path (NULL);
      59    g_assert_nonnull (search_paths);
      60    g_assert_cmpuint (g_strv_length ((char **) search_paths), >, 0);
      61    g_assert_cmpstr (search_paths[0], ==, gobject_typelib_dir);
      62  
      63    typelib = gi_repository_require (repository, "GLib", "2.0", 0, &local_error);
      64    g_assert_no_error (local_error);
      65    g_assert_nonnull (typelib);
      66  
      67    namespaces = gi_repository_get_loaded_namespaces (repository);
      68    g_assert_cmpstrv (namespaces, expected_namespaces);
      69    g_strfreev (namespaces);
      70  
      71    g_free (gobject_typelib_dir);
      72    g_clear_object (&repository);
      73  }
      74  
      75  static void
      76  test_repository_info (void)
      77  {
      78    GIRepository *repository;
      79    char *gobject_typelib_dir = NULL;
      80    GITypelib *typelib = NULL;
      81    GIObjectInfo *object_info = NULL;
      82    GISignalInfo *signal_info = NULL;
      83    GError *local_error = NULL;
      84  
      85    g_test_summary ("Test retrieving some basic info blobs from a typelib");
      86  
      87    gobject_typelib_dir = g_test_build_filename (G_TEST_BUILT, "..", "..", "introspection", NULL);
      88    g_test_message ("Using GI_TYPELIB_DIR = %s", gobject_typelib_dir);
      89    gi_repository_prepend_search_path (gobject_typelib_dir);
      90    g_free (gobject_typelib_dir);
      91  
      92    repository = gi_repository_new ();
      93    g_assert_nonnull (repository);
      94  
      95    typelib = gi_repository_require (repository, "GObject", "2.0", 0, &local_error);
      96    g_assert_no_error (local_error);
      97    g_assert_nonnull (typelib);
      98  
      99    object_info = (GIObjectInfo *) gi_repository_find_by_name (repository, "GObject", "Object");
     100    g_assert_nonnull (object_info);
     101  
     102    g_assert_cmpint (gi_base_info_get_info_type ((GIBaseInfo *) object_info), ==, GI_INFO_TYPE_OBJECT);
     103    g_assert_cmpstr (gi_base_info_get_name ((GIBaseInfo *) object_info), ==, "Object");
     104    g_assert_cmpstr (gi_base_info_get_namespace ((GIBaseInfo *) object_info), ==, "GObject");
     105  
     106    signal_info = gi_object_info_find_signal (object_info, "notify");
     107    g_assert_nonnull (signal_info);
     108  
     109    g_assert_cmpint (gi_signal_info_get_flags (signal_info), ==,
     110                     G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_NO_HOOKS | G_SIGNAL_ACTION);
     111  
     112    gi_base_info_unref ((GIBaseInfo *) signal_info);
     113    gi_base_info_unref ((GIBaseInfo *) object_info);
     114    g_clear_object (&repository);
     115  }
     116  
     117  static void
     118  test_repository_dependencies (void)
     119  {
     120    GIRepository *repository;
     121    GITypelib *typelib;
     122    GError *error = NULL;
     123    char *gobject_typelib_dir = NULL;
     124    char **dependencies;
     125  
     126    g_test_summary ("Test ensures namespace dependencies are correctly exposed");
     127  
     128    gobject_typelib_dir = g_test_build_filename (G_TEST_BUILT, "..", "..", "gobject", NULL);
     129    g_test_message ("Using GI_TYPELIB_DIR = %s", gobject_typelib_dir);
     130    gi_repository_prepend_search_path (gobject_typelib_dir);
     131    g_free (gobject_typelib_dir);
     132  
     133    repository = gi_repository_new ();
     134    g_assert_nonnull (repository);
     135  
     136    typelib = gi_repository_require (repository, "GObject", "2.0", 0, &error);
     137    g_assert_no_error (error);
     138    g_assert_nonnull (typelib);
     139  
     140    dependencies = gi_repository_get_dependencies (repository, "GObject");
     141    g_assert_cmpuint (g_strv_length (dependencies), ==, 1);
     142    g_assert_true (g_strv_contains ((const char **) dependencies, "GLib-2.0"));
     143  
     144    g_clear_error (&error);
     145    g_clear_object (&repository);
     146    g_clear_pointer (&dependencies, g_strfreev);
     147  }
     148  
     149  int
     150  main (int   argc,
     151        char *argv[])
     152  {
     153    /* Isolate from the system typelibs and GIRs. */
     154    g_setenv ("GI_TYPELIB_PATH", "/dev/null", TRUE);
     155    g_setenv ("GI_GIR_PATH", "/dev/null", TRUE);
     156  
     157    g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
     158  
     159    g_test_add_func ("/repository/basic", test_repository_basic);
     160    g_test_add_func ("/repository/info", test_repository_info);
     161    g_test_add_func ("/repository/dependencies", test_repository_dependencies);
     162  
     163    return g_test_run ();
     164  }