<feed xmlns='http://www.w3.org/2005/Atom'>
<title>catch3/extras, branch docs/describe-catch3</title>
<subtitle>Progmasoft Catch3: an independently maintained C++17 test framework with a parallel runner, property checks, snapshots and structured results.</subtitle>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/'/>
<entry>
<title>Remove what Catch2's maintainers left that is not ours</title>
<updated>2026-10-24T16:07:10+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-24T16:07:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=a2edf60b9f410d26485ac7c0492870a0905f9545'/>
<id>a2edf60b9f410d26485ac7c0492870a0905f9545</id>
<content type='text'>
Catch3 is maintained by Progmasoft, but the repository still carried
Catch2's funding links, its maintainer list and GPG keys, a Code of Conduct
contact at a Catch2 maintainer's address, its lists of users, its release
process and release scripts, its AppVeyor configuration and its logos.

- Removed FUNDING.yml, MAINTAINERS.md, appveyor.yml with the AppVeyor and
  OpenCppCoverage helpers, Catch2's user lists, why-catch, release process
  and deprecations pages, its two logos and the major/minor/patch release
  scripts. releaseCommon.py keeps only what the amalgamation reads.
- The Code of Conduct sends reports to support@progmasoft.com.
- contributing.md and release-notes.md are written for Catch3; Catch2's
  release history is linked upstream.
- CMake, pkg-config and Doxygen name Catch3 and its repository; the
  amalgamated files say which Catch3 version and which Catch2 engine they
  come from.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Catch3 is maintained by Progmasoft, but the repository still carried
Catch2's funding links, its maintainer list and GPG keys, a Code of Conduct
contact at a Catch2 maintainer's address, its lists of users, its release
process and release scripts, its AppVeyor configuration and its logos.

- Removed FUNDING.yml, MAINTAINERS.md, appveyor.yml with the AppVeyor and
  OpenCppCoverage helpers, Catch2's user lists, why-catch, release process
  and deprecations pages, its two logos and the major/minor/patch release
  scripts. releaseCommon.py keeps only what the amalgamation reads.
- The Code of Conduct sends reports to support@progmasoft.com.
- contributing.md and release-notes.md are written for Catch3; Catch2's
  release history is linked upstream.
- CMake, pkg-config and Doxygen name Catch3 and its repository; the
  amalgamated files say which Catch3 version and which Catch2 engine they
  come from.
</pre>
</div>
</content>
</entry>
<entry>
<title>Do not write the history without its lock</title>
<updated>2026-10-24T14:43:17+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-24T14:43:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=622188f9c08e4af35941c146979883ed4882410e'/>
<id>622188f9c08e4af35941c146979883ed4882410e</id>
<content type='text'>
History::Commit went on writing when the lock was still held by another
run after ten seconds, so two runs that finished together could replace
each other's record. It now returns an error instead, which the runner
reports as a history that was not saved. The wait is a parameter, so the
new unit test can hold the lock and see the commit refused.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
History::Commit went on writing when the lock was still held by another
run after ten seconds, so two runs that finished together could replace
each other's record. It now returns an error instead, which the runner
reports as a history that was not saved. The wait is a parameter, so the
new unit test can hold the lock and see the commit refused.
</pre>
</div>
</content>
</entry>
<entry>
<title>Send what listeners print at start-up in the worker's greeting</title>
<updated>2026-10-24T11:21:11+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-24T11:21:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=906a47a04fe0be9e7e6769d8cae59b4b1d286460'/>
<id>906a47a04fe0be9e7e6769d8cae59b4b1d286460</id>
<content type='text'>
Listeners that print while they are created raced with the first test:
the text went through the worker's error stream and could reach the
runner after it had given the worker a test, which then claimed it as its
own output. The worker now captures Catch2's standard streams while it
creates the listeners and starts the run, sends the text in its hello
message, and the runner writes it to its standard error.

Catch2's stream redirect now remembers the buffer to restore when a
redirect starts rather than when it is made, so a stream whose buffer
changed in between is restored to the right one.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Listeners that print while they are created raced with the first test:
the text went through the worker's error stream and could reach the
runner after it had given the worker a test, which then claimed it as its
own output. The worker now captures Catch2's standard streams while it
creates the listeners and starts the run, sends the text in its hello
message, and the runner writes it to its standard error.

Catch2's stream redirect now remembers the buffer to restore when a
redirect starts rather than when it is made, so a stream whose buffer
changed in between is restored to the right one.
</pre>
</div>
</content>
</entry>
<entry>
<title>End the output capture when a test exits, fail on missing reports</title>
<updated>2026-10-24T09:41:08+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-24T09:41:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=e18f19b7dd70c99fbcf2b3fe812ee18dabc92663'/>
<id>e18f19b7dd70c99fbcf2b3fe812ee18dabc92663</id>
<content type='text'>
A test that called exit() crashed its worker with SIGSEGV on Linux and
macOS. The exit hook read Catch2's captured output through a scoped
deactivation, which switched the capture back on; libstdc++ then flushed
std::cout at exit into a capture buffer that static destruction had
already freed. RunContext::endCapture() now ends the capture for good and
returns what it held, so the standard streams are their own again.

A JUnit, JSON or trace report that could not be written was only
reported on stderr, and a run whose tests passed still exited with 0, so a
build server could miss it. Such a run now exits with 1; failed tests
still exit with 42.

Integration tests of the runner's output move their helpers into
RunnerFixtureClient.hpp and cover --version, --help, the listing modes, a
bad option, exit codes 1 to 4, -v, -q, --slowest, colours, --analytics
in text and JSON, and Bazel's test environment.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
A test that called exit() crashed its worker with SIGSEGV on Linux and
macOS. The exit hook read Catch2's captured output through a scoped
deactivation, which switched the capture back on; libstdc++ then flushed
std::cout at exit into a capture buffer that static destruction had
already freed. RunContext::endCapture() now ends the capture for good and
returns what it held, so the standard streams are their own again.

A JUnit, JSON or trace report that could not be written was only
reported on stderr, and a run whose tests passed still exited with 0, so a
build server could miss it. Such a run now exits with 1; failed tests
still exit with 42.

Integration tests of the runner's output move their helpers into
RunnerFixtureClient.hpp and cover --version, --help, the listing modes, a
bad option, exit codes 1 to 4, -v, -q, --slowest, colours, --analytics
in text and JSON, and Bazel's test environment.
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix the CI failures of the runner and test its planner, options and analysis</title>
<updated>2026-10-24T07:06:25+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-24T07:06:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=e104b694513964d5a84e77f751203cda970d741b'/>
<id>e104b694513964d5a84e77f751203cda970d741b</id>
<content type='text'>
ExtraTests X21 and X27 defined their listeners at namespace scope, which
clang rejects under -Wweak-vtables with -Werror on Linux and macOS; they
are now in anonymous namespaces.

After a fatal signal Catch2 closes the open sections itself, so on POSIX a
crash was reported outside the section it happened in. The scheduler now
ignores section ends that follow a fatal condition.

New unit tests cover the planner (every selection, dependency closure and
cycles, hash and duration shards, incremental runs, learned time limits,
ordering, retries, quarantine and replay), every command-line option and
its errors, and the failure analysis (history classes, signature groups,
crash and hang locations, changed files, replay commands).
Catalog::FromEntries builds a catalog without a test registry so the
planner can be tested on its own.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
ExtraTests X21 and X27 defined their listeners at namespace scope, which
clang rejects under -Wweak-vtables with -Werror on Linux and macOS; they
are now in anonymous namespaces.

After a fatal signal Catch2 closes the open sections itself, so on POSIX a
crash was reported outside the section it happened in. The scheduler now
ignores section ends that follow a fatal condition.

New unit tests cover the planner (every selection, dependency closure and
cycles, hash and duration shards, incremental runs, learned time limits,
ordering, retries, quarantine and replay), every command-line option and
its errors, and the failure analysis (history classes, signature groups,
crash and hang locations, changed files, replay commands).
Catalog::FromEntries builds a catalog without a test registry so the
planner can be tested on its own.
</pre>
</div>
</content>
</entry>
<entry>
<title>Replace Catch2's runner with the Catch3 runner</title>
<updated>2026-10-23T20:25:41+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-23T20:25:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=93d4e7dbebab867e0a7f59fc25308460a7a76280'/>
<id>93d4e7dbebab867e0a7f59fc25308460a7a76280</id>
<content type='text'>
Catch3 keeps Catch2's API for writing tests (test cases, sections,
assertions, matchers, generators, listeners, benchmarks) and replaces its
session, command line and reporters with a runner of its own.

The runner starts the test binary again as worker processes that take the
next test when they are free. A crash, an exit or a hang ends one test, not
the run. On top of that it adds:

- retries that tell deterministic, flaky and order-dependent failures
  apart, and a bisection that names the test leaving state behind;
- a history of verdicts and durations, kept under a file lock, that drives
  automatic quarantine, adaptive time limits, predictive ordering,
  incremental runs, failure replay and analytics;
- selection by change, past failure or prediction, dependency closure,
  and sharding by a stable hash or by recorded durations;
- tags for serial and isolated tests, shared resources, dependencies,
  time limits and retries;
- a failure category, a signature, an analysis and a replay command for
  every failure;
- console, JUnit XML (with flakyFailure and rerunFailure), JSON and Chrome
  trace reports, and a versioned discovery listing (--list=json);
- a temporary directory per test (TMPDIR, TMP, TEMP and
  TestTemporaryDirectory());
- Bazel's test environment: XML output file, test filter, sharding, seed,
  premature exit file and undeclared outputs.

The command line is parsed by a hand-written, typed parser. Catch::Session
remains as a thin facade over the runner for custom main functions.

The result model in Progmasoft/Catch3/Results.hpp was rewritten around
tests and attempts, and the JUnit writer now writes it. The property
engine's example database is updated under a file lock with an atomic
rename, so parallel workers can write it at the same time.

Removed: Clara, the command-line and reporter-spec parsers, every reporter
and CATCH_REGISTER_REPORTER, listing, text flow, console colour and width,
the JSON and XML writers, sharding in the test registry, approval tests and
their baselines, Conan packaging, and the unused third_party/clara.hpp.
Listeners keep working; reporters' list and skip events are gone.

The Catch2 library is now compiled as C++20; code that includes only
Catch2's headers still needs C++14. Duplicate test cases are still refused
at start-up. Version 0.3.0.

ExtraTests now turn exceptions off for clang-cl with MSVC-style options,
which -fno-exceptions did not do.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Catch3 keeps Catch2's API for writing tests (test cases, sections,
assertions, matchers, generators, listeners, benchmarks) and replaces its
session, command line and reporters with a runner of its own.

The runner starts the test binary again as worker processes that take the
next test when they are free. A crash, an exit or a hang ends one test, not
the run. On top of that it adds:

- retries that tell deterministic, flaky and order-dependent failures
  apart, and a bisection that names the test leaving state behind;
- a history of verdicts and durations, kept under a file lock, that drives
  automatic quarantine, adaptive time limits, predictive ordering,
  incremental runs, failure replay and analytics;
- selection by change, past failure or prediction, dependency closure,
  and sharding by a stable hash or by recorded durations;
- tags for serial and isolated tests, shared resources, dependencies,
  time limits and retries;
- a failure category, a signature, an analysis and a replay command for
  every failure;
- console, JUnit XML (with flakyFailure and rerunFailure), JSON and Chrome
  trace reports, and a versioned discovery listing (--list=json);
- a temporary directory per test (TMPDIR, TMP, TEMP and
  TestTemporaryDirectory());
- Bazel's test environment: XML output file, test filter, sharding, seed,
  premature exit file and undeclared outputs.

The command line is parsed by a hand-written, typed parser. Catch::Session
remains as a thin facade over the runner for custom main functions.

The result model in Progmasoft/Catch3/Results.hpp was rewritten around
tests and attempts, and the JUnit writer now writes it. The property
engine's example database is updated under a file lock with an atomic
rename, so parallel workers can write it at the same time.

Removed: Clara, the command-line and reporter-spec parsers, every reporter
and CATCH_REGISTER_REPORTER, listing, text flow, console colour and width,
the JSON and XML writers, sharding in the test registry, approval tests and
their baselines, Conan packaging, and the unused third_party/clara.hpp.
Listeners keep working; reporters' list and skip events are gone.

The Catch2 library is now compiled as C++20; code that includes only
Catch2's headers still needs C++14. Duplicate test cases are still refused
at start-up. Version 0.3.0.

ExtraTests now turn exceptions off for clang-cl with MSVC-style options,
which -fno-exceptions did not do.
</pre>
</div>
</content>
</entry>
<entry>
<title>Backport Catch2 3.16.1</title>
<updated>2026-10-10T23:56:25+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-10T23:56:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=1f78d8903c2fb18afea8c3055f8df83d8c60d9b5'/>
<id>1f78d8903c2fb18afea8c3055f8df83d8c60d9b5</id>
<content type='text'>
Review Catch2 devel through 08092139210881f01a34e60c5f2fd6afa0ea4024,
the commit of 3.16.1, and apply the eleven changes since the last
reviewed revision in upstream order:

  d7683484  better message when a reporter cannot be initialized
  ea5020f0  custom argument validation in every first-party reporter
  aa01559e  throwing-reporter test also throws in assertionEnded
  45cd3987  noexcept on handleUnexpectedInflightException
  6adbd539  MSVC optimizations enabled again after the benchmark headers
  e87f2882  no quadratic scaling for NTTP test registration
  73d546cd  REQUIRE expands its arguments fewer times under GCC and Clang
  b710039a  decomposer operators as plain functions
  f899467b  type-erased streaming of reconstructed expressions
  8f0e70ca  retired macos-14 runner dropped
  08092139  version 3.16.1 and its release notes

All of them applied to the sources without a conflict. The amalgamated
distribution under extras/ conflicted because it is generated; it is
generated again from the sources of this repository, which also brings
it up to date with fork changes it had not picked up: the list-based
stream pool, the Clang diagnostic boundary and the cassert include.

No file under src/Progmasoft changes. The fork-owned texts that name
the engine version say 3.16.1, and docs/upstream-status.md records the
review. Upstream files keep their names, licenses and compiler options.

Built with Clang 22 on Windows and tested: 148 of 149 tests pass. The
one that fails, Reporters::CrashInJunitReporter, fails the same way on
devel without this change with that compiler.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Review Catch2 devel through 08092139210881f01a34e60c5f2fd6afa0ea4024,
the commit of 3.16.1, and apply the eleven changes since the last
reviewed revision in upstream order:

  d7683484  better message when a reporter cannot be initialized
  ea5020f0  custom argument validation in every first-party reporter
  aa01559e  throwing-reporter test also throws in assertionEnded
  45cd3987  noexcept on handleUnexpectedInflightException
  6adbd539  MSVC optimizations enabled again after the benchmark headers
  e87f2882  no quadratic scaling for NTTP test registration
  73d546cd  REQUIRE expands its arguments fewer times under GCC and Clang
  b710039a  decomposer operators as plain functions
  f899467b  type-erased streaming of reconstructed expressions
  8f0e70ca  retired macos-14 runner dropped
  08092139  version 3.16.1 and its release notes

All of them applied to the sources without a conflict. The amalgamated
distribution under extras/ conflicted because it is generated; it is
generated again from the sources of this repository, which also brings
it up to date with fork changes it had not picked up: the list-based
stream pool, the Clang diagnostic boundary and the cassert include.

No file under src/Progmasoft changes. The fork-owned texts that name
the engine version say 3.16.1, and docs/upstream-status.md records the
review. Upstream files keep their names, licenses and compiler options.

Built with Clang 22 on Windows and tested: 148 of 149 tests pass. The
one that fails, Reporters::CrashInJunitReporter, fails the same way on
devel without this change with that compiler.
</pre>
</div>
</content>
</entry>
<entry>
<title>Harden Catch3 exit guards and pin build workflows</title>
<updated>2026-09-27T22:10:14+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-09-27T22:10:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=97328fefe9650c84b594f1cea212c48562e1745b'/>
<id>97328fefe9650c84b594f1cea212c48562e1745b</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>catch_discover_tests registers tests with --order decl</title>
<updated>2026-09-11T11:13:15+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-09-11T11:13:12+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=6534dbc3ef3a162111830d9b5d8a9092d378336d'/>
<id>6534dbc3ef3a162111830d9b5d8a9092d378336d</id>
<content type='text'>
Catch2 defaults to random test execution order, which has to process
all tests present in the binary, even if they will be filtered down
to just 1 later. For the `SelfTest` binary, the overhead from this is
about 20% in Debug configuration and 5% in Release.

By registering the CTest tests with `--order decl`, we avoid this
overhead.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Catch2 defaults to random test execution order, which has to process
all tests present in the binary, even if they will be filtered down
to just 1 later. For the `SelfTest` binary, the overhead from this is
about 20% in Debug configuration and 5% in Release.

By registering the CTest tests with `--order decl`, we avoid this
overhead.
</pre>
</div>
</content>
</entry>
<entry>
<title>v3.16.0</title>
<updated>2026-08-25T07:32:22+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-08-25T07:32:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=317ac1ed4c0bb6e6b91eafc817e05c488feffcb3'/>
<id>317ac1ed4c0bb6e6b91eafc817e05c488feffcb3</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
