summaryrefslogtreecommitdiffstats
path: root/test/meson.build
diff options
context:
space:
mode:
Diffstat (limited to 'test/meson.build')
-rw-r--r--test/meson.build246
1 files changed, 246 insertions, 0 deletions
diff --git a/test/meson.build b/test/meson.build
new file mode 100644
index 0000000..29b00ad
--- /dev/null
+++ b/test/meson.build
@@ -0,0 +1,246 @@
+# Copyright 2020-2023 David Robillard <d@drobilla.net>
+# SPDX-License-Identifier: 0BSD OR ISC
+
+if not meson.is_subproject() and get_option('lint')
+ # Check release metadata
+ autoship = find_program('autoship', required: get_option('tests'))
+ if autoship.found()
+ test(
+ 'autoship',
+ autoship,
+ args: ['test', zix_src_root],
+ suite: 'data',
+ )
+ endif
+
+ # Check licensing metadata
+ reuse = find_program('reuse', required: get_option('tests'))
+ if reuse.found()
+ test(
+ 'REUSE',
+ reuse,
+ args: ['--root', zix_src_root, 'lint'],
+ suite: 'data',
+ )
+ endif
+endif
+
+# Set warning suppression flags specific to tests
+test_suppressions = []
+if cc.get_id() in ['clang', 'emscripten']
+ if host_machine.system() == 'windows'
+ test_suppressions += [
+ '-Wno-format-nonliteral',
+ ]
+ endif
+endif
+
+common_test_sources = files('failing_allocator.c')
+
+# Single-threaded tests that should run everywhere
+sequential_tests = [
+ 'allocator',
+ 'btree',
+ 'digest',
+ 'hash',
+ 'path',
+ 'status',
+ 'tree',
+]
+
+# Multi-threaded tests that require thread support
+threaded_tests = [
+ 'ring',
+ 'sem',
+ 'thread',
+]
+
+foreach test : sequential_tests
+ sources = common_test_sources + files('test_@0@.c'.format(test))
+
+ test(
+ test,
+ executable(
+ 'test_@0@'.format(test),
+ sources,
+ c_args: c_suppressions + program_c_args + test_suppressions,
+ dependencies: [zix_dep],
+ include_directories: include_dirs,
+ link_args: program_link_args,
+ ),
+ suite: 'unit',
+ timeout: 120,
+ )
+endforeach
+
+test(
+ 'filesystem',
+ executable(
+ 'test_filesystem',
+ files('test_filesystem.c'),
+ c_args: c_suppressions + program_c_args,
+ dependencies: [zix_dep],
+ include_directories: include_dirs,
+ link_args: program_link_args,
+ ),
+ args: files('../README.md'),
+ suite: 'unit',
+ timeout: 120,
+)
+
+if thread_dep.found()
+ foreach test : threaded_tests
+ sources = common_test_sources + files('test_@0@.c'.format(test))
+
+ test(
+ test,
+ executable(
+ 'test_@0@'.format(test),
+ sources,
+ c_args: c_suppressions + program_c_args + test_suppressions,
+ dependencies: [zix_dep, thread_dep],
+ include_directories: include_dirs,
+ link_args: program_link_args,
+ ),
+ suite: 'unit',
+ timeout: 120,
+ )
+ endforeach
+endif
+
+# Test that headers have no warnings (ignoring the usual suppressions)
+if cc.get_id() != 'emscripten'
+ header_suppressions = []
+ if cc.get_id() in ['clang', 'emscripten']
+ header_suppressions += [
+ '-Wno-declaration-after-statement',
+ '-Wno-nullability-extension',
+ '-Wno-padded',
+ ]
+
+ if not meson.is_cross_build()
+ header_suppressions += [
+ '-Wno-poison-system-directories',
+ ]
+ endif
+
+ if host_machine.system() == 'windows'
+ header_suppressions += [
+ '-Wno-nonportable-system-include-path',
+ ]
+ endif
+
+ elif cc.get_id() == 'gcc'
+ header_suppressions += [
+ '-Wno-padded',
+ '-Wno-unused-const-variable',
+ ]
+
+ elif cc.get_id() == 'msvc'
+ header_suppressions += [
+ '/experimental:external',
+ '/external:W0',
+ '/external:anglebrackets',
+
+ '/wd4820', # padding added after construct
+ ]
+ endif
+
+ test(
+ 'headers',
+ executable(
+ 'test_headers',
+ files('headers/test_headers.c'),
+ c_args: header_suppressions + program_c_args,
+ dependencies: zix_dep,
+ include_directories: include_dirs,
+ ),
+ suite: 'build',
+ )
+endif
+
+if not get_option('tests_cpp').disabled() and add_languages(
+ ['cpp'],
+ native: false,
+ required: get_option('tests_cpp').enabled(),
+)
+ cpp = meson.get_compiler('cpp')
+
+ cpp_test_args = []
+ if cpp.get_id() == 'clang'
+ cpp_test_args = [
+ '-Weverything',
+ '-Wno-c++98-compat',
+ '-Wno-c++98-compat-pedantic',
+ '-Wno-nullability-extension',
+ '-Wno-padded',
+ '-Wno-zero-as-null-pointer-constant',
+ ]
+
+ if not meson.is_cross_build()
+ cpp_test_args += [
+ '-Wno-poison-system-directories',
+ ]
+ endif
+
+ if host_machine.system() == 'windows'
+ cpp_test_args += [
+ '-Wno-nonportable-system-include-path',
+ ]
+ endif
+
+ elif cpp.get_id() == 'gcc'
+ cpp_test_args = [
+ '-Wall',
+ '-Wno-padded',
+ '-Wno-unused-const-variable',
+ ]
+
+ elif cpp.get_id() == 'msvc'
+ cpp_test_args = [
+ '/Wall',
+ '/experimental:external',
+ '/external:W0',
+ '/external:anglebrackets',
+
+ '/wd4514', # unreferenced inline function has been removed
+ '/wd4710', # function not inlined
+ '/wd4711', # function selected for automatic inline expansion
+ '/wd4820', # padding added after construct
+ '/wd5039', # throwing function passed to C (winbase.h)
+ '/wd5262', # implicit fall-through
+ '/wd5264', # const variable is not used
+ ]
+ endif
+
+ test(
+ 'headers_cpp',
+ executable(
+ 'test_headers_cpp',
+ files('cpp/test_headers_cpp.cpp'),
+ cpp_args: cpp_test_args + program_c_args,
+ dependencies: [zix_dep],
+ include_directories: include_dirs,
+ link_args: program_link_args,
+ ),
+ suite: 'build',
+ )
+
+ filesystem_code = '''#include <filesystem>
+int main(void) { return 0; }'''
+
+ if cpp.links(filesystem_code, name: 'filesystem')
+ test(
+ 'path_std',
+ executable(
+ 'test_path_std',
+ files('cpp/test_path_std.cpp'),
+ cpp_args: cpp_test_args + program_c_args,
+ dependencies: [zix_dep],
+ include_directories: include_dirs,
+ link_args: program_link_args,
+ ),
+ suite: 'unit',
+ )
+ endif
+endif