#ifndef PRODUCTION_BORG_MGMT_NODE_PROXY_SAFEPOWER_SAFEPOWER_AGENT_BMC_TEST_UTIL_H_
#define PRODUCTION_BORG_MGMT_NODE_PROXY_SAFEPOWER_SAFEPOWER_AGENT_BMC_TEST_UTIL_H_

#include "gmock/gmock.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"

namespace testing::status {
// NOTE does not use the message in the status.
MATCHER_P(StatusIs, statusIn, "") {
  *result_listener << "returning status code " << arg << " instead of "
                   << statusIn;
  return (arg.code() == statusIn);
}

namespace internal {
inline const absl::Status& GetStatus(const absl::Status& status) {
  return status;
}

template <typename T>
inline const absl::Status& GetStatus(const absl::StatusOr<T>& status) {
  return status.status();
}
}  // namespace internal

#define ASSERT_OK(expr)                                   \
  ASSERT_THAT(testing::status::internal::GetStatus(expr), \
              testing::status::StatusIs(absl::StatusCode::kOk))

#define ASSERT_OK_AND_ASSIGN_CT(lhs, expr, ct) \
  decltype(expr) status_or_##ct;               \
  do {                                         \
    status_or_##ct = (expr);                   \
    ASSERT_OK(status_or_##ct);                 \
  } while (0);                                 \
  lhs = std::move(status_or_##ct).value()

#define ASSERT_OK_AND_ASSIGN_CT_pre(lhs, exp, ct) \
  ASSERT_OK_AND_ASSIGN_CT(lhs, exp, ct)

#define ASSERT_OK_AND_ASSIGN(lhs, expr) \
  ASSERT_OK_AND_ASSIGN_CT_pre(lhs, expr, __COUNTER__)

}  // namespace testing::status

#endif  // PRODUCTION_BORG_MGMT_NODE_PROXY_SAFEPOWER_SAFEPOWER_AGENT_BMC_TEST_UTIL_H_
