have_registry = true # FIXME not get_option('disable_registry')

libparser = static_library('parser',
  'elements/parser.c',
  install : false,
  dependencies : [gst_dep, gstcheck_dep],
)

libparser_dep = declare_dependency(link_with: libparser,
  sources: ['elements/parser.h'])

exif_dep = dependency('libexif', version : '>= 0.6.16', required : false)

enable_gst_player_tests = get_option('enable_gst_player_tests')

# name, condition when to skip the test and extra dependencies
base_tests = [
  [['elements/aiffparse.c']],
  [['elements/asfmux.c']],
  [['elements/assrender.c'], not ass_dep.found(), [ass_dep]],
  [['elements/autoconvert.c']],
  [['elements/autovideoconvert.c']],
  [['elements/camerabin.c']],
  [['elements/compositor.c']],
  [['elements/curlhttpsink.c'], not curl_dep.found(), [curl_dep]],
  [['elements/curlfilesink.c'], not curl_dep.found(), [curl_dep]],
  [['elements/curlftpsink.c'], not curl_dep.found(), [curl_dep]],
  [['elements/curlsmtpsink.c'], not curl_dep.found(), [curl_dep]],
  [['elements/dash_mpd.c'], not xml2_dep.found(), [xml2_dep]],
  [['elements/dtls.c'], not libcrypto_dep.found(), [libcrypto_dep]],
  [['elements/faac.c'], not faac_dep.found() or not cc.has_header_symbol('faac.h', 'faacEncOpen'), [faac_dep]],
  [['elements/faad.c'], not faad_dep.found() or not have_faad_2_7, [faad_dep]],
  [['elements/gdpdepay.c']],
  [['elements/gdppay.c']],
  [['elements/h263parse.c'], false, [libparser_dep]],
  [['elements/h264parse.c'], false, [libparser_dep]],
  [['elements/id3mux.c']],
  [['elements/jifmux.c'], not exif_dep.found(), [exif_dep]],
  [['elements/jpegparse.c']],
  [['elements/kate.c'], not kate_dep.found(), [kate_dep]],
  [['elements/mpeg4videoparse.c'], false, [libparser_dep]],
  [['elements/mpegtsmux.c']],
  [['elements/mpegvideoparse.c'], false, [libparser_dep]],
  [['elements/mssdemux.c', 'elements/test_http_src.c', 'elements/adaptive_demux_engine.c', 'elements/adaptive_demux_common.c'], not xml28_dep.found(), [xml28_dep]],
  [['elements/mxfdemux.c']],
  [['elements/mxfmux.c']],
  [['elements/netsim.c']],
  [['elements/pcapparse.c'], false, [libparser_dep]],
  [['elements/pnm.c']],
  [['elements/shm.c'], not shm_enabled, shm_deps],
  [['elements/rtponvifparse.c']],
  [['elements/rtponviftimestamp.c']],
  [['elements/videoframe-audiolevel.c']],
  [['elements/viewfinderbin.c']],
  [['elements/voaacenc.c'], not voaac_dep.found(), [voaac_dep]],
  [['elements/webrtcbin.c'], not libnice_dep.found(), [gstwebrtc_dep]],
  [['elements/x265enc.c'], not x265_dep.found(), [x265_dep]],
  [['elements/zbar.c'], not zbar_dep.found(), [zbar_dep]],
  [['libs/h264parser.c'], false, [gstcodecparsers_dep]],
  [['libs/h265parser.c'], false, [gstcodecparsers_dep]],
  [['libs/insertbin.c'], false, [gstinsertbin_dep]],
  [['libs/isoff.c'], not xml2_dep.found(), [gstisoff_dep, xml2_dep]],
  [['libs/mpegts.c'], false, [gstmpegts_dep]],
  [['libs/mpegvideoparser.c'], false, [gstcodecparsers_dep]],
  [['libs/player.c'], not enable_gst_player_tests, [gstplayer_dep]],
  [['libs/vc1parser.c'], false, [gstcodecparsers_dep]],
  [['libs/vp8parser.c'], false, [gstcodecparsers_dep]],
]

test_defines = [
  '-UG_DISABLE_ASSERT',
  '-UG_DISABLE_CAST_CHECKS',
  '-DGST_CHECK_TEST_ENVIRONMENT_BEACON="GST_STATE_IGNORE_ELEMENTS"',
  '-DGST_TEST_FILES_PATH="' + meson.current_source_dir() + '/../files"',
  '-DTEST_PATH="' + meson.current_build_dir() + '/media"',
  '-DDASH_MPD_DATADIR=' + meson.current_source_dir() + '/elements/dash_mpd_data',
  '-DGST_USE_UNSTABLE_API',
]

test_deps = [gst_dep, gstapp_dep, gstbase_dep,
             gstbasecamerabin_dep, gstphotography_dep,
             gstpbutils_dep, gstcontroller_dep, gstaudio_dep,
             gstvideo_dep, gstrtp_dep, gsturidownloader_dep,
             gstcheck_dep, gio_dep, glib_dep, gsttag_dep]

pluginsdirs = [  ]

if gst_dep.type_name() == 'pkgconfig'
  pbase = dependency('gstreamer-plugins-base-' + api_version)

  pluginsdirs = [gst_dep.get_pkgconfig_variable('pluginsdir')] + [pbase.get_pkgconfig_variable('pluginsdir')]
endif

foreach t : base_tests
  fnames = t.get(0)
  test_name = fnames[0].split('.').get(0).underscorify()
  skip_test = false
  extra_deps = [ ]

  if t.length() >= 3
    extra_deps = t.get(2)
  endif

  if t.length() >= 2
    skip_test = t.get(1)
  endif

  if not skip_test
    exe = executable(test_name, fnames,
      include_directories : [configinc],
      c_args : ['-DHAVE_CONFIG_H=1' ] + test_defines,
      cpp_args : gst_plugins_bad_args,
      dependencies : [libm] + test_deps + extra_deps,
    )

    env = environment()
    env.set('GST_PLUGIN_PATH_1_0', meson.build_root())
    env.set('GST_PLUGIN_SYSTEM_PATH_1_0', '')
    env.set('CK_DEFAULT_TIMEOUT', '20')
    env.set('GST_STATE_IGNORE_ELEMENTS', '')
    env.set('GST_PLUGIN_PATH_1_0', [meson.build_root()] + pluginsdirs)
    env.set('GST_REGISTRY', '@0@/@1@.registry'.format(meson.current_build_dir(), test_name))
    test(test_name, exe, env: env, timeout: 3 * 60)
  endif
endforeach

if enable_gst_player_tests
  subdir ('media')
endif
