2017-06-09 6 views
0

私は以下のコードを持っています。 Interpolatorクラスの詳細が何であるかにかかわらず、この場合は例外をスローしないでください。これが私がテストしたいものです。Googleテストマクロはラムダ関数では動作しないようです

TEST(errorhandlingInterpolator, toolargeInput) { 

    const size_t numSamples = 100000; 

    std::array<double, numSamples> bf{{0.0, 0.5, 1.0, 0.0, 0.5, 0.0}}; 
    std::array<double, numSamples> ts{{0.0, 0.0, 0.0, 0.5, 0.5, 1.0}}; 
    std::array<double, numSamples> current{ {0.13, 0.83, 0.96, 0.22, 0.30, 0.54} }; 

    ASSERT_NO_THROW([&](){ 
     Interpolator<double, double, double, numSamples> intp(bf, ts, current); 
    }); 

} 

残念ながら、私は残念ながら(ラムダ機能の有無にかかわらず)次のエラーが発生します。以前は同じエラーが発生した後にラムダでコンストラクタ呼び出しをラップしました。

.../test/main.cpp:34: error: macro "ASSERT_NO_THROW" passed 4 arguments, but takes just 1 
}); 
^

これは決算上の問題ではありません。私は自分のコードをAssertionSuccess()またはAssertionFailure()を返すことができる「通常の」関数でラップすることができますが、それはアサーションでチェックすることができますが、あまりうまくありません。

CATCHテストフレームワークで私の経験から、例えば、REQUIRE_NOTHROW()を使った例外のテストが、コンストラクタから直接マクロで可能であることが分かります。ラムダでさえ不要だったでしょう。

Googleテストフレームワークを誤って使用していないのであれば、私は驚いています。

私の問題の解決策を探している次の2つのドキュメントに行きましたが、参照はありません。

https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md

https://github.com/google/googletest/blob/master/googletest/docs/Primer.md

+3

[関連性が高い](https://stackoverflow.com/questions/35957357/getting-too-many-arguments-provided-to-function-like-macro-invocation-compile-er)、潜在的な詐欺。 Tl; dr:それを別の括弧で囲みます。 –

+0

eeek!確かに!しかし、グーグルはその質問に出ていない! :D –

+0

[OK]をラップされたコンストラクタはラムダで囲まれた括弧で囲まれています。 :P –

答えて

2

マクロ引数は、その中にコンマを持っている場合に発生 - プリプロセッサは、カンマの「最初のDIBの」を取得し、パラメータの区切りとしてそれらを解釈します。

解決策は、引数の前後に括弧を追加することです。

+0

それはうまくいった。 GoogleTest Frameworkは実際にはラムダ関数では動作しないようです。私はこのASSERT_ANY_THROW([](){throw;})を試しました。例外は登録されていません。 次に、私は試しました、ASSERT_ANY_THROW(([](){throw;})); (余分なカッコを参照)、例外は登録されていません。 しかし、私は '普通'の関数が例外をスローした場合、上記のアサーションはそれをうまく登録します。 GoogleTest Frameworkのように広く使われ、宣伝されているようなラムダ関数をサポートしていないことは、私にとっては非常に奇妙なようです。 –

+0

@JoeyMalloneあなたがそれを呼び出さない限り、関数はスローされません。 – molbdnilo

+0

私はそれを呼んでいます。私はTEST()でそれを持っていて、もし私がlambda関数から 'normal'関数に1行だけ切り替えると、例外が登録されます。 ボイドダミー(){スロー;} ASSERT_ANY_THROW(ダミー())。 どのように私はそれを呼び出すだろうか? –

関連する問題