dl_dep = cc.find_library('dl', required: false)
has_dlvsym = cc.has_function('dlvsym', dependencies: dl_dep)

has_gles1 = gles1_dep.found()
has_gles2 = gles2_dep.found()
build_x11_tests = enable_x11 and x11_dep.found()

test_cflags = common_cflags
if not has_dlvsym
test_cflags += [
  '-D_XOPEN_SOURCE',
  '-D_POSIX_C_SOURCE=200809L',
]
endif

# Unconditionally built tests
test('header_guards',
     executable('header guards', 'headerguards.c',
                c_args: common_cflags,
                dependencies: libepoxy_dep,
                include_directories: libepoxy_inc))
test('misc_defines',
     executable('misc defines', 'miscdefines.c',
                c_args: common_cflags,
                dependencies: libepoxy_dep,
                include_directories: libepoxy_inc))
test('khronos_typedefs',
     executable('khronos typedefs', [
                  'khronos_typedefs.c',
                  'khronos_typedefs.h',
                  'khronos_typedefs_nonepoxy.c',
                ],
                c_args: common_cflags,
                dependencies: libepoxy_dep,
                include_directories: libepoxy_inc))
test('gl_version',
     executable('gl_version',
                'gl_version.c',
                c_args: common_cflags,
                dependencies: libepoxy_dep,
                include_directories: libepoxy_inc))

if build_egl and build_x11_tests
  egl_common_sources = [ 'egl_common.h', 'egl_common.c', ]
  egl_common_lib = static_library('egl_common',
                                  sources: egl_common_sources,
                                  dependencies: libepoxy_dep,
                                  include_directories: libepoxy_inc,
                                  c_args: common_cflags,
                                  install: false)

  egl_tests = [
    [ 'egl_has_extension_nocontext', [], [ 'egl_has_extension_nocontext.c' ], true, ],
    [ 'egl_epoxy_api', [], [ 'egl_epoxy_api.c' ], true ],
    [ 'egl_gles1_without_glx', [ '-DGLES_VERSION=1', ], [ 'egl_without_glx.c' ], has_gles1, ],
    [ 'egl_gles2_without_glx', [ '-DGLES_VERSION=2', ], [ 'egl_without_glx.c' ], has_gles2, ],
  ]

  if build_glx
    egl_tests += [
      [ 'egl_gl', [], [ 'egl_gl.c' ], true, ],
    ]
  endif

  foreach test: egl_tests
    test_name = test[0]
    test_source = test[2]
    test_args = test[1]
    test_run = test[3]

    if test_run
      test_bin = executable(test_name, test_source,
                            c_args: test_cflags + test_args,
                            include_directories: libepoxy_inc,
                            dependencies: [ libepoxy_dep, x11_dep, egl_dep, dl_dep ],
                            link_with: egl_common_lib,
                            link_args: '-rdynamic')
      test(test_name, test_bin)
    endif
  endforeach
endif

if build_glx and build_x11_tests
  glx_common_sources = [ 'glx_common.h', 'glx_common.c', ]
  glx_common_lib = static_library('glx_common',
                                  sources: glx_common_sources,
                                  dependencies: libepoxy_dep,
                                  include_directories: libepoxy_inc,
                                  c_args: common_cflags,
                                  install: false)

  # glx_beginend links directly with the GL library, so we need to check it
  # separately
  test('glx_beginend', executable('glx_beginend', 'glx_beginend.c',
                                  c_args: test_cflags,
                                  include_directories: libepoxy_inc,
                                  dependencies: [ libepoxy_dep, x11_dep, gl_dep, dl_dep ],
                                  link_with: glx_common_lib))

  glx_tests = [
    [ 'glx_public_api', [ 'glx_public_api.c' ], [], [], true ],
    [ 'glx_public_api_core', [ 'glx_public_api_core.c' ], [], [], true ],
    [ 'glx_glxgetprocaddress_nocontext', [ 'glx_glxgetprocaddress_nocontext.c' ], [], [], true ],
    [ 'glx_has_extension_nocontext', [ 'glx_has_extension_nocontext.c' ], [], [], true ],
    [ 'glx_static', [ 'glx_static.c' ], [ '-DNEEDS_TO_BE_STATIC'], [ '-static' ], libtype == 'static' ],
    [ 'glx_shared_znow', [ 'glx_static.c', ], [], [ '-Wl,-z,now' ], has_znow ],
    [ 'glx_alias_prefer_same_name', [ 'glx_alias_prefer_same_name.c', 'dlwrap.c', 'dlwrap.h' ], [], [ '-rdynamic' ], has_dlvsym ],
    [ 'glx_gles2', [ 'glx_gles2.c', 'dlwrap.c', 'dlwrap.h' ], [], [ '-rdynamic' ], has_dlvsym ],
  ]

  foreach test: glx_tests
    test_name = test[0]
    test_source = test[1]
    test_c_args = test[2]
    test_link_args = test[3]
    test_run = test[4]

    if test_run
      test_bin = executable(test_name, test_source,
                            c_args: test_cflags + test_c_args,
                            include_directories: libepoxy_inc,
                            dependencies: [ libepoxy_dep, x11_dep, dl_dep ],
                            link_with: glx_common_lib,
                            link_args: test_link_args)
      test(test_name, test_bin)
    endif
  endforeach
endif

# WGL
if build_wgl
  wgl_common_sources = [ 'wgl_common.h', 'wgl_common.c', ]
  wgl_common_lib = static_library('wgl_common',
                                  sources: wgl_common_sources,
                                  dependencies: libepoxy_dep,
                                  include_directories: libepoxy_inc,
                                  c_args: common_cflags,
                                  install: false)

  wgl_tests = [
    [ 'wgl_core_and_exts', [ 'wgl_core_and_exts.c' ], [], ],
    [ 'wgl_per_context_funcptrs', [ 'wgl_per_context_funcptrs.c' ], [], ],
    [ 'wgl_usefontbitmaps', [ 'wgl_usefontbitmaps.c'], [], ],
    [ 'wgl_usefontbitmaps_unicode', [ 'wgl_usefontbitmaps.c' ], [ '-DUNICODE' ], ],
  ]

  foreach test: wgl_tests
    test_name = test[0]
    test_source = test[1]
    test_c_args = test[2]

    test_bin = executable(test_name, test_source,
                          c_args: test_cflags + test_c_args,
                          include_directories: libepoxy_inc,
                          dependencies: [ libepoxy_dep ],
                          link_with: wgl_common_lib)

    test(test_name, test_bin)
  endforeach
endif

# Apple
if host_machine.system().contains('darwin')
  opengl_dep = dependency('appleframeworks', modules: ['OpenGL', 'Carbon'], required: true)

  cgl_tests = [
    [ 'cgl_core', [ 'cgl_core.c' ] ],
    [ 'cgl_epoxy_api', [ 'cgl_epoxy_api.c' ] ],
  ]

  foreach t: cgl_tests
    test_name = t[0]
    test_sources = t[1]

    test(test_name,
      executable(
        test_name, test_sources,
        c_args: test_cflags,
        include_directories: libepoxy_inc,
        dependencies: [ libepoxy_dep, opengl_dep ],
      ),
    )
  endforeach
endif