字符串转换函数表达式与Catch断言中的参数

时间:2017-03-15 10:37:27

标签: c++ catch-unit-test

如果我运行以下测试女巫Catch

mine.add(new StructApplication(model));

我得到以下输出

bool eq(int x, int y) {
    return x == y;
}

TEST_CASE("operator vs. function call") {
    int x = 1;
    int y = 2;
    CHECK(x == y);
    CHECK(eq(x, y));
}

为什么Catch可以将/path/to/MyTest.cpp:8: Failure: CHECK(x == y) with expansion: 1 == 2 /path/to/MyTest.cpp:9: Failure: CHECK(eq(x, y)) with expansion: false x转换为运算符表达式y中的字符串,但不能转换为函数调用表达式x == y中的字符串?是否有可能以类似的方式对函数调用表达式进行字符串化以获得如下输出:

eq(x, y)

2 个答案:

答案 0 :(得分:2)

我怀疑CHECK看到eq(x, y)后,它只会将此函数调用的结果视为表达式。

您可以在INFO之前插入CHECK来查看函数调用的参数:

INFO("x:" << x << ", y:" << y);
CHECK(eq(x, y));

将在CHECK电话中记录(显示&#34;带有消息&#34;):

  CHECK( eq(x, y) )
with expansion:
  false
with message:
  x:1, y:2

答案 1 :(得分:1)

有趣的部分是this

#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \
    do { \
        Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
        try { \
            CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
            ( __catchResult <= expr ).endExpression(); \
            CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \
        } \
        catch( ... ) { \
            __catchResult.useActiveException( resultDisposition ); \
        } \
        INTERNAL_CATCH_REACT( __catchResult ) \
    } while( Catch::isTrue( false && static_cast<bool>( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look
    // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.

其中exprx == yeq(x, y)

如何使用 x == y
由于__catchResult <= expr__catchResult <= x == y相比优先级较低(C++ operator precedence),(__catchResult <= x) == y会产生<=,相当于==__catchResult <= xx包裹在一个==运算符的对象中,y传递给它。这就是expr被解构的方式。其余的都很容易想象。

为什么它不起作用 eq(x, y)

__catchResult <= expr会导致__catchResult <= eq(x, y)eq(x, y)首先得到评估(无解构)。

出于同样的原因,如果表达式被圆括号包围,它就不起作用。例如,(x == y)将导致__catchResult <= (x == y),在这种情况下x == y首先被评估(没有解构)。这就是CHECK((x == y));导致输出

的原因
/path/to/MyTest.cpp:8: Failure:
  CHECK((x == y))
with expansion:
  false