From: =?utf-8?q?Jeremy_B=C3=ADcha?= <jeremy.bicha@canonical.com>
Date: Mon, 10 Jun 2024 08:52:56 -0400
Subject: Revert "build: Drop the install-tests option"

This reverts commit 2c637453aa1ece7daa9c477b95b20d993c70ab4e.

Closes: https://gitlab.gnome.org/GNOME/pango/-/issues/799
---
 meson.build                 |   1 +
 meson.options               |   5 ++
 tests/gen-installed-test.py |  25 ++++++
 tests/meson.build           | 208 +++++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 237 insertions(+), 2 deletions(-)
 create mode 100755 tests/gen-installed-test.py

diff --git a/meson.build b/meson.build
index 9cd9026..8e8a693 100644
--- a/meson.build
+++ b/meson.build
@@ -582,6 +582,7 @@ summary('Introspection', build_gir, section: 'Build')
 summary('Documentation', get_option('documentation'), section: 'Build')
 summary('Man pages', get_option('man-pages'), section: 'Build')
 summary('Tests', get_option('build-testsuite'), section: 'Build')
+summary('Install tests', get_option('install-tests'), section: 'Build')
 summary('Examples', get_option('build-examples'), section: 'Build')
 
 summary('prefix', pango_prefix, section: 'Directories')
diff --git a/meson.options b/meson.options
index 85a268d..2f31c2e 100644
--- a/meson.options
+++ b/meson.options
@@ -30,6 +30,11 @@ option('build-examples',
        type: 'boolean',
        value: true)
 
+option('install-tests',
+       description : 'Install tests',
+       type: 'boolean',
+       value: false)
+
 option('fontconfig',
        description : 'Build with FontConfig support. Passing \'auto\' or \'disabled\' disables fontconfig where it is optional, i.e. on Windows and macOS. Passing \'disabled\' on platforms where fontconfig is required results in error.',
        type: 'feature',
diff --git a/tests/gen-installed-test.py b/tests/gen-installed-test.py
new file mode 100755
index 0000000..eeb4abe
--- /dev/null
+++ b/tests/gen-installed-test.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python3
+
+import sys
+import argparse
+import os
+
+template = '''[Test]
+Type=session
+Exec={}
+'''
+
+def build_template(test_dir, test_name):
+    return template.format(os.path.join(test_dir, test_name))
+
+if __name__ == '__main__':
+    argparser = argparse.ArgumentParser(description='Generate installed-test description file')
+    argparser.add_argument('installed_test_dir', help='Path for installed test binaries')
+    argparser.add_argument('test_name', help='Name of the test unit')
+    argparser.add_argument('out_dir', help='Path for the output')
+
+    args = argparser.parse_args()
+
+    outfile = os.path.join(args.out_dir, args.test_name + '.test')
+    with open(outfile, 'w') as f:
+        f.write(build_template(args.installed_test_dir, args.test_name))
diff --git a/tests/meson.build b/tests/meson.build
index 72ea8be..c288d44 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -90,24 +90,228 @@ if cairo_dep.found()
   endif
 endif
 
+installed_test_data = [
+  'boundaries.utf8',
+  'GraphemeBreakTest.txt',
+  'WordBreakTest.txt',
+  'SentenceBreakTest.txt',
+  'EmojiBreakTest.txt',
+  'CharBreakTest.txt',
+]
+
+installed_test_layouts_data = [
+  'layouts/bratwurst2.layout',
+  'layouts/bratwurst3.layout',
+  'layouts/bratwurst4.layout',
+  'layouts/bratwurst.layout',
+  'layouts/effigy.layout',
+  'layouts/kebab.layout',
+  'layouts/tabs.layout',
+  'layouts/tabs-nowrap.layout',
+  'layouts/valid-1.layout',
+  'layouts/valid-2.layout',
+  'layouts/valid-3.layout',
+  'layouts/valid-4.layout',
+  'layouts/valid-5.layout',
+  'layouts/valid-6.layout',
+  'layouts/valid-7.layout',
+  'layouts/valid-8.layout',
+  'layouts/valid-9.layout',
+  'layouts/valid-10.layout',
+  'layouts/valid-11.layout',
+  'layouts/valid-12.layout',
+  'layouts/valid-13.layout',
+  'layouts/valid-14.layout',
+  'layouts/valid-15.layout',
+  'layouts/valid-16.layout',
+  'layouts/valid-17.layout',
+  'layouts/valid-18.layout',
+  'layouts/valid-19.layout',
+  'layouts/valid-20.layout',
+  'layouts/valid-21.layout',
+  'layouts/valid-22.layout',
+  'layouts/tab-crash.layout',
+  'layouts/tab-assert.layout',
+  'layouts/arabic-format.layout',
+  'layouts/no-space.layout',
+  'layouts/aaa.layout',
+  'layouts/letterspacing.layout',
+  'layouts/screaming.layout',
+]
+
+installed_test_fontsets_data = [
+  'fontsets/cantarell',
+  'fontsets/cantarell2',
+  'fontsets/mono',
+  'fontsets/mono2',
+]
+
+installed_test_fonts_data = [
+  'fonts/amiri-06dd.ttf',
+  'fonts/Cantarell-VF.otf',
+  'fonts/DejaVuSans-Bold.ttf',
+  'fonts/DejaVuSansMono.ttf',
+  'fonts/DejaVuSans.ttf',
+  'fonts/droid-sans-subset.ttf',
+  'fonts/emoji-subset.ttf',
+  'fonts/fa-regular-f2db.ttf',
+  'fonts/fa-solid-f2db.ttf',
+  'fonts/fonts.conf',
+  'fonts/noto-sans-cjk.ttf',
+]
+
+test_markups_data = [
+  'markups/fail-1',
+  'markups/fail-2',
+  'markups/fail-3',
+  'markups/fail-4',
+  'markups/fail-5',
+  'markups/fail-6',
+  'markups/fail-7',
+  'markups/fail-8',
+  'markups/fail-9',
+  'markups/fail-10',
+  'markups/fail-11',
+  'markups/fail-12',
+  'markups/fail-13',
+  'markups/fail-14',
+  'markups/fail-15',
+  'markups/fail-16',
+  'markups/fail-17',
+  'markups/fail-20',
+  'markups/fail-21',
+  'markups/fail-22',
+  'markups/fail-23',
+  'markups/fail-24',
+  'markups/fail-25',
+  'markups/fail-26',
+  'markups/fail-27',
+  'markups/fail-28',
+  'markups/fail-29',
+  'markups/fail-30',
+  'markups/fail-31',
+  'markups/fail-32',
+  'markups/fail-33',
+  'markups/fail-34',
+  'markups/fail-35',
+  'markups/fail-36',
+  'markups/fail-37',
+  'markups/fail-38',
+  'markups/fail-39',
+  'markups/valid-1',
+  'markups/valid-2',
+  'markups/valid-3',
+  'markups/valid-4',
+  'markups/valid-5',
+  'markups/valid-6',
+  'markups/valid-7',
+  'markups/valid-8',
+  'markups/valid-9',
+  'markups/valid-10',
+  'markups/valid-11',
+  'markups/valid-12',
+  'markups/valid-13',
+  'markups/valid-14',
+  'markups/valid-15',
+  'markups/valid-16',
+  'markups/valid-17',
+  'markups/valid-18',
+  'markups/valid-19',
+  'markups/valid-20',
+  'markups/valid-21',
+  'markups/valid-22',
+  'markups/valid-23',
+  'markups/valid-24',
+]
+
+test_breaks_data = [
+  'breaks/one',
+  'breaks/two',
+  'breaks/three',
+  'breaks/nine',
+  'breaks/ten',
+  'breaks/eleven',
+]
+
+if thai_dep.found()
+  test_breaks_data += [ 'breaks/four', ]
+endif
+
+test_items_data = [
+  'itemize/one',
+  'itemize/two',
+]
+
+installed_test_markups_data = []
+foreach d: test_markups_data
+  installed_test_markups_data += d + '.markup'
+  installed_test_markups_data += d + '.expected'
+endforeach
+
+installed_test_breaks_data = []
+foreach d: test_breaks_data
+  installed_test_breaks_data += d + '.break'
+  installed_test_breaks_data += d + '.expected'
+endforeach
+
+installed_test_items_data = []
+foreach d: test_items_data
+  installed_test_items_data += d + '.items'
+  installed_test_items_data += d + '.expected'
+endforeach
+
+installed_test_nofonts_data = [
+  'nofonts/fonts.conf',
+]
+
+installed_test_datadir = join_paths(pango_datadir, 'installed-tests', 'pango')
+installed_test_bindir = join_paths(pango_libexecdir, 'installed-tests', 'pango')
+
+if get_option('install-tests')
+  install_data(installed_test_data, install_dir: installed_test_bindir)
+  install_data(installed_test_fonts_data, install_dir: join_paths(installed_test_bindir, 'fonts'))
+  install_data(installed_test_layouts_data, install_dir: join_paths(installed_test_bindir, 'layouts'))
+  install_data(installed_test_markups_data, install_dir: join_paths(installed_test_bindir, 'markups'))
+  install_data(installed_test_breaks_data, install_dir: join_paths(installed_test_bindir, 'breaks'))
+  install_data(installed_test_items_data, install_dir: join_paths(installed_test_bindir, 'itemize'))
+  install_data(installed_test_fontsets_data, install_dir: join_paths(installed_test_bindir, 'fontsets'))
+  install_data(installed_test_nofonts_data, install_dir: join_paths(installed_test_bindir, 'nofonts'))
+endif
+
+gen_installed_test = files([ 'gen-installed-test.py' ])
 gen_all_unicode = files([ 'gen-all-unicode.py' ])
 
 custom_target('all-unicode',
               output: 'all-unicode.txt',
               command: [
                 gen_all_unicode, '@OUTPUT@'
-              ])
+              ],
+              install: get_option('install-tests'),
+              install_dir: installed_test_bindir)
 
 foreach t: tests
   name = t[0]
   src = t.get(1, [ '@0@.c'.format(name) ])
   deps = t.get(2, [ libpango_dep ])
 
+  custom_target(name + '.test',
+                output: name + '.test',
+                command: [
+                  gen_installed_test,
+                  installed_test_bindir,
+                  name,
+                  '@OUTDIR@',
+                ],
+                install: get_option('install-tests'),
+                install_dir: installed_test_datadir)
+
   bin = executable(name, src,
                    dependencies: deps,
                    include_directories: root_inc,
                    c_args: common_cflags + pango_debug_cflags + test_cflags,
-                   cpp_args: common_cppflags + pango_debug_cflags + test_cflags)
+                   cpp_args: common_cppflags + pango_debug_cflags + test_cflags,
+                   install: get_option('install-tests'),
+                   install_dir: installed_test_bindir)
 
   test(name, bin,
     args: ['-k', '--tap'],
