LoginSignup
2
0

More than 5 years have passed since last update.

Catch2 Compile-time configuration

Last updated at Posted at 2018-01-02

これは何?

https://github.com/catchorg/Catch2/blob/master/docs/configuration.md commit 88e912b4d13b5e22c4e91323372597e4c4f667d1 の和訳
変な訳なのはご容赦ください。ほとんど google 翻訳ともいう。
原文で compile toggle と表現しているものは、コンパイルスイッチと訳しています。

Compile-time configuration

Contents
main()/ implementation
Prefixing Catch macros
Terminal colour
Console width
stdout
Other toggles
Windows header clutter
Enabling stringification

Catch はできる限り "そのままで動く" ように設計しています。ほとんどの人は一つだけ設定が必要です、それは Catch に、どのソースファイルを全実装の宿主とするかを教えることです。 (CATCH_CONFIG_MAIN)

それでも、細かい制御が要る場合もあります。 このような場合のために、Catchは、ビルドの方法を設定するための、マクロ群を提供します。

main()/ implementation

CATCH_CONFIG_MAIN   // これを実装ファイルに指定し、main()を定義する
CATCH_CONFIG_RUNNER // これを実装ファイルに指定する

Catchはヘッダーだけですが、内部的にはインターフェースヘッダーと実装を含むヘッダーに分かれています。 テストプロジェクトの1つのソースファイルだけが実装ヘッダーをコンパイルする必要があり、これはこれらのマクロの1つを使用して制御されます。これらの識別子の1つは、プロジェクトの唯一つ実装ファイルに Catch の include 前に定義する必要があります。

Reporter / Listener interfaces

CATCH_CONFIG_EXTERNAL_INTERFACES  // Reporter/Listener の実装に必要なヘッダと成す

ユーザー定義の Reporter/Listener に必要な Catch のさまざまな機能を有効にします。 これは、新しい Reporter と Listener をこのファイルとメインファイルで定義できることを意味します。

暗黙的に CATCH_CONFIG_MAINCATCH_CONFIG_RUNNER の両方が定義されます。

Prefixing Catch macros

CATCH_CONFIG_PREFIX_ALL

テストコードをきれいに整理しておくために、Catchは短いマクロ名(TEST_CASEREQUIREなど)を使用します。 これらは、プラットフォームヘッダーまたはテスト対象のシステムの識別子と競合することがあります。 この場合、上記の識別子を定義することができます。 これにより、すべてのCatchユーザーマクロの先頭にCATCH_CATCH_TEST_CASECATCH_REQUIREなど)が付きます。

Terminal colour

CATCH_CONFIG_COLOUR_NONE    // すべてのテキストの色付けを完全に無効にする
CATCH_CONFIG_COLOUR_WINDOWS // Win32コンソールAPIを強制的に使用する
CATCH_CONFIG_COLOUR_ANSI    // ANSIカラーコードを強制的に使用する

そうです、私は英国人ですので、"カラー"のスペルは'u'を含み続けていきます。

ターミナルに出力を送信するときに、可能であると判断すれば、Catch は 色付けしたテキストを使用します。 Windowsでは Win32 API の SetConsoleTextAttribute が使用されます。 POSIX システムでは、ANSIカラーエスケープコードがストリームに挿入されます。

より細かい制御のために、上記の識別子の1つを定義することができます(これらは相互に排他的ですが、チェックされていないため、混在させると予期せぬ動作をする可能性があります)

注: ANSIカラーコードを使用する場合、 isatty() の定義を含んだ "unistd.h" が include 可能でなければなりません。

典型的な使い方では、メインソースファイルで #include "catch.hpp" の前に #define を置くべきですが、 IDE やビルドシステムがあなたのために提供されたものであれば、あなたのプロジェクト全体で定義しても構いません。

Console width

CATCH_CONFIG_CONSOLE_WIDTH = x // この x は数値

Catch は、コンソールが一定の文字数に収まるように出力を整形します。 インデントが広範囲に使用され、コントロールされていないラインラップがこれを壊すので、これは特に重要です。
デフォルトでは、コンソールの幅は80と仮定されていますが、これは上記の識別子を異なる値に定義することによって制御できます。

stdout

CATCH_CONFIG_NOSTDOUT

Catchは std::coutstd::cerrstd::clog を直接使うのではなく、 Catch::cout()Catch::cerr()Catch::clog() をそれぞれ呼び出します。 上記の識別子が定義されている場合、これらの関数は未実装のままであり、それらを自分で実装する必要があります。 これらの実装は次のとおりです。

std::ostream& cout();
std::ostream& cerr();
std::ostream& clog();

これは、特定の組み込みシステムなど、標準の iostream を提供しない特定のプラットフォームで役に立ちます。

Other toggles

CATCH_CONFIG_COUNTER                    // 一意なテストケース名の生成に __COUNTER__ を使います
CATCH_CONFIG_WINDOWS_SEH                // Windows で SEH 処理を有効にする
CATCH_CONFIG_FAST_COMPILE               // コンパイル速度のためにいくつかの(少しマイナーな)機能を犠牲にする
CATCH_CONFIG_DISABLE_MATCHERS           // このコンパイル単位で Matchers をコンパイルしない
CATCH_CONFIG_POSIX_SIGNALS              // POSIX signal 処理を有効にする
CATCH_CONFIG_WINDOWS_CRTDBG             // Windows の CRT デバッグヒープを使ったリークチェックを有効にする
CATCH_CONFIG_DISABLE_STRINGIFICATION    // 元の式の文字列を無効にする
CATCH_CONFIG_DISABLE                    // アサーションとテストケースの登録を無効にする

MinGW のいくつかのバージョンには、必要な Win32 API のサポートがないため、CATCHでは現在 CATCH_CONFIG_WINDOWS_SEH が MSVC でコンパイルされているときのみ有効です。

CATCH_CONFIG_POSIX_SIGNALSは、Catchが Cygwin でコンパイルされている場合を除いて、デフォルトでオンになっています。 ( Cygwin 環境下ではデフォルトで無効になっていますが、 CATCH_CONFIG_POSIX_SIGNALSを定義することで強制的に有効にすることができます)。

CATCH_CONFIG_WINDOWS_CRTDBG はデフォルトでオフです。 有効にすると、Windows の CRT を使用してメモリリークがチェックされ、テストの実行が完了した後に表示されます。

これらコンパイルスイッチは、コンパイルスイッチの _NO_ 形式を使用して無効にすることができます。例えば CATCH_CONFIG_NO_WINDOWS_SEH

CATCH_CONFIG_FAST_COMPILE

このフラグを定義すると、2つの変更を加えることで、テストファイルのコンパイル速度を約20%向上させることができます。

  • -b--break)フラグは、失敗したテストと同じスタックフレーム内ではなく、のスタックフレーム内で、Catch にブレークさせデバッガーに入る。
  • 非例外マクロ群({REQUIRECHECK} {__FALSE_FALSE}は、ローカル try-cache ブロックを使用しなくなります。 これにより、例外の翻訳は無効になりますが、誤った否定にはなりません。

CATCH_CONFIG_FAST_COMPILE は、単一のテストバイナリにリンクされているすべての翻訳単位で定義されているか、定義されていないか、-bフラグをセットして予期しない例外をスローする動作は予測できません。

CATCH_CONFIG_DISABLE_MATCHERS

CATCH_CONFIG_DISABLE_MATCHERS が定義されている場合、Catch の Matchers のすべての ifdef は、翻訳単位から除外されます。 そうすることで、その TU のコンパイルが高速化されます。

注:Catch のメインと同じファイルに CATCH_CONFIG_DISABLE_MATCHERS を定義した場合、どこかで Matchers を使用するとテスト実行ファイルのリンクができなくなります。

CATCH_CONFIG_DISABLE_STRINGIFICATION

このコンパイルスイッチにより、VS 2017のバグを回避することができます。 詳細については、既知の制限事項を参照してください

CATCH_CONFIG_DISABLE

このコンパイルスイッチは、与えられたファイルから Catch のほとんどを削除します。 つまり、 TEST_CASE は登録されておらず、アサーションはno-opsになります。 外部ファイルではなく、実装ファイル(つまり、内部リンケージを持つ関数)内でテストを保持するのに便利です。

この機能は実験的なもので、いつでも変更される可能性があります。

Doctestの DOCTEST_CONFIG_DISABLE に触発されたものです。

Windows header clutter

Windows の Catchには windows.h が含まれています。 実装ファイル内のグローバルな名前空間の混乱を最小限に抑えるため、それを含める前に NOMINMAXWIN32_LEAN_AND_MEAN を定義します。この動作は、2つのマクロを使用して制御できます。

CATCH_CONFIG_NO_NOMINMAX            // Catch に NOMINMAX マクロの使用を止めさせる
CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN // Catch に WIN32_LEAN_AND_MEAN マクロの使用を止めさせる

Enabling stringification

デフォルトでは、Catchはいくつかの型を標準ライブラリからストリング化しません。 これは、デフォルトでさまざまな標準ライブラリのヘッダーを引きずり込むことを避けるためです。 ただし、Catchにはこれらのマクロが含まれており、次のマクロを使用してそれらを提供するように構成できます。

CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER    // std::pair でテンプレート特殊化した StringMaker を提供する
CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER   // std::tupple でテンプレート特殊化した StringMaker を提供する
CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER  // std::chrono::duration, std::chrono::timepoint でテンプレート特殊化した StringMaker を提供する
CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS    // 上記すべてを定義する

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0