# 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("//build_overrides/pigweed.gni")

import("$dir_pw_build/facade.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_unit_test/test.gni")

declare_args() {
  # Backend for the pw_assert module.
  pw_assert_BACKEND = ""
}

config("default_config") {
  include_dirs = [ "public" ]
}

pw_facade("pw_assert") {
  backend = pw_assert_BACKEND
  public_configs = [ ":default_config" ]
  public = [
    "public/pw_assert/check.h",
    "public/pw_assert/internal/check_impl.h",
    "public/pw_assert/short.h",
  ]
  public_deps = [
    dir_pw_preprocessor,

    # Also expose assert.h to all users of pw_assert.
    ":light",
  ]

  # TODO(pwbug/350): Allow assert.h to include check.h for backwards
  #     compatibility. Remove this when projects have migrated.
  allow_circular_includes_from = [ ":light" ]
  deps = [ ":light" ]
}

# Provide a way include "pw_assert/light.h" without depending on the full
# assert facade. This enables relying on light asserts from low-level headers
# like polyfill or span that might trigger circular includes due to the
# backend.
#
# See the docs for more discussion around where to use which assert system.
pw_source_set("light") {
  public_configs = [ ":default_config" ]
  public = [
    "public/pw_assert/assert.h",
    "public/pw_assert/light.h",

    # Needed for PW_ASSERT_ENABLE_DEBUG. Note that depending on :pw_assert to
    # get options.h won't work here since it will trigger the circular include
    # problem that light asserts are designed to solve.
    "public/pw_assert/options.h",
  ]
  public_deps = [ dir_pw_preprocessor ]
}

# Note: While this is technically a test, doesn't verify any of the output and
# is more of a compile test. The results can be visually verified if desired.
pw_test("light_test") {
  configs = [ ":default_config" ]
  sources = [ "light_test.cc" ]
  deps = [ ":pw_assert" ]
}

pw_test_group("tests") {
  tests = [
    ":assert_backend_compile_test",
    ":assert_facade_test",
    ":light_test",
  ]
}

# The assert facade test doesn't require a backend since a fake one is
# provided. However, since this doesn't depend on the backend it re-includes
# the facade headers.
pw_test("assert_facade_test") {
  configs = [ ":default_config" ]  # For internal/assert_impl.h
  sources = [
    "assert_facade_test.cc",
    "fake_backend.cc",
    "public/pw_assert/internal/check_impl.h",
    "pw_assert_test/fake_backend.h",
  ]
  deps = [
    ":light",
    dir_pw_status,
  ]

  # TODO(frolv): Fix this test on the QEMU target.
  enable_if = pw_build_EXECUTABLE_TARGET_TYPE != "lm3s6965evb_executable"
}

pw_test("assert_backend_compile_test") {
  enable_if = pw_assert_BACKEND != ""
  deps = [
    ":pw_assert",
    dir_pw_status,
    pw_assert_BACKEND,
  ]
  sources = [
    "assert_backend_compile_test.cc",
    "assert_backend_compile_test_c.c",
  ]
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
}
