From fabe614ba8fced5f0a6aedaa2e3b4e657bda4764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Fri, 19 Nov 2021 15:52:32 +0100 Subject: [PATCH] Rewrite own-main.md for v3 --- docs/own-main.md | 99 ++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/docs/own-main.md b/docs/own-main.md index 6a9b1aad..26dfa86d 100644 --- a/docs/own-main.md +++ b/docs/own-main.md @@ -2,63 +2,69 @@ # Supplying main() yourself **Contents**
-[Let Catch take full control of args and config](#let-catch-take-full-control-of-args-and-config)
-[Amending the config](#amending-the-config)
+[Let Catch2 take full control of args and config](#let-catch2-take-full-control-of-args-and-config)
+[Amending the Catch2 config](#amending-the-catch2-config)
[Adding your own command line options](#adding-your-own-command-line-options)
[Version detection](#version-detection)
-The easiest way to use Catch is to let it supply ```main()``` for you and handle configuring itself from the command line. +The easiest way to use Catch2 is to use its own `main` function, and let +it handle the command line arguments. This is done by linking against +Catch2Main library, e.g. through the [CMake target](cmake-integration.md#cmake-targets), +or pkg-config files. -This is achieved by writing ```#define CATCH_CONFIG_MAIN``` before the ```#include "catch.hpp"``` in *exactly one* source file. +If you want to provide your own `main`, then you should link against +the static library (target) only, without the main part. You will then +have to write your own `main` and call into Catch2 test runner manually. -Sometimes, though, you need to write your own version of main(). You can do this by writing ```#define CATCH_CONFIG_RUNNER``` instead. Now you are free to write ```main()``` as normal and call into Catch yourself manually. +Below are some basic recipes on what you can do supplying your own main. -You now have a lot of flexibility - but here are three recipes to get your started: -## Let Catch take full control of args and config +## Let Catch2 take full control of args and config -If you just need to have code that executes before and/ or after Catch this is the simplest option. +This is useful if you just need to have code that executes before/after +Catch2 runs tests. -```c++ -#define CATCH_CONFIG_RUNNER -#include "catch.hpp" +```cpp +#include int main( int argc, char* argv[] ) { - // global setup... + // your setup ... int result = Catch::Session().run( argc, argv ); - // global clean-up... + // your clean-up... return result; } ``` -## Amending the config +_Note that if you only want to run some set up before tests are run, it +might be simpler to use [event listeners](event-listeners.md#top) instead._ -If you still want Catch to process the command line, but you want to programmatically tweak the config, you can do so in one of two ways: + +## Amending the Catch2 config + +If you want Catch2 to process command line arguments, but also want to +programmatically change the resulting configuration of Catch2 run, +you can do it in two ways: ```c++ -#define CATCH_CONFIG_RUNNER -#include "catch.hpp" - -int main( int argc, char* argv[] ) -{ +int main( int argc, char* argv[] ) { Catch::Session session; // There must be exactly one instance - + // writing to session.configData() here sets defaults // this is the preferred way to set them - + int returnCode = session.applyCommandLine( argc, argv ); if( returnCode != 0 ) // Indicates a command line error return returnCode; - - // writing to session.configData() or session.Config() here + + // writing to session.configData() or session.Config() here // overrides command line args // only do this if you know you need to int numFailed = session.run(); - + // numFailed is clamped to 255 as some unices only use the lower 8 bits. // This clamping has already been applied, so just return it here // You can also do any post run clean-up here @@ -66,38 +72,32 @@ int main( int argc, char* argv[] ) } ``` -Take a look at the definitions of Config and ConfigData to see what you can do with them. +If you want full control of the configuration, don't call `applyCommandLine`. -To take full control of the config simply omit the call to ```applyCommandLine()```. ## Adding your own command line options -Catch embeds a powerful command line parser called [Clara](https://github.com/philsquared/Clara). -As of Catch2 (and Clara 1.0) Clara allows you to write _composable_ option and argument parsers, -so extending Catch's own command line options is now easy. +You can add new command line options to Catch2, by composing the premade +CLI parser (called Clara), and add your own options. -```c++ -#define CATCH_CONFIG_RUNNER -#include "catch.hpp" - -int main( int argc, char* argv[] ) -{ +```cpp +int main( int argc, char* argv[] ) { Catch::Session session; // There must be exactly one instance - + int height = 0; // Some user variable you want to be able to set - - // Build a new parser on top of Catch's - using namespace Catch::clara; - auto cli - = session.cli() // Get Catch's composite command line parser + + // Build a new parser on top of Catch2's + using namespace Catch::Clara; + auto cli + = session.cli() // Get Catch2's command line parser | Opt( height, "height" ) // bind variable to a new option, with a hint string ["-g"]["--height"] // the option names it will respond to ("how high?"); // description string for the help output - - // Now pass the new composite back to Catch so it uses that - session.cli( cli ); - - // Let Catch (using Clara) parse the command line + + // Now pass the new composite back to Catch2 so it uses that + session.cli( cli ); + + // Let Catch2 (using Clara) parse the command line int returnCode = session.applyCommandLine( argc, argv ); if( returnCode != 0 ) // Indicates a command line error return returnCode; @@ -110,12 +110,13 @@ int main( int argc, char* argv[] ) } ``` -See the [Clara documentation](https://github.com/philsquared/Clara/blob/master/README.md) for more details. +See the [Clara documentation](https://github.com/catchorg/Clara/blob/master/README.md) +for more details on how to use the Clara parser. ## Version detection -Catch provides a triplet of macros providing the header's version, +Catch2 provides a triplet of macros providing the header's version, * `CATCH_VERSION_MAJOR` * `CATCH_VERSION_MINOR`