// Copyright 2022 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.
#pragma once

#include "pw_unit_test/framework.h"

/// Ensures tests in a static library are linked and executed. Provide the test
/// suite name and test name for one test in the file linked into a static
/// library. Any test in the file may be used, but it's recommended to use the
/// first for consistency. The test must be in a static library that's a
/// dependency of this target. Referring to a test that does not exist causes a
/// linker error.
///
/// The linker usually ignores tests linked through a static library
/// because test registration relies on the test instance's static constructor
/// adding itself to a global list of tests. When linking against a static
/// library, static constructors in an object file will be ignored unless at
/// least one entity in that object file is linked.
///
/// This macro works by passing the internal ``TestInfo`` instance to a
/// constructor defined in a source file. This guarantees that the ``TestInfo``
/// instance is referenced, so the linker will link it and the other tests in
/// that file.
#define PW_UNIT_TEST_LINK_FILE_CONTAINING_TEST(suite, name) \
  _PW_UNIT_TEST_LINK_TESTS(_pw_unit_test_Info_##suite##_##name)

#define _PW_UNIT_TEST_LINK_TESTS(info)                              \
  extern "C" {                                                      \
                                                                    \
  extern ::pw::unit_test::internal::TestInfo info;                  \
                                                                    \
  [[maybe_unused]] const ::pw::unit_test::internal::ReferToTestInfo \
      _pw_unit_test_reference_to_ensure_link_##info(info);          \
                                                                    \
  } /* extern "C" */                                                \
                                                                    \
  static_assert(true, "Macros must end with a semicolon")

namespace pw::unit_test::internal {

// Refers to the TestInfo to ensure it is linked in.
class ReferToTestInfo {
 public:
  explicit ReferToTestInfo(const TestInfo& info);
};

}  // namespace pw::unit_test::internal
