# 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,
    ],
  ),
)

rv_timer_test_lib = declare_dependency(
  link_with: static_library(
    'rv_timer_test_lib',
    sources: ['rv_timer_test.c'],
    dependencies: [
      sw_lib_irq,
      sw_lib_pinmux,
      sw_lib_rv_timer,
      sw_lib_base_log,
      sw_lib_dif_gpio,
    ],
  ),
)

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,
    ],
  ),
)

sw_tests += {
  'aes_test': aes_test_lib,
  'flash_ctrl_test': flash_ctrl_test_lib,
  'rv_timer_test': rv_timer_test_lib,
  'sha256_test': sha256_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
