# Copyright 2020 The Pigweed 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
#
#     https://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("$dir_pw_unit_test/test.gni")

# By default, Pigweed will build this target when invoking ninja.
group("default") {
  deps = []
  if (defined(pw_is_docs_target) && pw_is_docs_target) {
    deps += [ "$dir_pigweed/docs" ]
  } else {
    if (pw_automatic_test_runner == "") {
      # Without a test runner defined, build the tests but don't run them.
      deps += [ ":pw_module_tests" ]
    } else {
      # With a test runner, depend on the run targets so they run with the build.
      deps += [ ":pw_module_tests_run" ]
    }
  }
  if (pw_build_host_tools) {
    deps += [ ":host_tools" ]
  }
}

group("host_tools") {
  deps = [
    "$dir_pw_target_runner/go:simple_client",
    "$dir_pw_target_runner/go:simple_server",
  ]
}

group("pw_facades") {
  deps = [
    "$dir_pw_cpu_exception",
    "$dir_pw_sys_io",
  ]
}

# All Pigweed modules that can be built using gn. This is not built by default.
group("pw_modules") {
  deps = [
    "$dir_pigweed/docs",
    "$dir_pw_allocator",
    "$dir_pw_base64",
    "$dir_pw_checksum",
    "$dir_pw_polyfill",
    "$dir_pw_preprocessor",
    "$dir_pw_protobuf",
    "$dir_pw_result",
    "$dir_pw_span",
    "$dir_pw_status",
    "$dir_pw_string",
    "$dir_pw_unit_test",
    "$dir_pw_varint",
  ]

  if (host_os != "win") {
    deps += [
      # TODO(frolv): Remove these two when new KVS is ready.
      "$dir_pw_kvs",
      "$dir_pw_minimal_cpp_stdlib",

      # TODO(pwbug/111): Remove this when building successfully on Windows.
      "$dir_pw_tokenizer",
    ]
  }
}

# Targets for all module unit test groups.
pw_test_group("pw_module_tests") {
  group_deps = [
    "$dir_pw_allocator:tests",
    "$dir_pw_assert:tests",
    "$dir_pw_base64:tests",
    "$dir_pw_checksum:tests",
    "$dir_pw_containers:tests",
    "$dir_pw_fuzzer:tests",
    "$dir_pw_log:tests",
    "$dir_pw_log_tokenized:tests",
    "$dir_pw_polyfill:tests",
    "$dir_pw_preprocessor:tests",
    "$dir_pw_protobuf:tests",
    "$dir_pw_protobuf_compiler:tests",
    "$dir_pw_result:tests",
    "$dir_pw_ring_buffer:tests",
    "$dir_pw_rpc:tests",
    "$dir_pw_span:tests",
    "$dir_pw_status:tests",
    "$dir_pw_string:tests",
    "$dir_pw_unit_test:tests",
    "$dir_pw_varint:tests",
  ]

  # TODO(pwbug/17): Re-think when Pigweed config system is added.
  if (dir_pw_cpu_exception_backend == dir_pw_cpu_exception_armv7m) {
    group_deps += [ "$dir_pw_cpu_exception_armv7m:tests" ]
  }

  if (host_os != "win") {
    group_deps += [
      "$dir_pw_minimal_cpp_stdlib:tests",

      # TODO(pwbug/111): Remove this when building successfully on Windows.
      "$dir_pw_tokenizer:tests",
    ]

    if (pw_build_host_tools) {
      # TODO(frolv): There are two things happening here.
      #
      #   1. KVS does not currently compile on Windows. Should be simple enough
      #      to fix.
      #   2. KVS tests are not compatible with device builds as they use
      #      features such as std::map and are computationally expensive.
      #      Solving this requires a more complex capabilities-based build and
      #      configuration system which allowing enabling specific tests for
      #      targets that support them and modifying test parameters for
      #      different targets.
      #
      # Checking for pw_build_host_tools (which is only set by the host) is a
      # temporary fix until the problem can be properly solved.
      group_deps += [ "$dir_pw_kvs:tests" ]
    }
  }
}
