gtest_dep = dependency('gtest', main: true, disabler: true, required: false)
gmock_dep = dependency('gmock', disabler: true, required: false)
libgpiodcxx = dependency(
            'libgpiodcxx',
            default_options: ['bindings=cxx'],
        )
if not gtest_dep.found() or not gmock_dep.found()
    cmake = import('cmake')
    gtest_opts = cmake.subproject_options()
    gtest_opts.set_override_option('warning_level', '1')
    gtest_opts.set_override_option('werror', 'false')
    gtest_proj = cmake.subproject('googletest',
                                  options: gtest_opts,
                                  required: false)
    if gtest_proj.found()
        gtest_dep = declare_dependency(
            dependencies: [
                dependency('threads'),
                gtest_proj.dependency('gtest'),
                gtest_proj.dependency('gtest_main'),
            ]
        )
        gmock_dep = gtest_proj.dependency('gmock')
  else
        assert(
            not get_option('tests').allowed(),
            'Googletest is required if tests are enabled'
        )
  endif
endif

parser_build_arguments = []
if get_option('ipz_ecc_check').allowed()
    parser_build_arguments += ['-DIPZ_ECC_CHECK']
endif

dependency_list = [gtest_dep, gmock_dep, sdbusplus, libgpiodcxx]

configuration_inc = include_directories('..', '../vpd-manager/include', '../vpdecc')

test_sources = [
  '../vpd-manager/src/logger.cpp',
  '../vpd-manager/src/ddimm_parser.cpp',
  '../vpd-manager/src/parser.cpp',
  '../vpd-manager/src/parser_factory.cpp',
  '../vpd-manager/src/isdimm_parser.cpp',
  '../vpd-manager/src/ipz_parser.cpp',
  '../vpd-manager/src/keyword_vpd_parser.cpp',
  '../vpd-manager/src/event_logger.cpp',
  '../vpdecc/vpdecc.c'
]

tests = [
  'utest_utils.cpp',
  'utest_keyword_parser.cpp',
  'utest_ddimm_parser.cpp',
  'utest_ipz_parser.cpp',
  'utest_json_utility.cpp'
]

foreach test_file : tests
  test(test_file, executable(test_file.underscorify(),
                     test_file,
                     test_sources,
                     include_directories: configuration_inc,
                     dependencies: dependency_list,
                     cpp_args: parser_build_arguments
                     ),
       workdir: meson.current_source_dir())
endforeach
