C++
testing
unit-test
catch
catch2

Catch2 Supplying main() yourself

これは何?

https://github.com/catchorg/Catch2/blob/master/docs/own-main.md の適当和訳。
ほとんど google 翻訳です、ハイ。

main() を自前で作る

一番簡単な Catch の使い方は、Catch がユーザに用意している main() を、コマンドラインから制御する方法です。

唯一つだけのソースコード中で、#include "catch.hpp" の前に #define CATCH_CONFIG_MAIN を書くことで、実現できます。

しかし、時には main()の独自のバージョンを書く必要があります。 代わりに #define CATCH_CONFIG_RUNNER を書くことでこれを行うことができます。 こうすると main() を普通に書くことができ、手動で Catch を呼び出すことができます。

今は柔軟性に富んでいますが、これを行うための 3つの料理法があります:

Catch が args と config を完全に制御できるようにする

ただ単に Catch の前後に何らかの処理が必要な場合、これが一番簡単な選択肢です。

#define CATCH_CONFIG_RUNNER
#include "catch.hpp"

int main( int argc, char* argv[] ) {
  // 全体の準備処理 ...

  int result = Catch::Session().run( argc, argv );

  // 全体の後始末処理 ...

  return result;
}

設定の変更

Catchにコマンドラインを処理させたいが、プログラムで設定を微調整したい場合は、次のどちらかの方法を利用できます

#define CATCH_CONFIG_RUNNER
#include "catch.hpp"

int main( int argc, char* argv[] )
{
  Catch::Session session; // インスタンスの存在は1つだけ許されます

  // ここで session.configData() を記述するとデフォルト値を設定します
  // これが、デフォルト設定を行う良い方法です

  int returnCode = session.applyCommandLine( argc, argv );
  if( returnCode != 0 ) // Indicates a command line error
      return returnCode;

  // ここで session.configData() または session.Config() を記述すると
  // コマンドライン引数が覆ります(overrideされる)
  // あなたが必要と思う時だけ実施してください

  int numFailed = session.run();

  // numFailed は、下位8bit だけ使う Unix のため、 255 以下に切り詰められています
  // この切り詰めは実施済みですので、ここでは単に return します
  // また、ここで後始末処理を行うこともできます。
  return numFailed;
}

Config と ConfigData の定義を見て、それらであなたが何をできるかを知ってください。

config を完全に制御するには、単に applyCommandLine() の呼び出しを省略します。

独自のコマンドラインオプションを追加する

Catch には、 Clara と呼ばれる強力なコマンドライン解析器が組み込まれています。
Catch2(およびClara 1.0)以降、Clara では 構成可能 なオプションおよび引数パーサを記述できるため、Catch独自のコマンドラインオプションを拡張するのが容易になりました。

#define CATCH_CONFIG_RUNNER
#include "catch.hpp"

int main( int argc, char* argv[] )
{
  Catch::Session session; // インスタンスは一つだけ許されます

  int height = 0; // あなたが設定できるいくつかのユーザー変数

  // Catch の上に新しいコマンドライン解析器を構築する
  auto cli 
    = session.cli() // Catch の複合コマンドライン解析器を取得する
    | Opt( height, "height" ) // 変数を新しいオプションにバインドします。
        ["-g"]["--height"]    // ヒント文字列を指定すると、
        ("how high?");        // ヘルプ出力の説明文字列に応答します。

  // 新しいコマンドライン解析器を Catch に渡して、それを使用します
  session.cli( cli ); 

  // Catch(Claraを使用)がコマンドラインを解析するようにする
  int returnCode = session.applyCommandLine( argc, argv );
  if( returnCode != 0 ) // コマンドラインエラー
    return returnCode;

  // コマンドラインで設定すると、この時点で 'height' が設定されます
  if( height > 0 )
      std::cout << "height: " << height << std::endl;

  return session.run();
}

詳しくは Clara documentation をご覧ください。