blob: 6ccac41864b1474cc1d45f4c77655a6450221f20 [file] [log] [blame]
Austin Schuh36244a12019-09-21 17:52:38 -07001// Copyright 2017 The Abseil Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "absl/base/internal/exception_safety_testing.h"
16
17#ifdef ABSL_HAVE_EXCEPTIONS
18
19#include "gtest/gtest.h"
20#include "absl/meta/type_traits.h"
21
22namespace testing {
23
24exceptions_internal::NoThrowTag nothrow_ctor;
25
26exceptions_internal::StrongGuaranteeTagType strong_guarantee;
27
28exceptions_internal::ExceptionSafetyTestBuilder<> MakeExceptionSafetyTester() {
29 return {};
30}
31
32namespace exceptions_internal {
33
34int countdown = -1;
35
36ConstructorTracker* ConstructorTracker::current_tracker_instance_ = nullptr;
37
38void MaybeThrow(absl::string_view msg, bool throw_bad_alloc) {
39 if (countdown-- == 0) {
40 if (throw_bad_alloc) throw TestBadAllocException(msg);
41 throw TestException(msg);
42 }
43}
44
45testing::AssertionResult FailureMessage(const TestException& e,
46 int countdown) noexcept {
47 return testing::AssertionFailure() << "Exception thrown from " << e.what();
48}
49
50std::string GetSpecString(TypeSpec spec) {
51 std::string out;
52 absl::string_view sep;
53 const auto append = [&](absl::string_view s) {
54 absl::StrAppend(&out, sep, s);
55 sep = " | ";
56 };
57 if (static_cast<bool>(TypeSpec::kNoThrowCopy & spec)) {
58 append("kNoThrowCopy");
59 }
60 if (static_cast<bool>(TypeSpec::kNoThrowMove & spec)) {
61 append("kNoThrowMove");
62 }
63 if (static_cast<bool>(TypeSpec::kNoThrowNew & spec)) {
64 append("kNoThrowNew");
65 }
66 return out;
67}
68
69std::string GetSpecString(AllocSpec spec) {
70 return static_cast<bool>(AllocSpec::kNoThrowAllocate & spec)
71 ? "kNoThrowAllocate"
72 : "";
73}
74
75} // namespace exceptions_internal
76
77} // namespace testing
78
79#endif // ABSL_HAVE_EXCEPTIONS