[gtk/matthiasc/css-change-tracking-4: 13/20] Add a test for css change flags



commit 0f23ca1847a7a9729047ca5a2b2342603cac18e7
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Jan 16 20:02:55 2020 -0500

    Add a test for css change flags

 testsuite/css/change/change.test.in    |   4 +
 testsuite/css/change/meson.build       |  35 ++++
 testsuite/css/change/test-css-change.c | 309 +++++++++++++++++++++++++++++++++
 3 files changed, 348 insertions(+)
---
diff --git a/testsuite/css/change/change.test.in b/testsuite/css/change/change.test.in
new file mode 100644
index 0000000000..0996111779
--- /dev/null
+++ b/testsuite/css/change/change.test.in
@@ -0,0 +1,4 @@
+[Test]
+Exec=@libexecdir@/installed-tests/gtk-4.0/css/change/test-css-change --tap -k
+Type=session
+Output=TAP
diff --git a/testsuite/css/change/meson.build b/testsuite/css/change/meson.build
new file mode 100644
index 0000000000..f12c34d67f
--- /dev/null
+++ b/testsuite/css/change/meson.build
@@ -0,0 +1,35 @@
+testexecdir = join_paths(installed_test_bindir, 'css', 'change')
+testdatadir = join_paths(installed_test_datadir, 'css')
+
+test_change = executable(
+  'test-css-change',
+  'test-css-change.c',
+  dependencies: libgtk_dep,
+  install: get_option('install-tests'),
+  install_dir: testexecdir,
+)
+test('change', test_change,
+     args: [ '--tap', '-k' ],
+     env: [ 'GIO_USE_VOLUME_MONITOR=unix',
+            'GSETTINGS_BACKEND=memory',
+            'GTK_CSD=1',
+            'G_ENABLE_DIAGNOSTIC=0',
+            'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()),
+            'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir())
+          ],
+     suite: 'css')
+
+test_data = [
+]
+
+if get_option('install-tests')
+  conf = configuration_data()
+  conf.set('libexecdir', gtk_libexecdir)
+  configure_file(input: 'change.test.in',
+                 output: 'change.test',
+                 configuration: conf,
+                 install_dir: testdatadir)
+
+  install_data(test_data, install_dir: testexecdir)
+
+endif
diff --git a/testsuite/css/change/test-css-change.c b/testsuite/css/change/test-css-change.c
new file mode 100644
index 0000000000..add2227f65
--- /dev/null
+++ b/testsuite/css/change/test-css-change.c
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2020 Red Hat Inc.
+ *
+ * Author:
+ *      Matthias Clasen <mclasen redhat com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+#include <glib/gstdio.h>
+#include <gtk/gtk.h>
+
+#ifdef G_OS_WIN32
+# include <io.h>
+#endif
+
+/* There shall be no other styles */
+#define GTK_STYLE_PROVIDER_PRIORITY_FORCE G_MAXUINT
+
+char *
+test_get_other_file (const char *ui_file, const char *extension)
+{
+  GString *file = g_string_new (NULL);
+
+  if (g_str_has_suffix (ui_file, ".ui"))
+    g_string_append_len (file, ui_file, strlen (ui_file) - strlen (".ui"));
+  else
+    g_string_append (file, ui_file);
+
+  g_string_append (file, extension);
+
+  if (!g_file_test (file->str, G_FILE_TEST_EXISTS))
+    {
+      g_string_free (file, TRUE);
+      return NULL;
+    }
+
+  return g_string_free (file, FALSE);
+}
+
+static char *
+diff_with_file (const char  *file1,
+                char        *text,
+                gssize       len,
+                GError     **error)
+{
+  const char *command[] = { "diff", "-u", file1, NULL, NULL };
+  char *diff, *tmpfile;
+  int fd;
+
+  diff = NULL;
+
+  if (len < 0)
+    len = strlen (text);
+  
+  /* write the text buffer to a temporary file */
+  fd = g_file_open_tmp (NULL, &tmpfile, error);
+  if (fd < 0)
+    return NULL;
+
+  if (write (fd, text, len) != (int) len)
+    {
+      close (fd);
+      g_set_error (error,
+                   G_FILE_ERROR, G_FILE_ERROR_FAILED,
+                   "Could not write data to temporary file '%s'", tmpfile);
+      goto done;
+    }
+  close (fd);
+  command[3] = tmpfile;
+
+  /* run diff command */
+  g_spawn_sync (NULL, 
+                (char **) command,
+                NULL,
+                G_SPAWN_SEARCH_PATH,
+                NULL, NULL,
+               &diff,
+                NULL, NULL,
+                error);
+
+done:
+  g_unlink (tmpfile);
+  g_free (tmpfile);
+
+  return diff;
+}
+
+static void
+style_context_changed (GtkWidget *window, const char **output)
+{
+  GtkStyleContext *context;
+
+  context = gtk_widget_get_style_context (window);
+
+  *output = gtk_style_context_to_string (context, GTK_STYLE_CONTEXT_PRINT_RECURSE |
+                                                  GTK_STYLE_CONTEXT_PRINT_SHOW_CHANGE);
+
+  g_main_context_wakeup (NULL);
+}
+
+static void
+load_ui_file (GFile *file, gboolean generate)
+{
+  GtkBuilder *builder;
+  GtkWidget *window;
+  char *output, *diff;
+  char *ui_file, *css_file, *reference_file;
+  GtkCssProvider *provider;
+  GError *error = NULL;
+
+  ui_file = g_file_get_path (file);
+
+  css_file = test_get_other_file (ui_file, ".css");
+  g_assert (css_file != NULL);
+
+  provider = gtk_css_provider_new ();
+  gtk_css_provider_load_from_path (provider, css_file);
+  gtk_style_context_add_provider_for_display (gdk_display_get_default (),
+                                              GTK_STYLE_PROVIDER (provider),
+                                              GTK_STYLE_PROVIDER_PRIORITY_FORCE);
+
+  builder = gtk_builder_new_from_file (ui_file);
+  window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
+  if (window == NULL)
+    window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
+
+  g_assert (window != NULL);
+
+
+  output = NULL;
+  g_signal_connect (window, "map", G_CALLBACK (style_context_changed), &output);
+
+  gtk_widget_show (window);
+
+  while (!output)
+    g_main_context_iteration (NULL, FALSE);
+
+  if (generate)
+    {
+      g_print ("%s", output);
+      goto out;
+    }
+
+  reference_file = test_get_other_file (ui_file, ".nodes");
+
+  diff = diff_with_file (reference_file, output, -1, &error);
+  g_assert_no_error (error);
+
+  if (diff && diff[0])
+    {
+      g_test_message ("Resulting output doesn't match reference:\n%s", diff);
+      g_test_fail ();
+    }
+  g_free (reference_file);
+  g_free (diff);
+
+out:
+  gtk_style_context_remove_provider_for_display (gdk_display_get_default (),
+                                                 GTK_STYLE_PROVIDER (provider));
+  g_object_unref (provider);
+
+  g_free (output);
+  g_free (ui_file);
+  g_free (css_file);
+}
+
+static void
+test_ui_file (GFile *file)
+{
+  load_ui_file (file, FALSE);
+}
+
+static void
+add_test_for_file (GFile *file)
+{
+  char *path;
+
+  path = g_file_get_path (file);
+
+  g_test_add_vtable (path,
+                     0,
+                     g_object_ref (file),
+                     NULL,
+                     (GTestFixtureFunc) test_ui_file,
+                     (GTestFixtureFunc) g_object_unref);
+
+  g_free (path);
+}
+
+static int
+compare_files (gconstpointer a, gconstpointer b)
+{
+  GFile *file1 = G_FILE (a);
+  GFile *file2 = G_FILE (b);
+  char *path1, *path2;
+  int result;
+
+  path1 = g_file_get_path (file1);
+  path2 = g_file_get_path (file2);
+
+  result = strcmp (path1, path2);
+
+  g_free (path1);
+  g_free (path2);
+
+  return result;
+}
+
+static void
+add_tests_for_files_in_directory (GFile *dir)
+{
+  GFileEnumerator *enumerator;
+  GFileInfo *info;
+  GList *files;
+  GError *error = NULL;
+
+  enumerator = g_file_enumerate_children (dir, G_FILE_ATTRIBUTE_STANDARD_NAME, 0, NULL, &error);
+  g_assert_no_error (error);
+  files = NULL;
+
+  while ((info = g_file_enumerator_next_file (enumerator, NULL, &error)))
+    {
+      const char *filename;
+
+      filename = g_file_info_get_name (info);
+
+      if (!g_str_has_suffix (filename, ".ui") ||
+          g_str_has_suffix (filename, ".nodes"))
+        {
+          g_object_unref (info);
+          continue;
+        }
+
+      files = g_list_prepend (files, g_file_get_child (dir, filename));
+
+      g_object_unref (info);
+    }
+
+  g_assert_no_error (error);
+  g_object_unref (enumerator);
+
+  files = g_list_sort (files, compare_files);
+  g_list_foreach (files, (GFunc) add_test_for_file, NULL);
+  g_list_free_full (files, g_object_unref);
+}
+
+int
+main (int argc, char **argv)
+{
+  g_setenv ("GTK_CSS_DEBUG", "1", TRUE);
+  g_setenv ("GTK_THEME", "Empty", TRUE);
+  g_setenv ("GSETTINGS_BACKEND", "memory", TRUE);
+
+  if (argc >= 3 && strcmp (argv[1], "--generate") == 0)
+    {
+      gtk_init ();
+
+      GFile *file = g_file_new_for_commandline_arg (argv[2]);
+
+      load_ui_file (file, TRUE);
+
+      g_object_unref (file);
+
+      return 0;
+    }
+
+  gtk_test_init (&argc, &argv);
+
+  if (argc < 2)
+    {
+      const char *basedir;
+      GFile *dir;
+
+      basedir = g_test_get_dir (G_TEST_DIST);
+      dir = g_file_new_for_path (basedir);
+      add_tests_for_files_in_directory (dir);
+
+      g_object_unref (dir);
+    }
+  else
+    {
+      guint i;
+
+      for (i = 1; i < argc; i++)
+        {
+          GFile *file = g_file_new_for_commandline_arg (argv[i]);
+
+          add_test_for_file (file);
+
+          g_object_unref (file);
+        }
+    }
+
+  return g_test_run ();
+}
+


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]