# tests

# Not entirely random of course, but at least it changes over time
random_number = minor_version + meson.version().split('.').get(1).to_int()

test_env = environment()
test_env.set('G_TEST_SRCDIR', meson.current_source_dir())
test_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
test_env.set('G_DEBUG', 'gc-friendly')
test_env.set('MALLOC_CHECK_', '2')
test_env.set('MALLOC_PERTURB_', '@0@'.format(random_number % 256))

test_cargs = ['-DG_LOG_DOMAIN="GLib"']

subdir('gobject')
subdir('refcount')

tests = {
  'testglib' : {'tap' : true},
  'testgdate' : {},
  'datetime' : {},
  'atomic-test' : {},
  'bit-test' : {},
  'child-test' : {},
  'completion-test' : {},
  'dirname-test' : {},
  'file-test' : {},
  'env-test' : {},
  'gio-test' : {},
  'mainloop-test' : {},
  'mapping-test' : {},
  'onceinit' : {},
  'asyncqueue-test' : {},
  'qsort-test' : {},
  'relation-test' : {},
  'slice-concurrent' : {},
  'slice-threadinit' : {
    'dependencies' : [libgthread_dep],
  },
  'sources' : {},
  'spawn-test' : {},
  'thread-test' : {},
  'threadpool-test' : {'suite' : ['slow']},
  'type-test' : {},
  'unicode-caseconv' : {},
  'unicode-encoding' : {},
  'module-test' : {
    'dependencies' : [libgmodule_dep],
    'export_dynamic' : true,
  },
  'cxx-test' : {
    'source' : 'cxx-test.cpp',
    'include_directories' : gmoduleinc,
    'dependencies' : [libgio_dep],
  },
}

test_extra_programs = {
  'slice-test' : {
    'extra_sources' : ['memchunks.c'],
  },
  'slice-color' : {
    'extra_sources' : ['memchunks.c'],
  },
  'assert-msg-test' : {},
  'unicode-collate' : {},
}

if host_machine.system() != 'windows'
  tests += {
    'timeloop' : {},
    'iochannel-test' : {},
  }
else
  test_extra_programs += {
    'spawn-test-win32-gui' : {'gui_app' : true}
  }
endif

if installed_tests_enabled
  install_data(
    'iochannel-test-infile',
    'casemap.txt',
    'casefold.txt',
    'utf8.txt',
    install_dir : installed_tests_execdir,
  )
endif

foreach module : ['moduletestplugin_a', 'moduletestplugin_b']
  shared_module(module, 'lib@0@.c'.format(module),
    dependencies : [libglib_dep, libgmodule_dep],
    install_dir : installed_tests_execdir,
    install : installed_tests_enabled
  )
endforeach

common_c_args = test_cargs + ['-DGLIB_DISABLE_DEPRECATION_WARNINGS']
common_deps = [libm, thread_dep, libglib_dep]

foreach test_name, extra_args : tests
  source = extra_args.get('source', test_name + '.c')
  extra_sources = extra_args.get('extra_sources', [])
  install = installed_tests_enabled and extra_args.get('install', true)
  template = extra_args.get('tap', false) ? installed_tests_template_tap : installed_tests_template
  test_command_args = extra_args.get('tap', false) ? ['--tap'] : []

  if install
    test_conf = configuration_data()
    test_conf.set('installed_tests_dir', installed_tests_execdir)
    test_conf.set('program', test_name)
    test_conf.set('env', '')
    configure_file(
      input: template,
      output: test_name + '.test',
      install_dir: installed_tests_metadir,
      configuration: test_conf
    )
  endif

  # FIXME? $(GLIB_DEBUG_FLAGS)
  exe = executable(test_name, [source, extra_sources],
    c_args : common_c_args + extra_args.get('c_args', []),
    dependencies : common_deps + extra_args.get('dependencies', []),
    export_dynamic : extra_args.get('export_dynamic', false),
    include_directories : extra_args.get('include_directories', []),
    install_dir: installed_tests_execdir,
    install: install,
  )

  suite = ['glib'] + extra_args.get('suite', [])
  timeout = suite.contains('slow') ? test_timeout_slow : test_timeout
  # FIXME? TESTS_ENVIRONMENT = LIBCHARSET_ALIAS_DIR=$(top_builddir)/glib/libcharset
  test(test_name, exe, env : test_env, timeout : timeout, suite : suite,
    args : test_command_args)
endforeach

foreach program_name, extra_args : test_extra_programs
  source = extra_args.get('source', program_name + '.c')
  extra_sources = extra_args.get('extra_sources', [])
  install = installed_tests_enabled and extra_args.get('install', true)
  executable(program_name, [source, extra_sources],
      c_args : common_c_args,
      dependencies : common_deps + extra_args.get('dependencies', []),
      install_dir : installed_tests_execdir,
      install : install,
      gui_app : extra_args.get('gui_app', false),
  )
endforeach
