/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
#pragma once

#include <functional>       // IWYU pragma: export
#include <initializer_list> // IWYU pragma: export
#include <iostream>         // IWYU pragma: export

#define ASSERT_TRUE(x)                                                        \
  do {                                                                        \
    if (!(x)) {                                                               \
      std::cout << "ASSERT_TRUE(" #x ") failed on line " << __LINE__ << '\n'; \
      return false;                                                           \
    }                                                                         \
  } while (false)

#define ASSERT_EQUAL(actual, expected)                                        \
  do {                                                                        \
    if (!((actual) == (expected))) {                                          \
      std::cout << "ASSERT_EQUAL(" #actual ", " #expected ") failed on line " \
                << __LINE__ << '\n';                                          \
      std::cout << "  Actual: '" << (actual) << "'\n";                        \
      std::cout << "Expected: '" << (expected) << "'\n";                      \
      return false;                                                           \
    }                                                                         \
  } while (false)

#define BOOL_STRING(b) ((b) ? "TRUE" : "FALSE")

namespace {

inline int runTests(std::initializer_list<std::function<bool()>> tests,
                    bool const fail_fast = true)
{
  int result = 0;
  for (auto const& test : tests) {
    if (!test()) {
      result = 1;
      if (fail_fast) {
        break;
      }
    }
  }
  if (result == 0) {
    std::cout << "Passed\n";
  }
  return result;
}

}
