# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# All tests added to this dictionary will result in build targets that have
# names starting `sw/device/tests/<test_name>`. They will not contain the
# subdirectory name, because the build targets are really declared at the bottom
# of this file, rather than in the subdirectories.
sw_tests = {
  # 'test_name': test_lib,
}

subdir('dif')
subdir('sim_dv')

aes_test_lib = declare_dependency(
  link_with: static_library(
    'aes_test_lib',
    sources: ['aes_test.c'],
    dependencies: [
      sw_lib_aes,
      sw_lib_base_log,
    ],
  ),
)

flash_ctrl_test_lib = declare_dependency(
  link_with: static_library(
    'flash_ctrl_test_lib',
    sources: ['flash_ctrl_test.c'],
    dependencies: [
      sw_lib_mem,
      sw_lib_mmio,
      sw_lib_flash_ctrl,
      sw_lib_base_log,
    ],
  ),
)

sha256_test_lib = declare_dependency(
  link_with: static_library(
    'sha256_test_lib',
    sources: ['sha256_test.c'],
    dependencies: [
      sw_lib_hmac,
      sw_lib_flash_ctrl,
      sw_lib_base_log,
    ],
  ),
)

usbdev_test_lib = declare_dependency(
  link_with: static_library(
    'usbdev_test_lib',
    sources: ['usbdev_test.c'],
    dependencies: [
      sw_lib_usb,
      sw_lib_base_log,
    ],
  ),
)

coverage_test_lib = declare_dependency(
  link_with: static_library(
    'coverage_test_lib',
    sources: ['coverage_test.c'],
    dependencies: [
      sw_lib_uart,
      collect_coverage,
    ],
  ),
)

sw_tests += {
  'aes_test': aes_test_lib,
  'flash_ctrl_test': flash_ctrl_test_lib,
  'sha256_test': sha256_test_lib,
  'usbdev_test': usbdev_test_lib,
  'coverage_test': coverage_test_lib,
}

foreach sw_test_name, sw_test_lib : sw_tests
  foreach device_name, device_lib : sw_lib_arch_core_devices
    sw_test_elf = executable(
      sw_test_name + '_' + device_name,
      name_suffix: 'elf',
      dependencies: [
        riscv_crt,
        device_lib,
        sw_test_lib,
        sw_lib_irq_handlers,
        sw_lib_testing_test_main,
      ],
    )

    sw_test_embedded = custom_target(
      sw_test_name + '_' + device_name,
      command: make_embedded_target,
      input: sw_test_elf,
      output: make_embedded_target_outputs,
      build_by_default: true,
    )

    custom_target(
      sw_test_name + '_export_' + device_name,
      command: export_embedded_target,
      input: [sw_test_elf, sw_test_embedded],
      output: sw_test_name + '_export_' + device_name,
      build_always_stale: true,
      build_by_default: true,
    )
  endforeach
endforeach

foreach device_name, device_lib : sw_lib_arch_core_devices
  crt_test_elf = executable(
    'crt_test_' + device_name,
    name_suffix: 'elf',
    sources: ['crt_test.c'],
    dependencies: [
      riscv_crt,
      device_lib,
      sw_lib_irq_handlers,
      sw_lib_testing_test_status,
      # Explicitly do not pull in the test main; we need to run right after
      # the CRT is done executing.
      # sw_lib_testing_test_main,
    ],
  )

  crt_test_embedded = custom_target(
    'crt_test_' + device_name,
    command: make_embedded_target,
    input: crt_test_elf,
    output: make_embedded_target_outputs,
    build_by_default: true,
  )

  custom_target(
    'crt_test_export_' + device_name,
    command: export_embedded_target,
    input: [crt_test_elf, crt_test_embedded],
    output: 'crt_test_export_' + device_name,
    build_always_stale: true,
    build_by_default: true,
  )
endforeach
