# Copyright (c) 2020 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build_overrides/build.gni")
import("//build_overrides/chip.gni")

import("${chip_root}/build/chip/chip_test.gni")
import("${chip_root}/build/chip/tests.gni")
import("${dir_pw_unit_test}/test.gni")

assert(chip_build_tests)

# Define CHIP unit tests
#
# Simple usage
# chip_test_suite("tests") {
#   output_name = "libFooTests"
#
#   sources = [
#      "Common.h",      # add common sources here
#      "Common.cpp",
#   ]
#
#   test_sources = [
#     "TestFoo.cpp",    # Files are parsed for `CHIP_REGISTER_TEST_SUITE(...)`
#     "TestBar.cpp",    # and a driver is created automatically
#   ]
#
#   public_deps = [
#     "${chip_root}/src/lib/foo",         # add dependencies here
#   ]
# }
#
#
# Deprecated usage (writing own driver files):
#
# chip_test_suite("tests") {
#   output_name = "libFooTests"
#
#   sources = [
#     "TestDeclarations.h",
#     "TestFoo.cpp",
#     "TestBar.cpp",
#   ]
#
#   public_deps = [
#     "${chip_root}/src/lib/foo",         # add dependencies here
#   ]
#
#   tests = [
#     "TestFoo",  # Assumes TestFooDriver.cpp exists
#     "TestBar",  # Assumes TestBarDriver.cpp exists
#   ]
# }

#
template("chip_test_suite") {
  _suite_name = target_name

  # Ensures that the common library has sources containing both common
  # and individual unit tests.
  if (!defined(invoker.sources)) {
    invoker.sources = []
  }

  if (defined(invoker.test_sources)) {
    invoker.sources += invoker.test_sources
  }

  if (chip_build_test_static_libraries) {
    _target_type = "static_library"
  } else {
    _target_type = "source_set"
  }
  target(_target_type, "${_suite_name}.lib") {
    forward_variables_from(invoker, "*", [ "tests" ])

    output_dir = "${root_out_dir}/lib"

    if (!defined(invoker.public_deps)) {
      public_deps = []
    }

    deps = [ dir_pw_unit_test ]

    if (current_os != "zephyr" && current_os != "mbed") {
      # Depend on stdio logging, and have it take precedence over the default platform backend
      public_deps += [ "${chip_root}/src/platform/logging:force_stdio" ]
    }
  }
  if (chip_link_tests) {
    tests = []

    if (defined(invoker.test_sources)) {
      foreach(_test, invoker.test_sources) {
        _test_name = string_replace(_test, ".cpp", "")

        _test_output_dir = "${root_out_dir}/tests"
        if (defined(invoker.output_dir)) {
          _test_output_dir = invoker.output_dir
        }

        pw_test(_test_name) {
          forward_variables_from(invoker,
                                 [
                                   "deps",
                                   "public_deps",
                                   "cflags",
                                   "configs",
                                 ])
          public_deps += [ ":${_suite_name}.lib" ]
          sources = [ _test ]
          output_dir = _test_output_dir
        }
        tests += [ _test_name ]
      }
    }

    if (defined(invoker.tests)) {
      foreach(_test, invoker.tests) {
        _test_output_dir = "${root_out_dir}/tests"
        if (defined(invoker.output_dir)) {
          _test_output_dir = invoker.output_dir
        }

        pw_test(_test) {
          forward_variables_from(invoker,
                                 [
                                   "deps",
                                   "public_deps",
                                   "cflags",
                                   "configs",
                                 ])
          public_deps += [ ":${_suite_name}.lib" ]
          test_main = ""
          sources = [
            "${_test}.cpp",
            "${_test}Driver.cpp",
          ]
          output_dir = _test_output_dir
        }
        tests += [ _test ]
      }
    }

    group(_suite_name) {
      deps = []
      foreach(_test, tests) {
        deps += [ ":${_test}" ]
      }
    }

    if (chip_pw_run_tests) {
      group("${_suite_name}_run") {
        deps = []
        foreach(_test, tests) {
          deps += [ ":${_test}.run" ]
        }
      }
    }
  } else {
    group(_suite_name) {
      deps = [ ":${_suite_name}.lib" ]
    }
  }
}

# TODO [PW_MIGRATION]: remove this once transition away from nlunit-test is completed
template("chip_test_suite_using_nltest") {
  _suite_name = target_name

  # Ensures that the common library has sources containing both common
  # and individual unit tests.
  if (!defined(invoker.sources)) {
    invoker.sources = []
  }

  if (defined(invoker.test_sources)) {
    invoker.sources += invoker.test_sources
  }

  if (chip_build_test_static_libraries) {
    _target_type = "static_library"
  } else {
    _target_type = "source_set"
  }
  target(_target_type, "${_suite_name}.lib") {
    forward_variables_from(invoker, "*", [ "tests" ])

    output_dir = "${root_out_dir}/lib"

    if (!defined(invoker.public_deps)) {
      public_deps = []
    }

    if (current_os != "zephyr" && current_os != "mbed") {
      # Depend on stdio logging, and have it take precedence over the default platform backend
      public_deps += [ "${chip_root}/src/platform/logging:force_stdio" ]
    }
  }
  if (chip_link_tests) {
    tests = []

    if (defined(invoker.test_sources)) {
      foreach(_test, invoker.test_sources) {
        _test_name = string_replace(_test, ".cpp", "")

        _driver_name = "${root_gen_dir}/${_test_name}.driver.cpp"

        action("${_test_name}_generate_driver") {
          script = "${chip_root}/scripts/gen_test_driver.py"

          inputs = [ _test ]
          outputs = [ _driver_name ]
          args = [
            "--input_file=" + rebase_path(_test, root_build_dir),
            "--output_file=" + rebase_path(_driver_name, root_build_dir),
          ]
        }

        chip_test(_test_name) {
          sources = [ _driver_name ]
          public_deps = [
            ":${_suite_name}.lib",
            ":${_test_name}_generate_driver",
          ]
        }
        tests += [ _test_name ]
      }
    }

    if (defined(invoker.tests)) {
      foreach(_test, invoker.tests) {
        chip_test(_test) {
          sources = [ "${_test}Driver.cpp" ]

          public_deps = [ ":${_suite_name}.lib" ]
        }
        tests += [ _test ]
      }
    }

    group(_suite_name) {
      deps = []
      foreach(_test, tests) {
        deps += [ ":${_test}" ]
      }
    }

    if (chip_pw_run_tests) {
      group("${_suite_name}_run") {
        deps = []
        foreach(_test, tests) {
          deps += [ ":${_test}.run" ]
        }
      }
    }
  } else {
    group(_suite_name) {
      deps = [ ":${_suite_name}.lib" ]
    }
  }
}
