// Copyright 2017 The Abseil 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
//
//      http://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.

#include "absl/base/internal/exception_safety_testing.h"

#include "gtest/gtest.h"
#include "absl/meta/type_traits.h"

namespace testing {

exceptions_internal::NoThrowTag nothrow_ctor;

exceptions_internal::StrongGuaranteeTagType strong_guarantee;

exceptions_internal::ExceptionSafetyTestBuilder<> MakeExceptionSafetyTester() {
  return {};
}

namespace exceptions_internal {

int countdown = -1;

ConstructorTracker* ConstructorTracker::current_tracker_instance_ = nullptr;

void MaybeThrow(absl::string_view msg, bool throw_bad_alloc) {
  if (countdown-- == 0) {
    if (throw_bad_alloc) throw TestBadAllocException(msg);
    throw TestException(msg);
  }
}

testing::AssertionResult FailureMessage(const TestException& e,
                                        int countdown) noexcept {
  return testing::AssertionFailure() << "Exception thrown from " << e.what();
}

std::string GetSpecString(TypeSpec spec) {
  std::string out;
  absl::string_view sep;
  const auto append = [&](absl::string_view s) {
    absl::StrAppend(&out, sep, s);
    sep = " | ";
  };
  if (static_cast<bool>(TypeSpec::kNoThrowCopy & spec)) {
    append("kNoThrowCopy");
  }
  if (static_cast<bool>(TypeSpec::kNoThrowMove & spec)) {
    append("kNoThrowMove");
  }
  if (static_cast<bool>(TypeSpec::kNoThrowNew & spec)) {
    append("kNoThrowNew");
  }
  return out;
}

std::string GetSpecString(AllocSpec spec) {
  return static_cast<bool>(AllocSpec::kNoThrowAllocate & spec)
             ? "kNoThrowAllocate"
             : "";
}

}  // namespace exceptions_internal

}  // namespace testing
