Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/extras/catch_amalgamated.cpp
diff options
context:
space:
mode:
authorLeitwolf112026-11-01 23:06:37 +0300
committerLeitwolf112026-11-01 23:06:37 +0300
commita428c3bf4760f062584ca1d32d4ece6777372f17 (patch)
treec52dedf6f10e6ec5344532ff4829a22fc4daa0b7 /extras/catch_amalgamated.cpp
parente1b0a9d000645b5e914f00603983df16167bd053 (diff)
parentf6f617591cc0a6c4fd2b50999257fe902a339416 (diff)
downloadcatch3-a428c3bf4760f062584ca1d32d4ece6777372f17.tar.gz
Merge devel into the release branchrelease/catch3-0.3.0.2
Diffstat (limited to 'extras/catch_amalgamated.cpp')
-rw-r--r--extras/catch_amalgamated.cpp194
1 files changed, 193 insertions, 1 deletions
diff --git a/extras/catch_amalgamated.cpp b/extras/catch_amalgamated.cpp
index 90c57a65..df0d8f3c 100644
--- a/extras/catch_amalgamated.cpp
+++ b/extras/catch_amalgamated.cpp
@@ -7,7 +7,7 @@
// SPDX-License-Identifier: BSL-1.0
// Catch3 v0.3.0.2, on the Catch2 v3.16.1 engine
-// Generated: 2026-11-01 21:41:33.806849
+// Generated: 2026-11-01 23:05:23.688401
// ----------------------------------------------------------
// This file is an amalgamation of multiple different files.
// You probably shouldn't edit it directly.
@@ -8818,6 +8818,198 @@ namespace Catch {
// Copyright (c) 2026 Progmasoft.
// SPDX-License-Identifier: MPL-2.0 WITH AdditionRef-Progmasoft-Exception-2.0
+#include <algorithm>
+#include <cstdio>
+#include <cstdlib>
+
+namespace Progmasoft::Catch3::Detail
+{
+ namespace
+ {
+ constexpr auto kMacro = "CATCH3_EXPECT_CALL";
+
+ /// Whether a test case is running that a report can belong to.
+ [[nodiscard]] bool
+ InTestCase()
+ {
+ const auto *capture = Catch::getCurrentContext().getResultCapture();
+ return capture != nullptr && !capture->getCurrentTestName().empty();
+ }
+
+ void
+ Report(const Catch::SourceLineInfo &line,
+ const std::string &mock,
+ Catch::ResultWas::OfType result,
+ std::string message,
+ Catch::ResultDisposition::Flags disposition)
+ {
+ Catch::AssertionHandler handler(kMacro, line, mock, disposition);
+ handler.handleMessage(result, std::move(message));
+ handler.complete();
+ }
+
+ void
+ WriteToStandardError(const Catch::SourceLineInfo &line,
+ const std::string &mock,
+ const std::string &message)
+ {
+ std::fprintf(stderr,
+ "%s:%zu: %s: %s\n",
+ line.file,
+ line.line,
+ mock.c_str(),
+ message.c_str());
+ }
+ } // namespace
+
+ void
+ MockSequence::Add(const std::shared_ptr<MockExpectationState> &step)
+ {
+ steps.push_back(step);
+ }
+
+ std::string
+ MockSequence::Enter(const MockExpectationState &step)
+ {
+ const auto position
+ = std::find_if(steps.begin() + static_cast<std::ptrdiff_t>(current),
+ steps.end(),
+ [&step](const auto &candidate) {
+ return candidate.lock().get() == &step;
+ });
+ std::string undone;
+ if (position == steps.end())
+ {
+ return undone;
+ }
+ const auto target = static_cast<std::size_t>(position - steps.begin());
+ for (; current < target; ++current)
+ {
+ const auto earlier = steps[current].lock();
+ if (earlier == nullptr)
+ {
+ continue;
+ }
+ if (!earlier->Satisfied())
+ {
+ undone += (undone.empty() ? "call out of order: " : "\n and ")
+ + step.Description + " came before "
+ + earlier->Description;
+ }
+ earlier->Retired = true;
+ }
+ return undone;
+ }
+
+ std::unique_lock<std::recursive_mutex>
+ LockMocks()
+ {
+ // Never destroyed: a mock of static lifetime can go after it would.
+ static auto *mutex = new std::recursive_mutex;
+ return std::unique_lock<std::recursive_mutex>{ *mutex };
+ }
+
+ void
+ ReportMockFailure(const Catch::SourceLineInfo &line,
+ const std::string &mock,
+ std::string message)
+ {
+ if (!InTestCase())
+ {
+ WriteToStandardError(line, mock, message);
+ return;
+ }
+ // An aborting run throws out of any failure. The run still stops, at
+ // its next assertion.
+ CATCH_TRY
+ {
+ Report(line,
+ mock,
+ Catch::ResultWas::ExplicitFailure,
+ std::move(message),
+ Catch::ResultDisposition::ContinueOnFailure);
+ }
+ CATCH_CATCH_ALL
+ {}
+ }
+
+ void
+ AbortMockCall(const Catch::SourceLineInfo &line,
+ const std::string &mock,
+ std::string message)
+ {
+ if (InTestCase())
+ {
+ Report(line,
+ mock,
+ Catch::ResultWas::ExplicitFailure,
+ std::move(message),
+ Catch::ResultDisposition::Normal);
+ }
+ else
+ {
+ WriteToStandardError(line, mock, message);
+ }
+ std::abort();
+ }
+
+ void
+ ReportMockSuccess(const Catch::SourceLineInfo &line,
+ const std::string &mock,
+ std::string message)
+ {
+ if (InTestCase())
+ {
+ Report(line,
+ mock,
+ Catch::ResultWas::Ok,
+ std::move(message),
+ Catch::ResultDisposition::ContinueOnFailure);
+ }
+ }
+
+ std::string
+ DescribeCalls(std::size_t minimum, std::size_t maximum)
+ {
+ const auto calls = [](std::size_t count) {
+ return std::to_string(count) + (count == 1 ? " call" : " calls");
+ };
+ if (minimum == 0 && maximum == kUnlimitedCalls)
+ {
+ return "any number of calls";
+ }
+ if (minimum == maximum)
+ {
+ return maximum == 0 ? "no calls" : "exactly " + calls(minimum);
+ }
+ if (maximum == kUnlimitedCalls)
+ {
+ return "at least " + calls(minimum);
+ }
+ if (minimum == 0)
+ {
+ return "at most " + calls(maximum);
+ }
+ return std::to_string(minimum) + " to " + calls(maximum);
+ }
+
+ std::string
+ DescribeCount(std::size_t calls)
+ {
+ switch (calls)
+ {
+ case 0:
+ return "never called";
+ case 1:
+ return "called once";
+ default:
+ return "called " + std::to_string(calls) + " times";
+ }
+ }
+} // namespace Progmasoft::Catch3::Detail
+// Copyright (c) 2026 Progmasoft.
+// SPDX-License-Identifier: MPL-2.0 WITH AdditionRef-Progmasoft-Exception-2.0
+
#include <array>
#include <string_view>
#include <utility>