[gnome-builder] libide/tweaks: make tests more automated



commit c1d4afb4e783c004deebad7ee15cd4ef30cb6f35
Author: Christian Hergert <chergert redhat com>
Date:   Sun Jul 31 05:00:39 2022 -0700

    libide/tweaks: make tests more automated
    
    This moves to something a bit more like refspec, that allows us to have
    a number of tests for UI merging and then compare to the expected output.
    
    Of course, we'll have to update these a bunch while we implement the core
    types, but it's a good start for what we need.

 src/libide/tweaks/meson.build               |  4 +--
 src/libide/tweaks/tests/meson.build         | 19 +++++++++++
 src/libide/tweaks/{ => tests}/test-tweaks.c | 50 +++++++++++++++++++++++++----
 src/libide/tweaks/tests/test1/0.ui          | 17 ++++++++++
 src/libide/tweaks/tests/test1/1.ui          | 13 ++++++++
 src/libide/tweaks/tests/test1/2.ui          | 32 ++++++++++++++++++
 src/libide/tweaks/tests/test1/expected.xml  | 11 +++++++
 7 files changed, 136 insertions(+), 10 deletions(-)
---
diff --git a/src/libide/tweaks/meson.build b/src/libide/tweaks/meson.build
index 59a85da9d..bcde99295 100644
--- a/src/libide/tweaks/meson.build
+++ b/src/libide/tweaks/meson.build
@@ -73,6 +73,4 @@ gnome_builder_public_headers += files(libide_tweaks_public_headers)
 gnome_builder_include_subdirs += libide_tweaks_header_subdir
 gnome_builder_gir_extra_args += ['--c-include=libide-tweaks.h', '-DIDE_TWEAKS_COMPILATION']
 
-test_tweaks = executable('test-tweaks', 'test-tweaks.c',
-  dependencies: [libide_tweaks_dep],
-)
+subdir('tests')
diff --git a/src/libide/tweaks/tests/meson.build b/src/libide/tweaks/tests/meson.build
new file mode 100644
index 000000000..f7d8ea0ae
--- /dev/null
+++ b/src/libide/tweaks/tests/meson.build
@@ -0,0 +1,19 @@
+test_tweaks = executable('test-tweaks', 'test-tweaks.c',
+  dependencies: [libide_tweaks_dep],
+)
+
+test_tweaks_runs = [
+  # name    subdir   reference       input files
+  ['test1', 'test1', 'expected.xml', ['0.ui', '1.ui', '2.ui']],
+]
+
+foreach test_tweaks_run: test_tweaks_runs
+  test_name = test_tweaks_run.get(0)
+  test_subdir = join_paths(meson.current_source_dir(), test_tweaks_run.get(1))
+  test_expected = join_paths(test_subdir, test_tweaks_run.get(2))
+  test_sources = []
+  foreach test_tweaks_input: test_tweaks_run.get(3)
+    test_sources += join_paths(test_subdir, test_tweaks_input)
+  endforeach
+  test('tweaks-@0@'.format(test_name), test_tweaks, args: ['--expected', test_expected]+test_sources)
+endforeach
diff --git a/src/libide/tweaks/test-tweaks.c b/src/libide/tweaks/tests/test-tweaks.c
similarity index 51%
rename from src/libide/tweaks/test-tweaks.c
rename to src/libide/tweaks/tests/test-tweaks.c
index f26decfe7..190ddeb47 100644
--- a/src/libide/tweaks/test-tweaks.c
+++ b/src/libide/tweaks/tests/test-tweaks.c
@@ -29,11 +29,29 @@ int
 main (int   argc,
       char *argv[])
 {
+  g_autoptr(GOptionContext) context = NULL;
   g_autoptr(IdeTweaks) tweaks = NULL;
   g_autoptr(GString) string = NULL;
+  g_autoptr(GError) error = NULL;
+  g_autofree char *expected = NULL;
+  g_autofree char *expected_contents = NULL;
+  gsize len = 0;
+  const GOptionEntry entries[] = {
+    { "expected", 'e', 0, G_OPTION_ARG_FILENAME, &expected, "File containing expected output" },
+    { NULL }
+  };
 
   _ide_tweaks_init ();
 
+  context = g_option_context_new ("- test tweaks ui merging");
+  g_option_context_add_main_entries (context, entries, NULL);
+
+  if (!g_option_context_parse (context, &argc, &argv, &error))
+    {
+      g_printerr ("%s\n", error->message);
+      return EXIT_FAILURE;
+    }
+
   tweaks = ide_tweaks_new ();
   string = g_string_new (NULL);
 
@@ -41,18 +59,36 @@ main (int   argc,
     {
       const char *path = argv[i];
       g_autoptr(GFile) file = g_file_new_for_commandline_arg (path);
-      g_autoptr(GError) error = NULL;
 
       if (!ide_tweaks_load_from_file (tweaks, file, NULL, &error))
-        {
-          g_printerr ("Failed to parse %s: %s\n", path, error->message);
-          return EXIT_FAILURE;
-        }
+        g_error ("Failed to parse %s: %s", path, error->message);
     }
 
   _ide_tweaks_item_printf (IDE_TWEAKS_ITEM (tweaks), string, 0);
 
-  g_print ("%s", string->str);
+  if (!expected)
+    {
+      g_print ("%s", string->str);
+      return EXIT_SUCCESS;
+    }
+
+  if (!g_file_get_contents (expected, &expected_contents, &len, &error))
+    g_error ("Failed to load expected contents: %s: %s", expected, error->message);
+
+  if (ide_str_equal0 (expected_contents, string->str))
+    return EXIT_SUCCESS;
+
+  g_printerr ("Contents did not match.\n"
+              "\n"
+              "Expected:\n"
+              "=========\n"
+              "%s\n"
+              "\n"
+              "Got:\n"
+              "====\n"
+              "%s\n",
+              expected_contents,
+              string->str);
 
-  return EXIT_SUCCESS;
+  return EXIT_FAILURE;
 }
diff --git a/src/libide/tweaks/tests/test1/0.ui b/src/libide/tweaks/tests/test1/0.ui
new file mode 100644
index 000000000..f56b76690
--- /dev/null
+++ b/src/libide/tweaks/tests/test1/0.ui
@@ -0,0 +1,17 @@
+<interface>
+  <template class="IdeTweaks">
+    <child>
+      <object class="IdeTweaksSection" id="visual_section">
+        <child>
+          <object class="IdeTweaksPage" id="appearance_page">
+            <child>
+              <object class="IdeTweaksGroup" id="appearance_group">
+                <property name="title" translatable="yes">Original</property>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>
diff --git a/src/libide/tweaks/tests/test1/1.ui b/src/libide/tweaks/tests/test1/1.ui
new file mode 100644
index 000000000..37022f03d
--- /dev/null
+++ b/src/libide/tweaks/tests/test1/1.ui
@@ -0,0 +1,13 @@
+<interface>
+  <template class="IdeTweaks">
+    <child internal-child="visual_section">
+      <object class="IdeTweaksSection">
+        <child internal-child="appearance_page">
+          <object class="IdeTweaksPage">
+            <property name="title" translatable="yes">Appearance</property>
+          </object>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>
diff --git a/src/libide/tweaks/tests/test1/2.ui b/src/libide/tweaks/tests/test1/2.ui
new file mode 100644
index 000000000..6e475d9e8
--- /dev/null
+++ b/src/libide/tweaks/tests/test1/2.ui
@@ -0,0 +1,32 @@
+<interface>
+  <template class="IdeTweaks">
+    <child internal-child="visual_section">
+      <object class="IdeTweaksSection">
+        <child internal-child="appearance_page">
+          <object class="IdeTweaksPage">
+            <child internal-child="appearance_group">
+              <object class="IdeTweaksGroup">
+                <property name="title" translatable="yes">Appearance</property>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+    <child>
+      <object class="IdeTweaksSection" id="foundry_section">
+        <child>
+          <object class="IdeTweaksPage" id="build_page">
+            <property name="title" translatable="yes">Build</property>
+          </object>
+        </child>
+        <child>
+          <object class="IdeTweaksPage" id="debugger_page">
+            <property name="title" translatable="yes">Debugger</property>
+            <property name="icon-name">builder-debugger-symbolic</property>
+          </object>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>
diff --git a/src/libide/tweaks/tests/test1/expected.xml b/src/libide/tweaks/tests/test1/expected.xml
new file mode 100644
index 000000000..f291ef6e9
--- /dev/null
+++ b/src/libide/tweaks/tests/test1/expected.xml
@@ -0,0 +1,11 @@
+<IdeTweaks id="IdeTweaks" id="IdeTweaks" sort-key="">
+  <IdeTweaksSection id="visual_section" id="visual_section" sort-key="">
+    <IdeTweaksPage id="appearance_page" id="appearance_page" sort-key="" icon-name="" title="Appearance">
+      <IdeTweaksGroup id="appearance_group" id="appearance_group" sort-key="" title="Appearance"/>
+    </IdeTweaksPage>
+  </IdeTweaksSection>
+  <IdeTweaksSection id="foundry_section" id="foundry_section" sort-key="">
+    <IdeTweaksPage id="build_page" id="build_page" sort-key="" icon-name="" title="Build"/>
+    <IdeTweaksPage id="debugger_page" id="debugger_page" sort-key="" icon-name="builder-debugger-symbolic" 
title="Debugger"/>
+  </IdeTweaksSection>
+</IdeTweaks>


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