[gtk/gtk3-installed-tests: 9/9] meson: port installed tests and reftests



commit 3c2b5cda7402135e9366351b275e29e44324757a
Author: Christoph Reiter <reiter christoph gmail com>
Date:   Sat Sep 28 22:48:16 2019 +0200

    meson: port installed tests and reftests
    
    I couldn't get all reftests to work reliably, so the tests failing
    on either CI or on my machine are skipped for now.
    
    Installed tests are disabled by default and can be enabled with "-Dinstalled_tests=true"

 .gitlab-ci.yml                         |   1 +
 .gitlab-ci/test-docker-meson.sh        |   1 +
 testsuite/a11y/meson.build             | 106 +++++++
 testsuite/a11y/state/Makefile.am       |   4 +-
 testsuite/a11y/state/a11ystate.test.in |   4 +
 testsuite/a11y/state/meson.build       |  31 +++
 testsuite/css/meson.build              |  17 +-
 testsuite/css/nodes/meson.build        |  75 ++++-
 testsuite/css/parser/Makefile.am       |   5 +
 testsuite/css/parser/meson.build       | 466 ++++++++++++++++++++++++++++++-
 testsuite/css/style/meson.build        |  42 +++
 testsuite/gdk/meson.build              |   4 +-
 testsuite/gtk/Makefile.am              |   1 +
 testsuite/gtk/gtk.test.in              |   4 +
 testsuite/gtk/meson.build              |  36 ++-
 testsuite/meson.build                  |   7 +-
 testsuite/reftests/Makefile.am         |   1 +
 testsuite/reftests/gtk-reftest.c       |   5 +-
 testsuite/reftests/meson.build         | 486 +++++++++++++++++++++++++++++++++
 testsuite/tools/Makefile.am            |   1 +
 testsuite/tools/meson.build            |  30 +-
 testsuite/tools/tools.test.in          |   4 +
 22 files changed, 1317 insertions(+), 14 deletions(-)
---
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e00b2c7c8f..4864dfc27d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -21,6 +21,7 @@ fedora-meson:
     name: "gtk3-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
     paths:
       - "_build/meson-logs"
+      - "_build/testsuite/reftests/output"
 
 msys2-mingw32-meson:
   variables:
diff --git a/.gitlab-ci/test-docker-meson.sh b/.gitlab-ci/test-docker-meson.sh
index 40c0f51414..b7ac83e091 100755
--- a/.gitlab-ci/test-docker-meson.sh
+++ b/.gitlab-ci/test-docker-meson.sh
@@ -12,6 +12,7 @@ python3 -m pip install --user meson==0.49.2
 meson \
     -Dgtk_doc=true \
     -Dman=true \
+    -Dinstalled_tests=true \
     -Dbroadway_backend=true \
     -Dxinerama=yes \
     -Dprint_backends="file,lpr,test,cloudprint,cups" \
diff --git a/testsuite/a11y/meson.build b/testsuite/a11y/meson.build
index d8168ffb04..fa8b045030 100644
--- a/testsuite/a11y/meson.build
+++ b/testsuite/a11y/meson.build
@@ -46,6 +46,8 @@ skipped_tests = [
 a11y_dump_bin = executable('accessibility-dump',
   'accessibility-dump.c',
   dependencies: libgtk_dep,
+  install: get_option('installed_tests'),
+  install_dir: installed_test_bindir,
 )
 
 foreach t: a11y_state_tests
@@ -85,6 +87,8 @@ foreach t: a11y_tests
 
   test (t,
         executable (t, '@0@.c'.format(t),
+                    install: get_option('installed_tests'),
+                    install_dir: installed_test_bindir,
                     dependencies: libgtk_dep),
         args: [ '--tap', '-k', ],
         timeout: 120,
@@ -99,4 +103,106 @@ foreach t: a11y_tests
         suite: 'a11y')
 endforeach
 
+installed_test_data = [
+  'hello-world.ui',
+  'hello-world.txt',
+  'mnemonic.ui',
+  'mnemonic.txt',
+  'accessible-name.ui',
+  'accessible-name.txt',
+  'notebook.ui',
+  'notebook.txt',
+  'range.ui',
+  'range.txt',
+  'link.ui',
+  'link.txt',
+  'text.ui',
+  'text.txt',
+  'buttons.ui',
+  'buttons.txt',
+  'colorchooser.ui',
+  'colorchooser.txt',
+  'about.ui',
+  'about.txt',
+  'messagedialog.ui',
+  'messagedialog.txt',
+  'expander.ui',
+  'expander.txt',
+  'assistant.ui',
+  'assistant.txt',
+  'pickers.ui',
+  'pickers.txt',
+  'label.ui',
+  'label.txt',
+  'lockbutton.ui',
+  'lockbutton.txt',
+  'spinner.ui',
+  'spinner.txt',
+  'progress.ui',
+  'progress.txt',
+  'infobar.ui',
+  'infobar.txt',
+  'calendar.ui',
+  'calendar.txt',
+  'statusbar.ui',
+  'statusbar.txt',
+  'paned.ui',
+  'paned.txt',
+  'iconview.ui',
+  'iconview.txt',
+  'entries.ui',
+  'entries.txt',
+  'scale-drawvalue.ui',
+  'scale-drawvalue.txt',
+  'placeholder-text.ui',
+  'placeholder-text.txt',
+  'menu.ui',
+  'menu.txt',
+  'menubutton.ui',
+  'menubutton.txt',
+  'menubutton2.ui',
+  'menubutton2.txt',
+  'menubutton3.ui',
+  'menubutton3.txt',
+  'combos.ui',
+  'combos.txt',
+  'listbox.ui',
+  'listbox.txt',
+  'stack.ui',
+  'stack.txt',
+  'headerbar.ui',
+  'headerbar.txt',
+  'tree.ui',
+  'tree.txt',
+  'actionbar.ui',
+  'actionbar.txt',
+  'tooltips.ui',
+  'tooltips.txt',
+]
+
+a11y_installed_tests = [
+  'a11ytests.test',
+  'a11ychildren.test',
+  'a11ytree.test',
+  'a11yvalue.test',
+  'a11yderive.test',
+  'a11ytext.test',
+  'a11yutil.test',
+  'a11ymisc.test',
+]
+
+if get_option('installed_tests')
+  test_cdata = configuration_data()
+  test_cdata.set('libexecdir', gtk_libexecdir)
+
+  foreach t: a11y_installed_tests
+    configure_file(input: '@0@.in'.format(t),
+                   output: t,
+                   configuration: test_cdata,
+                   install_dir: installed_test_datadir)
+  endforeach
+
+  install_data(installed_test_data, install_dir: join_paths(installed_test_bindir, 'a11ytests'))
+endif
+
 subdir('state')
diff --git a/testsuite/a11y/state/Makefile.am b/testsuite/a11y/state/Makefile.am
index 4ff4dfdab6..b0e265a6c5 100644
--- a/testsuite/a11y/state/Makefile.am
+++ b/testsuite/a11y/state/Makefile.am
@@ -28,7 +28,9 @@ testdata = \
        focus1.ui focus1.in focus1.out \
        focus2.ui focus2.in focus2.out
 
-EXTRA_DIST += $(testdata) meson.build
+EXTRA_DIST += $(testdata) \
+       meson.build \
+       a11ystate.test.in
 
 if BUILDOPT_INSTALL_TESTS
 insttestdir = $(libexecdir)/installed-tests/$(PACKAGE)
diff --git a/testsuite/a11y/state/a11ystate.test.in b/testsuite/a11y/state/a11ystate.test.in
new file mode 100644
index 0000000000..52755decbf
--- /dev/null
+++ b/testsuite/a11y/state/a11ystate.test.in
@@ -0,0 +1,4 @@
+[Test]
+Type=session-exclusive
+Output=TAP
+Exec=env G_ENABLE_DIAGNOSTIC=0 @libexecdir@/installed-tests/gtk+/state-record --tap --directory 
@libexecdir@/installed-tests/gtk+/state
diff --git a/testsuite/a11y/state/meson.build b/testsuite/a11y/state/meson.build
index 0c792f6d00..782649ef3f 100644
--- a/testsuite/a11y/state/meson.build
+++ b/testsuite/a11y/state/meson.build
@@ -1,4 +1,35 @@
 a11y_state_record_bin = executable('state-record',
   'state-record.c',
   dependencies: libgtk_dep,
+  install: get_option('installed_tests'),
+  install_dir: installed_test_bindir,
 )
+
+test_data = [
+  'focus1.in',
+  'focus1.out',
+  'focus1.ui',
+  'focus2.in',
+  'focus2.out',
+  'focus2.ui',
+]
+
+
+a11y_installed_tests = [
+  'a11ystate.test',
+]
+
+if get_option('installed_tests')
+  test_cdata = configuration_data()
+  test_cdata.set('libexecdir', gtk_libexecdir)
+
+  foreach t: a11y_installed_tests
+    configure_file(input: '@0@.in'.format(t),
+                   output: t,
+                   configuration: test_cdata,
+                   install: true,
+                   install_dir: installed_test_datadir)
+  endforeach
+
+  install_data(test_data, install_dir: join_paths(installed_test_bindir, 'state'))
+endif
\ No newline at end of file
diff --git a/testsuite/css/meson.build b/testsuite/css/meson.build
index e90cd77c96..ba19185275 100644
--- a/testsuite/css/meson.build
+++ b/testsuite/css/meson.build
@@ -2,5 +2,20 @@ subdir('parser')
 subdir('nodes')
 subdir('style')
 
-test_api = executable('api', 'api.c', dependencies: libgtk_dep)
+testexecdir = join_paths(installed_test_bindir, 'css')
+testdatadir = join_paths(installed_test_datadir, 'css')
+
+test_api = executable('api', 'api.c',
+                      dependencies: libgtk_dep,
+                      install: get_option('installed_tests'),
+                      install_dir: testexecdir)
 test('css/api', test_api)
+
+if get_option('installed_tests')
+  conf = configuration_data()
+  conf.set('libexecdir', gtk_libexecdir)
+  configure_file(input: 'api.test.in',
+                 output: 'api.test',
+                 configuration: conf,
+                 install_dir: testdatadir)
+endif
diff --git a/testsuite/css/nodes/meson.build b/testsuite/css/nodes/meson.build
index a7d5050abd..8eae38583f 100644
--- a/testsuite/css/nodes/meson.build
+++ b/testsuite/css/nodes/meson.build
@@ -1,3 +1,76 @@
+testexecdir = join_paths(installed_test_bindir, 'css', 'nodes')
+testdatadir = join_paths(installed_test_datadir, 'css', 'nodes')
 
-test_nodes = executable('test-css-nodes', 'test-css-nodes.c', dependencies: libgtk_dep)
+test_nodes = executable('test-css-nodes', 'test-css-nodes.c',
+                        install: get_option('installed_tests'),
+                        install_dir: testexecdir,
+                        dependencies: libgtk_dep)
 test('css/nodes/test-nodes', test_nodes)
+
+test_data = [
+  'box.ltr.nodes',
+  'box.ltr.ui',
+  'box.rtl.nodes',
+  'box.rtl.ui',
+  'box-packing.ltr.nodes',
+  'box-packing.ltr.ui',
+  'box-packing.rtl.nodes',
+  'box-packing.rtl.ui',
+  'buttons.nodes',
+  'buttons.ui',
+  'checkbutton.ltr.nodes',
+  'checkbutton.ltr.ui',
+  'checkbutton.rtl.nodes',
+  'checkbutton.rtl.ui',
+  'combobox.nodes',
+  'combobox.ui',
+  'entries.nodes',
+  'entries.ui',
+  'expander.ltr.nodes',
+  'expander.ltr.ui',
+  'expander.rtl.nodes',
+  'expander.rtl.ui',
+  'levelbar.ltr.nodes',
+  'levelbar.ltr.ui',
+  'levelbar.rtl.nodes',
+  'levelbar.rtl.ui',
+  'notebook-arrows2.nodes',
+  'notebook-arrows2.ui',
+  'notebook-arrows.nodes',
+  'notebook-arrows.ui',
+  'notebook.bottom.ltr.nodes',
+  'notebook.bottom.ltr.ui',
+  'notebook.bottom.rtl.nodes',
+  'notebook.bottom.rtl.ui',
+  'notebook.left.ltr.nodes',
+  'notebook.left.ltr.ui',
+  'notebook.left.rtl.nodes',
+  'notebook.left.rtl.ui',
+  'notebook.right.ltr.nodes',
+  'notebook.right.ltr.ui',
+  'notebook.right.rtl.nodes',
+  'notebook.right.rtl.ui',
+  'notebook.top.ltr.nodes',
+  'notebook.top.ltr.ui',
+  'notebook.top.rtl.nodes',
+  'notebook.top.rtl.ui',
+  'paned.ltr.nodes',
+  'paned.ltr.ui',
+  'paned.rtl.nodes',
+  'paned.rtl.ui',
+  'progressbar.nodes',
+  'progressbar.ui',
+  'scale.nodes',
+  'scale.ui',
+]
+
+if get_option('installed_tests')
+  conf = configuration_data()
+  conf.set('libexecdir', gtk_libexecdir)
+  configure_file(input: 'test-css-nodes.test.in',
+                 output: 'test-css-nodes.test',
+                 configuration: conf,
+                 install_dir: testdatadir)
+
+  install_data(test_data, install_dir: testexecdir)
+endif
diff --git a/testsuite/css/parser/Makefile.am b/testsuite/css/parser/Makefile.am
index 63cad9e1dc..03aa9b638a 100644
--- a/testsuite/css/parser/Makefile.am
+++ b/testsuite/css/parser/Makefile.am
@@ -334,6 +334,11 @@ test_data = \
        declarations-valid-24.ref.css \
        declarations-valid-25.css \
        declarations-valid-25.ref.css \
+       declarations-valid-26.css \
+       declarations-valid-26.ref.css \
+       deprecated.css \
+       deprecated.errors \
+       deprecated.ref.css \
        does-not-exist.css \
        does-not-exist.errors \
        does-not-exist.ref.css \
diff --git a/testsuite/css/parser/meson.build b/testsuite/css/parser/meson.build
index fee149a7c0..7e60bb8b41 100644
--- a/testsuite/css/parser/meson.build
+++ b/testsuite/css/parser/meson.build
@@ -1,3 +1,467 @@
+testexecdir = join_paths(installed_test_bindir, 'css', 'parser')
+testdatadir = join_paths(installed_test_datadir, 'css', 'parser')
 
-test_parser = executable('test-css-parser', 'test-css-parser.c', dependencies: libgtk_dep)
+test_parser = executable('test-css-parser', 'test-css-parser.c',
+                         install: get_option('installed_tests'),
+                         install_dir: testexecdir,
+                         dependencies: libgtk_dep)
 test('css/parser/css-parser', test_parser)
+
+test_data = [
+  'animation-crash-3.12.css',
+  'animation-crash-3.12.errors',
+  'animation-crash-3.12.ref.css',
+  'animation-delay.css',
+  'animation-delay.ref.css',
+  'animation-direction.css',
+  'animation-direction.ref.css',
+  'animation-duration.css',
+  'animation-duration.ref.css',
+  'animation-fill-mode.css',
+  'animation-fill-mode.ref.css',
+  'animation-iteration-count.css',
+  'animation-iteration-count.ref.css',
+  'animation-name.css',
+  'animation-name.ref.css',
+  'animation-play-state.css',
+  'animation-play-state.ref.css',
+  'animation-shorthand-crash.css',
+  'animation-shorthand-crash.ref.css',
+  'animation-timing-function.css',
+  'animation-timing-function.ref.css',
+  'at-invalid-01.css',
+  'at-invalid-01.errors',
+  'at-invalid-01.ref.css',
+  'at-invalid-02.css',
+  'at-invalid-02.errors',
+  'at-invalid-02.ref.css',
+  'at-invalid-03.css',
+  'at-invalid-03.errors',
+  'at-invalid-03.ref.css',
+  'at-invalid-04.css',
+  'at-invalid-04.errors',
+  'at-invalid-04.ref.css',
+  'at-invalid-05.css',
+  'at-invalid-05.errors',
+  'at-invalid-05.ref.css',
+  'at-invalid-06.css',
+  'at-invalid-06.errors',
+  'at-invalid-06.ref.css',
+  'at-invalid-07.css',
+  'at-invalid-07.errors',
+  'at-invalid-07.ref.css',
+  'at-invalid-08.css',
+  'at-invalid-08.errors',
+  'at-invalid-08.ref.css',
+  'at-invalid-09.css',
+  'at-invalid-09.errors',
+  'at-invalid-09.ref.css',
+  'at-invalid-10.css',
+  'at-invalid-10.errors',
+  'at-invalid-10.ref.css',
+  'at-invalid-11.css',
+  'at-invalid-11.errors',
+  'at-invalid-11.ref.css',
+  'at-invalid-12.css',
+  'at-invalid-12.errors',
+  'at-invalid-12.ref.css',
+  'at-invalid-13.css',
+  'at-invalid-13.errors',
+  'at-invalid-13.ref.css',
+  'at-invalid-14.css',
+  'at-invalid-14.errors',
+  'at-invalid-14.ref.css',
+  'at-invalid-15.css',
+  'at-invalid-15.errors',
+  'at-invalid-15.ref.css',
+  'at-invalid-16.css',
+  'at-invalid-16.errors',
+  'at-invalid-16.ref.css',
+  'at-invalid-17.css',
+  'at-invalid-17.errors',
+  'at-invalid-17.ref.css',
+  'at-invalid-18.css',
+  'at-invalid-18.errors',
+  'at-invalid-18.ref.css',
+  'at-invalid-19.css',
+  'at-invalid-19.errors',
+  'at-invalid-19.ref.css',
+  'at-invalid-20.css',
+  'at-invalid-20.errors',
+  'at-invalid-20.ref.css',
+  'at-invalid-21.css',
+  'at-invalid-21.errors',
+  'at-invalid-21.ref.css',
+  'at-invalid-22.css',
+  'at-invalid-22.errors',
+  'at-invalid-22.ref.css',
+  'at-invalid-23.css',
+  'at-invalid-23.errors',
+  'at-invalid-23.ref.css',
+  'at-invalid-24.css',
+  'at-invalid-24.errors',
+  'at-invalid-24.ref.css',
+  'at-invalid-25.css',
+  'at-invalid-25.errors',
+  'at-invalid-25.ref.css',
+  'at-invalid-26.css',
+  'at-invalid-26.errors',
+  'at-invalid-26.ref.css',
+  'at-invalid-27.css',
+  'at-invalid-27.errors',
+  'at-invalid-27.ref.css',
+  'at-valid-01.css',
+  'at-valid-01.ref.css',
+  'at-valid-02.css',
+  'at-valid-02.ref.css',
+  'at-valid-03.css',
+  'at-valid-03.ref.css',
+  'at-valid-04.css',
+  'at-valid-04.ref.css',
+  'at-valid-05.css',
+  'at-valid-05.ref.css',
+  'at-valid-06.css',
+  'at-valid-06.ref.css',
+  'at-valid-07.css',
+  'at-valid-08.css',
+  'at-valid-08.ref.css',
+  'at-valid-09.css',
+  'at-valid-09.ref.css',
+  'at-valid-10.css',
+  'at-valid-10.ref.css',
+  'at-valid-11.css',
+  'at-valid-11.ref.css',
+  'at-valid-12.css',
+  'at-valid-12.ref.css',
+  'at-valid-13.css',
+  'at-valid-13.ref.css',
+  'at-valid-14.css',
+  'at-valid-14.ref.css',
+  'at-valid-15.css',
+  'at-valid-15.ref.css',
+  'at-valid-16.css',
+  'at-valid-16.ref.css',
+  'at-valid-17.css',
+  'at-valid-18.css',
+  'at-valid-18.ref.css',
+  'at-valid-19.css',
+  'at-valid-19.errors',
+  'at-valid-19.ref.css',
+  'at-valid-20.css',
+  'at-valid-20.errors',
+  'at-valid-20.ref.css',
+  'at-valid-21.css',
+  'at-valid-21.errors',
+  'at-valid-21.ref.css',
+  'background-blend-mode.css',
+  'background-blend-mode.ref.css',
+  'background-clip.css',
+  'background-clip.ref.css',
+  'background-image.css',
+  'background-image.ref.css',
+  'background-origin.css',
+  'background-origin.ref.css',
+  'background-position-errors.css',
+  'background-position-errors.errors',
+  'background-position-errors.ref.css',
+  'background-position.css',
+  'background-position.errors',
+  'background-position.ref.css',
+  'background-repeat.css',
+  'background-repeat.ref.css',
+  'background-shorthand-single.css',
+  'background-shorthand-single.ref.css',
+  'background-shorthand.css',
+  'background-shorthand.ref.css',
+  'background-size.css',
+  'background-size.ref.css',
+  'background-win32-color-is-no-error.css',
+  'background-win32-color-is-no-error.ref.css',
+  'border-color-currentcolor.css',
+  'border-color-currentcolor.ref.css',
+  'border-color.css',
+  'border-color.ref.css',
+  'border-image-repeat.css',
+  'border-image-repeat.ref.css',
+  'border-image-slice.css',
+  'border-image-slice.ref.css',
+  'border-image-source.css',
+  'border-image-source.ref.css',
+  'border-image-width.css',
+  'border-image-width.ref.css',
+  'border-infloop-3.12.css',
+  'border-infloop-3.12.errors',
+  'border-infloop-3.12.ref.css',
+  'border-radius-shorthand.css',
+  'border-radius-shorthand.errors',
+  'border-radius-shorthand.ref.css',
+  'border-radius.css',
+  'border-radius.ref.css',
+  'border-shorthand.css',
+  'border-shorthand.ref.css',
+  'border-style.css',
+  'border-style.ref.css',
+  'border-width.css',
+  'border-width.ref.css',
+  'border.css',
+  'border.errors',
+  'border.ref.css',
+  'box-shadow.css',
+  'box-shadow.ref.css',
+  'calc-errors.css',
+  'calc-errors.errors',
+  'calc-errors.ref.css',
+  'calc-simple.css',
+  'calc-simple.ref.css',
+  'calc.css',
+  'calc.ref.css',
+  'close-at-end-of-file.css',
+  'close-at-end-of-file.errors',
+  'close-at-end-of-file.ref.css',
+  'color.css',
+  'color.ref.css',
+  'colors-errors.css',
+  'colors-errors.errors',
+  'colors-errors.ref.css',
+  'colors-red.css',
+  'colors-red.ref.css',
+  'comment-detection.css',
+  'comment-detection.ref.css',
+  'cross-fade-basic.css',
+  'css-21-malformed-declarations.css',
+  'css-21-malformed-declarations.errors',
+  'css-21-malformed-declarations.ref.css',
+  'css-21-malformed-statements.css',
+  'css-21-malformed-statements.errors',
+  'css-21-malformed-statements.ref.css',
+  'currentcolor-everywhere.css',
+  'declarations-invalid-01.css',
+  'declarations-invalid-01.errors',
+  'declarations-invalid-01.ref.css',
+  'declarations-invalid-02.css',
+  'declarations-invalid-02.errors',
+  'declarations-invalid-02.ref.css',
+  'declarations-invalid-03.css',
+  'declarations-invalid-03.errors',
+  'declarations-invalid-03.ref.css',
+  'declarations-invalid-04.css',
+  'declarations-invalid-04.errors',
+  'declarations-invalid-04.ref.css',
+  'declarations-invalid-05.css',
+  'declarations-invalid-05.errors',
+  'declarations-invalid-05.ref.css',
+  'declarations-invalid-06.css',
+  'declarations-invalid-06.errors',
+  'declarations-invalid-06.ref.css',
+  'declarations-invalid-07.css',
+  'declarations-invalid-07.errors',
+  'declarations-invalid-07.ref.css',
+  'declarations-invalid-08.css',
+  'declarations-invalid-08.errors',
+  'declarations-invalid-08.ref.css',
+  'declarations-valid-01.css',
+  'declarations-valid-01.ref.css',
+  'declarations-valid-02.css',
+  'declarations-valid-02.ref.css',
+  'declarations-valid-03.css',
+  'declarations-valid-03.ref.css',
+  'declarations-valid-04.css',
+  'declarations-valid-04.ref.css',
+  'declarations-valid-05.css',
+  'declarations-valid-05.ref.css',
+  'declarations-valid-06.css',
+  'declarations-valid-06.ref.css',
+  'declarations-valid-07.css',
+  'declarations-valid-07.ref.css',
+  'declarations-valid-08.css',
+  'declarations-valid-08.ref.css',
+  'declarations-valid-09.css',
+  'declarations-valid-09.ref.css',
+  'declarations-valid-10.css',
+  'declarations-valid-10.ref.css',
+  'declarations-valid-11.css',
+  'declarations-valid-11.ref.css',
+  'declarations-valid-12.css',
+  'declarations-valid-12.ref.css',
+  'declarations-valid-13.css',
+  'declarations-valid-13.ref.css',
+  'declarations-valid-14.css',
+  'declarations-valid-14.ref.css',
+  'declarations-valid-15.css',
+  'declarations-valid-15.ref.css',
+  'declarations-valid-16.css',
+  'declarations-valid-16.ref.css',
+  'declarations-valid-17.css',
+  'declarations-valid-17.ref.css',
+  'declarations-valid-18.css',
+  'declarations-valid-18.ref.css',
+  'declarations-valid-19.css',
+  'declarations-valid-19.ref.css',
+  'declarations-valid-20.css',
+  'declarations-valid-20.ref.css',
+  'declarations-valid-21.css',
+  'declarations-valid-21.ref.css',
+  'declarations-valid-22.css',
+  'declarations-valid-22.ref.css',
+  'declarations-valid-23.css',
+  'declarations-valid-23.ref.css',
+  'declarations-valid-24.css',
+  'declarations-valid-24.ref.css',
+  'declarations-valid-25.css',
+  'declarations-valid-25.ref.css',
+  'declarations-valid-26.css',
+  'declarations-valid-26.ref.css',
+  'declarations.css',
+  'declarations.errors',
+  'declarations.ref.css',
+  'deprecated.css',
+  'deprecated.errors',
+  'deprecated.ref.css',
+  'does-not-exist.css',
+  'does-not-exist.errors',
+  'does-not-exist.ref.css',
+  'doubled.css',
+  'doubled.ref.css',
+  'empty.css',
+  'font-family.css',
+  'font-family.ref.css',
+  'font-size.css',
+  'font-size.ref.css',
+  'font-stretch.css',
+  'font-stretch.ref.css',
+  'font-style.css',
+  'font-style.ref.css',
+  'font-variant.css',
+  'font-variant.ref.css',
+  'font-weight.css',
+  'font-weight.ref.css',
+  'freed-string-in-error-messages.css',
+  'freed-string-in-error-messages.errors',
+  'freed-string-in-error-messages.ref.css',
+  'import-cyclic-1.css',
+  'import-cyclic-1.errors',
+  'import-cyclic-1.ref.css',
+  'import-cyclic-2.css',
+  'import-cyclic-2.errors',
+  'import-cyclic-2.ref.css',
+  'import-cyclic-3.css',
+  'import-cyclic-3.errors',
+  'import-cyclic-3.ref.css',
+  'import-nonexistant.css',
+  'import-nonexistant.errors',
+  'import-nonexistant.ref.css',
+  'import-recursive.css',
+  'import-recursive.errors',
+  'import-recursive.ref.css',
+  'integer.css',
+  'integer.errors',
+  'integer.ref.css',
+  'keyframes-empty.css',
+  'keyframes-empty.ref.css',
+  'keyframes-ordering.css',
+  'keyframes-ordering.ref.css',
+  'letter-spacing.css',
+  'letter-spacing.ref.css',
+  'linear-gradient.css',
+  'linear-gradient.ref.css',
+  'margin.css',
+  'margin.ref.css',
+  'min-height.css',
+  'min-height.ref.css',
+  'min-width.css',
+  'min-width.ref.css',
+  'no-semicolon.css',
+  'no-semicolon.ref.css',
+  'not.css',
+  'not.ref.css',
+  'nth-child.css',
+  'nth-child.ref.css',
+  'opacity.css',
+  'opacity.ref.css',
+  'outline-color.css',
+  'outline-color.ref.css',
+  'outline-offset.css',
+  'outline-offset.ref.css',
+  'outline-radius.css',
+  'outline-radius.ref.css',
+  'outline-style.css',
+  'outline-style.ref.css',
+  'outline-width.css',
+  'outline-width.ref.css',
+  'padding.css',
+  'padding.ref.css',
+  'property-name-errors.css',
+  'property-name-errors.errors',
+  'property-name-errors.ref.css',
+  'pseudo-classes-known.css',
+  'pseudo-classes-known.errors',
+  'pseudo-classes-known.ref.css',
+  'pseudo-classes-unknown.css',
+  'pseudo-classes-unknown.errors',
+  'pseudo-classes-unknown.ref.css',
+  'radial-background-position-error.css',
+  'radial-background-position-error.errors',
+  'radial-background-position-error.ref.css',
+  'radial-positions.css',
+  'radial-positions.errors',
+  'radial-positions.ref.css',
+  'radial.css',
+  'radial.ref.css',
+  'selector.css',
+  'selector.ref.css',
+  'shadow.css',
+  'shadow.ref.css',
+  'shorthand.css',
+  'shorthand.ref.css',
+  'simple.css',
+  'single-slash.css',
+  'single-slash.errors',
+  'single-slash.ref.css',
+  'string-values.css',
+  'string-values.ref.css',
+  'test.png',
+  'text-decoration-color.css',
+  'text-decoration-color.ref.css',
+  'text-decoration-line.css',
+  'text-decoration-line.ref.css',
+  'text-decoration-style.css',
+  'text-decoration-style.ref.css',
+  'text-shadow-invalid-but-worked-in-3.12.css',
+  'text-shadow-invalid-but-worked-in-3.12.errors',
+  'text-shadow-invalid-but-worked-in-3.12.ref.css',
+  'text-shadow.css',
+  'text-shadow.ref.css',
+  'transition-delay.css',
+  'transition-delay.ref.css',
+  'transition-duration.css',
+  'transition-duration.ref.css',
+  'transition-property.css',
+  'transition-property.ref.css',
+  'transition-timing-function.css',
+  'transition-timing-function.ref.css',
+  'transition.css',
+  'transition.ref.css',
+  'value-inherit-shorthand.css',
+  'value-inherit-shorthand.ref.css',
+  'value-inherit.css',
+  'value-inherit.errors',
+  'value-initial-shorthand.css',
+  'value-initial-shorthand.ref.css',
+  'value-initial.css',
+  'value-initial.errors',
+  'value-none.css',
+  'value-none.errors',
+  'value-none.ref.css',
+  'widget-style-property.css',
+]
+
+if get_option('installed_tests')
+  conf = configuration_data()
+  conf.set('libexecdir', gtk_libexecdir)
+  configure_file(input: 'test-css-parser.test.in',
+                 output: 'test-css-parser.test',
+                 configuration: conf,
+                 install_dir: testdatadir)
+
+  install_data(test_data, install_dir: testexecdir)
+endif
diff --git a/testsuite/css/style/meson.build b/testsuite/css/style/meson.build
index db3766a5e3..9045d45e47 100644
--- a/testsuite/css/style/meson.build
+++ b/testsuite/css/style/meson.build
@@ -1,3 +1,5 @@
+testexecdir = join_paths(installed_test_bindir, 'css', 'style')
+testdatadir = join_paths(installed_test_datadir, 'css', 'style')
 
 cssresources = gnome.compile_resources(
   'cssresources',
@@ -10,5 +12,45 @@ test_style = executable(
   'test-css-style.c',
   cssresources,
   dependencies: libgtk_dep,
+  install: get_option('installed_tests'),
+  install_dir: testexecdir,
 )
 test('css/style/test-style', test_style)
+
+test_data = [
+  'adjacent-states.css',
+  'adjacent-states.nodes',
+  'adjacent-states.ui',
+  'colornames.css',
+  'colornames.nodes',
+  'colornames.ui',
+  'currentcolor.css',
+  'currentcolor.nodes',
+  'currentcolor.ui',
+  'font.css',
+  'font.nodes',
+  'font.ui',
+  'gradient.css',
+  'gradient.nodes',
+  'gradient.ui',
+  'inherit.css',
+  'inherit.nodes',
+  'inherit.ui',
+  'label.css',
+  'label.nodes',
+  'label.ui',
+  'nth-child.css',
+  'nth-child.nodes',
+  'nth-child.ui',
+]
+
+if get_option('installed_tests')
+  conf = configuration_data()
+  conf.set('libexecdir', gtk_libexecdir)
+  configure_file(input: 'test-css-style.test.in',
+                 output: 'test-css-style.test',
+                 configuration: conf,
+                 install_dir: testdatadir)
+
+  install_data(test_data, install_dir: testexecdir)
+endif
\ No newline at end of file
diff --git a/testsuite/gdk/meson.build b/testsuite/gdk/meson.build
index ca84758e4f..9c8480d3c7 100644
--- a/testsuite/gdk/meson.build
+++ b/testsuite/gdk/meson.build
@@ -11,7 +11,9 @@ tests = [
 
 foreach t : tests
   test_exe = executable(t, '@0@.c'.format(t),
-                        dependencies: libgtk_dep)
+                        dependencies: libgtk_dep,
+                        install: get_option('installed_tests'),
+                        install_dir: installed_test_bindir)
 
   test(t, test_exe,
        args: [ '--tap', '-k' ],
diff --git a/testsuite/gtk/Makefile.am b/testsuite/gtk/Makefile.am
index 859f674f79..843a5156a7 100644
--- a/testsuite/gtk/Makefile.am
+++ b/testsuite/gtk/Makefile.am
@@ -266,6 +266,7 @@ EXTRA_DIST +=                               \
        $(test_icontheme)               \
        $(test_ui)                      \
        meson.build     \
+       gtk.test.in \
        $(NULL)
 
 GTK_GSETTINGS_SCHEMAS = \
diff --git a/testsuite/gtk/gtk.test.in b/testsuite/gtk/gtk.test.in
new file mode 100644
index 0000000000..65dc61bbd1
--- /dev/null
+++ b/testsuite/gtk/gtk.test.in
@@ -0,0 +1,4 @@
+[Test]
+Type=session
+Output=TAP
+Exec=env G_ENABLE_DIAGNOSTIC=0 @testexecdir@/@test@ --tap
\ No newline at end of file
diff --git a/testsuite/gtk/meson.build b/testsuite/gtk/meson.build
index 7cf67be39d..5f3556092a 100644
--- a/testsuite/gtk/meson.build
+++ b/testsuite/gtk/meson.build
@@ -73,7 +73,9 @@ foreach t : tests
   test_exe = executable(test_name, test_srcs,
     c_args : test_cargs + test_extra_cargs,
     link_args : test_extra_ldflags,
-    dependencies : libgtk_dep)
+    dependencies : libgtk_dep,
+    install: get_option('installed_tests'),
+    install_dir: installed_test_bindir)
 
   test(test_name, test_exe,
        args: [ '--tap', '-k' ],
@@ -95,7 +97,9 @@ if add_languages('cpp', required: false)
   test_exe = executable('autotestkeywords',
                         'autotestkeywords.cc',
                         c_args : test_cargs + ['-Idummy-headers'],
-                        dependencies : libgtk_dep)
+                        dependencies : libgtk_dep,
+                        install: get_option('installed_tests'),
+                        install_dir: installed_test_bindir)
   test('c++ keywords', test_exe,
        args: [ '--tap', '-k' ],
        env: [ 'GIO_USE_VOLUME_MONITOR=unix',
@@ -107,4 +111,32 @@ if add_languages('cpp', required: false)
               'GSETTINGS_SCHEMA_DIR=@0@'.format(gtk_schema_build_dir),
             ],
        suite: 'gtk')
+
+  if get_option('installed_tests')
+    conf = configuration_data()
+    conf.set('testexecdir', installed_test_bindir)
+    conf.set('test', 'autotestkeywords')
+    configure_file(input: 'gtk.test.in',
+                   output: 'autotestkeywords.test',
+                   configuration: conf,
+                   install_dir: installed_test_datadir)
+  endif
 endif
+
+
+if get_option('installed_tests')
+  foreach t : tests
+    test_name = t.get(0)
+    conf = configuration_data()
+    conf.set('testexecdir', installed_test_bindir)
+    conf.set('test', test_name)
+    configure_file(input: 'gtk.test.in',
+                   output: '@0@.test'.format(test_name),
+                   configuration: conf,
+                   install_dir: installed_test_datadir)
+  endforeach
+
+  install_subdir('icons', install_dir: installed_test_bindir)
+  install_subdir('icons2', install_dir: installed_test_bindir)
+  install_subdir('ui', install_dir: installed_test_bindir)
+endif
\ No newline at end of file
diff --git a/testsuite/meson.build b/testsuite/meson.build
index 7b855c8a48..289f2725e1 100644
--- a/testsuite/meson.build
+++ b/testsuite/meson.build
@@ -1,9 +1,10 @@
-if get_option('installed_tests')
-  error('installed tests haven\'t been ported to meson yet')
-endif
+gtk_libexecdir = join_paths(gtk_prefix, get_option('libexecdir'))
+installed_test_bindir = join_paths(gtk_libexecdir, 'installed-tests', 'gtk+')
+installed_test_datadir = join_paths(gtk_datadir, 'installed-tests', 'gtk+')
 
 subdir('gtk')
 subdir('gdk')
 subdir('css')
 subdir('a11y')
 subdir('tools')
+subdir('reftests')
diff --git a/testsuite/reftests/Makefile.am b/testsuite/reftests/Makefile.am
index dda89a6471..147d10ea50 100644
--- a/testsuite/reftests/Makefile.am
+++ b/testsuite/reftests/Makefile.am
@@ -68,6 +68,7 @@ clean-local:
 
 EXTRA_DIST += \
        align-expand.sh \
+       meson.build \
        $(NULL)
 
 testdata = \
diff --git a/testsuite/reftests/gtk-reftest.c b/testsuite/reftests/gtk-reftest.c
index 6400b26ecf..585e1c393d 100644
--- a/testsuite/reftests/gtk-reftest.c
+++ b/testsuite/reftests/gtk-reftest.c
@@ -78,7 +78,8 @@ parse_command_line (int *argc, char ***argv)
 
   /* g_test_build_filename must be called after gtk_test_init */
   schema_dir = g_test_build_filename (G_TEST_BUILT, "", NULL);
-  g_setenv ("GSETTINGS_SCHEMA_DIR", schema_dir, TRUE);
+  if (g_getenv ("GTK_TEST_MESON") == NULL)
+    g_setenv ("GSETTINGS_SCHEMA_DIR", schema_dir, TRUE);
   g_free (schema_dir);
 
   if (g_strcmp0 (arg_direction, "rtl") == 0)
@@ -88,6 +89,8 @@ parse_command_line (int *argc, char ***argv)
   else if (arg_direction != NULL)
     g_printerr ("Invalid argument passed to --direction argument. Valid arguments are 'ltr' and 'rtl'\n");
 
+  g_type_ensure (G_TYPE_THEMED_ICON);
+
   return TRUE;
 }
 
diff --git a/testsuite/reftests/meson.build b/testsuite/reftests/meson.build
new file mode 100644
index 0000000000..dd72ced5e5
--- /dev/null
+++ b/testsuite/reftests/meson.build
@@ -0,0 +1,486 @@
+testexecdir = join_paths(installed_test_bindir, 'reftests')
+
+libgtkreftestprivate = shared_library('gtkreftestprivate', [
+  'reftest-compare.c',
+  'reftest-module.c',
+  'reftest-snapshot.c'],
+  dependencies : libgtk_dep)
+
+libreftest = shared_library('reftest',
+  [ 'expand-expander.c',
+    'frame-inhibitor.c',
+    'image-recording-surface.c',
+    'letter-spacing.c',
+    'set-default-direction.c',
+    'statusbar-remove-all.c',
+    'textview-border-windows.c',
+    'textview-tags.c',
+    'animation-direction.c',
+  ],
+  link_with: libgtkreftestprivate,
+  dependencies : libgtk_dep)
+
+gtk_reftest = executable('gtk-reftest', 'gtk-reftest.c',
+  link_with : [libgtkreftestprivate, libreftest],
+  dependencies : libgtk_dep,
+  install: get_option('installed_tests'),
+  install_dir: installed_test_bindir)
+
+test_data = [
+  '721800-0px-dotted-border.css',
+  '721800-0px-dotted-border.ref.ui',
+  '721800-0px-dotted-border.ui',
+  'actionbar.css',
+  'actionbar.ref.ui',
+  'actionbar.ui',
+  'alignment-props.css',
+  'alignment-props.ref.ui',
+  'alignment-props.ui',
+  'animation-direction.css',
+  'animation-direction.ref.ui',
+  'animation-direction.ui',
+  'animation-fill-mode-iteration-count.css',
+  'animation-fill-mode-iteration-count.ref.ui',
+  'animation-fill-mode-iteration-count.ui',
+  'background-area.css',
+  'background-area.ref.ui',
+  'background-area.ui',
+  'background-blend-mode-clip-interaction.css',
+  'background-blend-mode-clip-interaction.ref.ui',
+  'background-blend-mode-clip-interaction.ui',
+  'background-color-transparent.css',
+  'background-color-transparent.ref.ui',
+  'background-color-transparent.ui',
+  'background-image-multiple.css',
+  'background-image-multiple.ref.ui',
+  'background-image-multiple.ui',
+  'background-origin.css',
+  'background-origin.ref.ui',
+  'background-origin.ui',
+  'background-positioning-area-empty.ref.ui',
+  'background-positioning-area-empty.ui',
+  'background-position.css',
+  'background-position.ref.ui',
+  'background-position.ui',
+  'background-position-repeat.css',
+  'background-position-repeat.ref.ui',
+  'background-position-repeat.ui',
+  'background-position-repeat-bg.png',
+  'background-position-simple.css',
+  'background-position-simple.ref.ui',
+  'background-position-simple.ui',
+  'background-size.css',
+  'background-size.ref.ui',
+  'background-size.ui',
+  'background-size-keywords.css',
+  'background-size-keywords.ref.ui',
+  'background-size-keywords.ui',
+  'background-size-zero.css',
+  'background-size-zero.ref.ui',
+  'background-size-zero.ui',
+  'background-window-transparent.css',
+  'background-window-transparent.ref.ui',
+  'background-window-transparent.ui',
+  'bad-color-names.css',
+  'bad-color-names.ref.ui',
+  'bad-color-names.ui',
+  'reference-background-origin.png',
+  'border-color-default.css',
+  'border-color-default.ref.ui',
+  'border-color-default.ui',
+  'border-corner-zero-width-rendering.css',
+  'border-corner-zero-width-rendering.ref.ui',
+  'border-corner-zero-width-rendering.ui',
+  'border-half-pixel.css',
+  'border-half-pixel.ref.ui',
+  'border-half-pixel.ui',
+  'border-image-ball-green.png',
+  'border-image-ball-red.png',
+  'border-image-ball-yellow.png',
+  'border-image-balls.png',
+  'border-image-3-balls-green.png',
+  'border-image-3-balls-green-squished.png',
+  'border-image-3-balls-yellow.png',
+  'border-image-3-balls-yellow-squished.png',
+  'border-image-excess-size.css',
+  'border-image-excess-size.ref.ui',
+  'border-image-excess-size.ui',
+  'border-image-gradient.css',
+  'border-image-gradient.ref.ui',
+  'border-image-gradient.ui',
+  'border-image-url-scaled.css',
+  'border-image-url-scaled.ref.ui',
+  'border-image-url-scaled.ui',
+  'border-image-url.css',
+  'border-image-url.ref.ui',
+  'border-image-url.ui',
+  'border-radius-clamp.css',
+  'border-radius-clamp.ref.ui',
+  'border-radius-clamp.ui',
+  'border-rgb.png',
+  'border-rgb 2 png',
+  'border-style-none.css',
+  'border-style-none.ref.ui',
+  'border-style-none.ui',
+  'border-style.css',
+  'border-style.ref.ui',
+  'border-style.ui',
+  'box-child-expand.ref.ui',
+  'box-child-expand.ui',
+  'box-order.css',
+  'box-order.ref.ui',
+  'box-order.ui',
+  'box-packing.css',
+  'box-packing.ref.ui',
+  'box-packing.ui',
+  'box-pseudo-classes.css',
+  'box-pseudo-classes.ref.ui',
+  'box-pseudo-classes.ui',
+  'box-shadow-changes-modify-clip.css',
+  'box-shadow-changes-modify-clip.ref.ui',
+  'box-shadow-changes-modify-clip.ui',
+  'box-shadow-spec-inset.css',
+  'box-shadow-spec-inset.ref.ui',
+  'box-shadow-spec-inset.ui',
+  'box-shadow-spread.css',
+  'box-shadow-spread.ref.ui',
+  'box-shadow-spread.ui',
+  'box-shadow-with-blend-mode.css',
+  'box-shadow-with-blend-mode.ref.ui',
+  'box-shadow-with-blend-mode.ui',
+  'button-wrapping.ui',
+  'button-wrapping.ref.ui',
+  'cellrenderer-pixbuf-stock-rtl.css',
+  'cellrenderer-pixbuf-stock-rtl.ui',
+  'cellrenderer-pixbuf-stock-rtl.ref.ui',
+  'color-transition.css',
+  'color-transition.ref.ui',
+  'color-transition.ui',
+  'css-em-label-size.css',
+  'css-em-label-size.ui',
+  'css-em-label-size.ref.ui',
+  'css-currentcolor-alpha.css',
+  'css-currentcolor-alpha.ui',
+  'css-currentcolor-alpha.ref.ui',
+  'css-image-aspect-ratio.css',
+  'css-image-aspect-ratio.ui',
+  'css-image-aspect-ratio.ref.ui',
+  'css-image-color-aspect-ratio.css',
+  'css-image-color-aspect-ratio.ui',
+  'css-image-color-aspect-ratio.ref.ui',
+  'css-match-class.css',
+  'css-match-class.ref.ui',
+  'css-match-class.ui',
+  'css-match-descendant-later.css',
+  'css-match-descendant-later.ref.ui',
+  'css-match-descendant-later.ui',
+  'css-match-exact.css',
+  'css-match-exact.ref.ui',
+  'css-match-exact.ui',
+  'css-match-import.css',
+  'css-match-import-import.css',
+  'css-match-import.ui',
+  'css-match-import.ref.ui',
+  'css-match-inherit.css',
+  'css-match-inherit.ref.ui',
+  'css-match-inherit.ui',
+  'css-match-inherit-different-state.css',
+  'css-match-inherit-different-state.ref.ui',
+  'css-match-inherit-different-state.ui',
+  'css-match-name.css',
+  'css-match-name.ref.ui',
+  'css-match-name.ui',
+  'css-match-siblings.css',
+  'css-match-siblings.ref.ui',
+  'css-match-siblings.ui',
+  'css-match-type.css',
+  'css-match-type.ref.ui',
+  'css-match-type.ui',
+  'css-multi-state.css',
+  'css-multi-state.ref.ui',
+  'css-multi-state.ui',
+  'fixed-widget-stacking.ref.ui',
+  'fixed-widget-stacking.ui',
+  'flipping-icons.ref.ui',
+  'flipping-icons.ui',
+  'font-sizes-names.css',
+  'font-sizes-names.ref.ui',
+  'font-sizes-names.ui',
+  'gtk-image-effect-inherit.css',
+  'gtk-image-effect-inherit.ref.ui',
+  'gtk-image-effect-inherit.ui',
+  'green-20x20.png',
+  'grid-empty-with-spacing.ref.ui',
+  'grid-empty-with-spacing.ui',
+  'grid-expand.css',
+  'grid-expand.ref.ui',
+  'grid-expand.ui',
+  'grid-wfh.ui',
+  'grid-wfh.ref.ui',
+  'grid-homogeneous.css',
+  'grid-homogeneous.ref.ui',
+  'grid-homogeneous.ui',
+  'grid-spacing1.ref.ui',
+  'grid-spacing1.ui',
+  'grid-spacing2.ref.ui',
+  'grid-spacing2.ui',
+  'grid-spacing3.css',
+  'grid-spacing3.ref.ui',
+  'grid-spacing3.ui',
+  'gtk-icontheme-sizing.css',
+  'gtk-icontheme-sizing.ref.ui',
+  'gtk-icontheme-sizing.ui',
+  'icon-effect-missing.css',
+  'icon-effect-missing.ref.ui',
+  'icon-effect-missing.ui',
+  'icon-shadow-no-transform.css',
+  'icon-shadow-no-transform.ref.ui',
+  'icon-shadow-no-transform.ui',
+  'icon-style-basics.css',
+  'icon-style-basics.ref.ui',
+  'icon-style-basics.ui',
+  'icon-vfuncs.css',
+  'icon-vfuncs.ref.ui',
+  'icon-vfuncs.ui',
+  'iconview-empty.css',
+  'iconview-empty.ui',
+  'iconview-empty.ref.ui',
+  'image-icon-name-use-fallback.ui',
+  'image-icon-name-use-fallback.ref.ui',
+  'image-icon-shadow-clipping.css',
+  'image-icon-shadow-clipping.ref.ui',
+  'image-icon-shadow-clipping.ui',
+  'image-load-from-file.css',
+  'image-load-from-file.ref.ui',
+  'image-load-from-file.ui',
+  'image-recording-surface.ref.ui',
+  'image-recording-surface.ui',
+  'info-bar-message-types.css',
+  'info-bar-message-types.ref.ui',
+  'info-bar-message-types.ui',
+  'inherit-and-initial.css',
+  'inherit-and-initial.ref.ui',
+  'inherit-and-initial.ui',
+  'label-attribute-preference.css',
+  'label-attribute-preference.ref.ui',
+  'label-attribute-preference.ui',
+  'label-background.css',
+  'label-background.ref.ui',
+  'label-background.ui',
+  'label-box-shadow-clip.css',
+  'label-box-shadow-clip.ref.ui',
+  'label-box-shadow-clip.ui',
+  'label-clipping.css',
+  'label-clipping.ref.ui',
+  'label-clipping.ui',
+  'label-ellipsize-small.ref.ui',
+  'label-ellipsize-small.ui',
+  'label-ellipsize-with-big.ref.ui',
+  'label-ellipsize-with-big.ui',
+  'label-fonts.css',
+  'label-fonts.ref.ui',
+  'label-fonts.ui',
+  'label-shadows.css',
+  'label-shadows.ref.ui',
+  'label-shadows.ui',
+  'label-sizing.css',
+  'label-sizing.ref.ui',
+  'label-sizing.ui',
+  'label-small-ellipsized.ref.ui',
+  'label-small-ellipsized.ui',
+  'label-text-shadow-clipping.css',
+  'label-text-shadow-clipping.ref.ui',
+  'label-text-shadow-clipping.ui',
+  'label-text-shadow-changes-modify-clip.css',
+  'label-text-shadow-changes-modify-clip.ref.ui',
+  'label-text-shadow-changes-modify-clip.ui',
+  'label-width-chars-dont-shrink.ref.ui',
+  'label-width-chars-dont-shrink.ui',
+  'label-wrap-justify.ref.ui',
+  'label-wrap-justify.ui',
+  'letter-spacing.css',
+  'letter-spacing.ui',
+  'letter-spacing.ref.ui',
+  'linear-gradient.css',
+  'linear-gradient.ref.ui',
+  'linear-gradient.ui',
+  'linear-gradient-transition-to-other.css',
+  'linear-gradient-transition-to-other.ref.ui',
+  'linear-gradient-transition-to-other.ui',
+  'link-coloring.css',
+  'link-coloring.ref.ui',
+  'link-coloring.ui',
+  'marble.xpm',
+  'messagedialog-secondarytext.ui',
+  'messagedialog-secondarytext.ref.ui',
+  'misc-alignment.css',
+  'misc-alignment.ref.ui',
+  'misc-alignment.ui',
+  'named-colors.css',
+  'named-colors.ref.ui',
+  'named-colors.ui',
+  'no-colors.css',
+  'no-colors.ref.ui',
+  'no-colors.ui',
+  'nonresizable-size.ref.ui',
+  'nonresizable-size.ui',
+  'notebook-childproperties.css',
+  'notebook-childproperties.ui',
+  'notebook-childproperties.ref.ui',
+  'notebook-tab-position.css',
+  'notebook-tab-position.ui',
+  'notebook-tab-position.ref.ui',
+  'nth-child.css',
+  'nth-child.ref.ui',
+  'nth-child.ui',
+  'opacity.css',
+  'opacity.ui',
+  'opacity.ref.ui',
+  'opacity-initial.css',
+  'opacity-initial.ref.ui',
+  'opacity-initial.ui',
+  'overlay-no-main-widget.ref.ui',
+  'overlay-no-main-widget.ui',
+  'paned-undersized.css',
+  'paned-undersized.ref.ui',
+  'paned-undersized.ui',
+  'pseudoclass-on-box.css',
+  'pseudoclass-on-box.ref.ui',
+  'pseudoclass-on-box.ui',
+  'pseudoclass-on-parent.css',
+  'pseudoclass-on-parent.ref.ui',
+  'pseudoclass-on-parent.ui',
+  'quit-mnemonic.css',
+  'quit-mnemonic.ref.ui',
+  'quit-mnemonic.ui',
+  'reset-to-defaults.css',
+  'revealer-extra-size.ref.ui',
+  'revealer-extra-size.ui',
+  'revealer-wrappable-contents.ref.ui',
+  'revealer-wrappable-contents.ui',
+  'rotated-layout.ref.ui',
+  'rotated-layout.ui',
+  'separator-size.css',
+  'separator-size.ref.ui',
+  'separator-size.ui',
+  'set-default-direction.ui',
+  'set-default-direction.ref.ui',
+  'shadow-clip-rounding.css',
+  'shadow-clip-rounding.ref.ui',
+  'shadow-clip-rounding.ui',
+  'shorthand-entry-border.css',
+  'shorthand-entry-border.ref.ui',
+  'shorthand-entry-border.ui',
+  'sibling-pseudoclasses.css',
+  'sibling-pseudoclasses.ref.ui',
+  'sibling-pseudoclasses.ui',
+  'simple.ref.ui',
+  'simple.ui',
+  'sizegroups-basics.css',
+  'sizegroups-basics.ui',
+  'sizegroups-basics.ref.ui',
+  'sizegroups-evolution-identity-page.ui',
+  'sizegroups-evolution-identity-page.ref.ui',
+  'sizegroups-get-preferred-null.ui',
+  'sizegroups-get-preferred-null.ref.ui',
+  'statusbar-remove-all.ref.ui',
+  'statusbar-remove-all.ui',
+  'style-context-save-inheritance.css',
+  'style-context-save-inheritance.ref.ui',
+  'style-context-save-inheritance.ui',
+  'style-properties-nth-child.css',
+  'style-properties-nth-child.ref.ui',
+  'style-properties-nth-child.ui',
+  'style-properties-only-child.css',
+  'style-properties-only-child.ref.ui',
+  'style-properties-only-child.ui',
+  'symbolic-icon-translucent-color.css',
+  'symbolic-icon-translucent-color.ref.ui',
+  'symbolic-icon-translucent-color.ui',
+  'textview-border-windows.css',
+  'textview-border-windows.ref.ui',
+  'textview-border-windows.ui',
+  'textview-margins.css',
+  'textview-margins.ref.ui',
+  'textview-margins.ui',
+  'textview-tags.ref.ui',
+  'textview-tags.ui',
+  'toplevel-vs-popup.ref.ui',
+  'toplevel-vs-popup.ui',
+  'treeview-crash-too-wide.ref.ui',
+  'treeview-crash-too-wide.ui',
+  'treeview-fixed-height.css',
+  'treeview-fixed-height.ref.ui',
+  'treeview-fixed-height.ui',
+  'treeview-headers-hidden.ref.ui',
+  'treeview-headers-hidden.ui',
+  'unresolvable.css',
+  'unresolvable.ref.ui',
+  'unresolvable.ui',
+  'window-border-width.ref.ui',
+  'window-border-width.ui',
+  'window-default-size.ref.ui',
+  'window-default-size.ui',
+  'window-height-for-width.ref.ui',
+  'window-height-for-width.ui',
+  'window-show-contents-on-map.ref.ui',
+  'window-show-contents-on-map.ui',
+]
+
+# Depending on the environment these fail, feel free to fix them
+somehow_broken = [
+  'label-sizing.ui',
+  'flipping-icons.ui',
+  'window-height-for-width.ui',
+  'cellrenderer-pixbuf-stock-rtl.ui',
+  'label-wrap-justify.ui',
+  'symbolic-icon-translucent-color.ui',
+]
+
+foreach testname : test_data
+  if testname.endswith('.ui') and not testname.endswith('.ref.ui')
+    # reftests fail when multiple windows open at the same time stealing the focus,
+    # so set is_parallel to false
+    test('reftest ' + testname, gtk_reftest,
+         args: [ '--tap',
+                 '-k',
+                 '--verbose',
+                 '-o', join_paths(meson.current_build_dir(), 'output'),
+                 join_paths(meson.current_source_dir(), testname),
+         ],
+         env: [ 'GTK_IM_MODULE=gtk-im-context-simple',
+                'GSETTINGS_BACKEND=memory',
+                'GSETTINGS_SCHEMA_DIR=@0@'.format(gtk_schema_build_dir),
+                'GTK_TEST_MESON=1',
+                'GTK_CSD=0',
+                'G_ENABLE_DIAGNOSTIC=0',
+                'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()),
+                'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()),
+                'REFTEST_MODULE_DIR=@0@'.format(meson.current_build_dir()),
+              ],
+         suite: 'reftest',
+         should_fail: somehow_broken.contains(testname),
+         is_parallel: false)
+  endif
+endforeach
+
+reftests_installed_tests = [
+  'reftests-dark.test',
+  'reftests-hc.test',
+  'reftests-hci.test',
+  'reftests.test',
+]
+
+if get_option('installed_tests')
+  test_cdata = configuration_data()
+  test_cdata.set('libexecdir', gtk_libexecdir)
+
+  foreach t: reftests_installed_tests
+    configure_file(input: '@0@.in'.format(t),
+                   output: t,
+                   configuration: test_cdata,
+                   install_dir: installed_test_datadir)
+  endforeach
+
+  install_data(test_data, install_dir: testexecdir)
+endif
\ No newline at end of file
diff --git a/testsuite/tools/Makefile.am b/testsuite/tools/Makefile.am
index a9996a4491..6893736d38 100644
--- a/testsuite/tools/Makefile.am
+++ b/testsuite/tools/Makefile.am
@@ -17,6 +17,7 @@ EXTRA_DIST += \
        $(test_simplify)        \
        test-simplify.in        \
        test-settings.in        \
+       tools.test.in   \
        meson.build             \
        $(NULL)
 
diff --git a/testsuite/tools/meson.build b/testsuite/tools/meson.build
index 267b96639e..86ecff304b 100644
--- a/testsuite/tools/meson.build
+++ b/testsuite/tools/meson.build
@@ -1,11 +1,21 @@
+testexecdir = join_paths(installed_test_bindir)
+testdatadir = join_paths(installed_test_datadir)
+
 bash = find_program('bash', required : false)
 if bash.found()
   test_env = environment()
 
   foreach t : ['test-simplify', 'test-settings']
-    configure_file(output: t,
-                   input: '@0@.in'.format(t),
-                   copy: true)
+    if get_option('installed_tests')
+      configure_file(output: t,
+                     input: '@0@.in'.format(t),
+                     copy: true,
+                     install_dir: testexecdir)
+    else
+      configure_file(output: t,
+                     input: '@0@.in'.format(t),
+                     copy: true)
+    endif
     test(t, bash,
          args: t,
          workdir: meson.current_build_dir(),
@@ -21,3 +31,17 @@ if bash.found()
          suite: 'tools')
   endforeach
 endif
+
+if get_option('installed_tests')
+  foreach t : ['test-simplify', 'test-settings']
+    test_conf = configuration_data()
+    test_conf.set('testexecdir', testexecdir)
+    test_conf.set('test', t)
+    configure_file(output: '@0@.test'.format(t),
+                   input: 'tools.test.in',
+                   configuration: test_conf,
+                   install_dir: testdatadir)
+  endforeach
+
+  install_subdir('simplify', install_dir: testexecdir)
+endif
diff --git a/testsuite/tools/tools.test.in b/testsuite/tools/tools.test.in
new file mode 100644
index 0000000000..5f6ff63f8b
--- /dev/null
+++ b/testsuite/tools/tools.test.in
@@ -0,0 +1,4 @@
+[Test]
+Type=session
+Output=TAP
+Exec=env G_ENABLE_DIAGNOSTIC=0 TEST_DATA_DIR="@testexecdir@/simplify" @testexecdir@/@test@


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