# 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_dumb_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_base64",
    "$dir_pw_checksum",
    "$dir_pw_polyfill",
    "$dir_pw_preprocessor",
    "$dir_pw_protobuf",
    "$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_assert:tests",
    "$dir_pw_base64:tests",
    "$dir_pw_checksum:tests",
    "$dir_pw_containers:tests",
    "$dir_pw_log:tests",
    "$dir_pw_polyfill:tests",
    "$dir_pw_preprocessor:tests",
    "$dir_pw_protobuf: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" ]
    }
  }
}
