// 207-Rpt-TeamCityReporter.cpp // Catch has built-in and external reporters: // Built-in: // - compact // - console // - junit // - xml // External: // - automake // - tap // - teamcity (this example) // main() and reporter code provided in 200-Rpt-CatchMain.cpp #include #ifdef _MSC_VER # pragma warning (disable : 4702) // Disable warning: unreachable code #endif TEST_CASE( "TeamCity passes unconditionally succeeding assertion", "[teamcity]" ) { SUCCEED(); } TEST_CASE( "TeamCity reports unconditionally failing assertion", "[teamcity]" ) { FAIL(); } TEST_CASE( "TeamCity reports failing check", "[teamcity]" ) { REQUIRE( 3 == 7 ); } TEST_CASE( "TeamCity reports failing check-false", "[teamcity]" ) { REQUIRE_FALSE( 3 == 3 ); } TEST_CASE( "TeamCity reports failing check-that", "[teamcity]" ) { using namespace Catch; REQUIRE_THAT( "hello", Contains( "world" ) ); } TEST_CASE( "TeamCity reports unexpected exception", "[teamcity]" ) { REQUIRE( (throw std::runtime_error("surprise!"), true) ); } TEST_CASE( "TeamCity reports undesired exception", "[teamcity]" ) { REQUIRE_NOTHROW( (throw std::runtime_error("surprise!"), true) ); } TEST_CASE( "TeamCity reports missing expected exception", "[teamcity]" ) { REQUIRE_THROWS( true ); } TEST_CASE( "TeamCity reports missing specific expected exception", "[teamcity]" ) { REQUIRE_THROWS_AS( throw std::bad_alloc(), std::runtime_error ); } TEST_CASE( "TeamCity reports unexpected message in expected exception", "[teamcity]" ) { using namespace Catch; CHECK_THROWS_WITH( throw std::runtime_error("hello"), "world" ); CHECK_THROWS_WITH( throw std::runtime_error("hello"), Contains("world") ); } struct MyException: public std::runtime_error { MyException( char const * text ) : std::runtime_error( text ) {} ~MyException() override; }; // prevent -Wweak-vtables: MyException::~MyException() = default; struct MyExceptionMatcher : Catch::MatcherBase< std::runtime_error > { std::string m_text; MyExceptionMatcher( char const * text ) : m_text( text ) {} ~MyExceptionMatcher() override; bool match( std::runtime_error const & arg ) const override { return m_text == arg.what() ; } std::string describe() const override { return "it's me"; } }; // prevent -Wweak-vtables: MyExceptionMatcher::~MyExceptionMatcher() = default; TEST_CASE( "TeamCity failing check-throws-matches", "[teamcity]" ) { CHECK_THROWS_MATCHES( throw MyException("hello"), MyException, MyExceptionMatcher("world") ); } // [!throws] - lets Catch know that this test is likely to throw an exception even if successful. // This causes the test to be excluded when running with -e or --nothrow. // No special effects for the reporter. TEST_CASE( "TeamCity throwing exception with tag [!throws]", "[teamcity][!throws]" ) { REQUIRE_THROWS( throw std::runtime_error("unsurprisingly") ); } // [!mayfail] - doesn't fail the test if any given assertion fails (but still reports it). This can be useful to flag a work-in-progress, or a known issue that you don't want to immediately fix but still want to track in your tests. TEST_CASE( "TeamCity failing assertion with tag [!mayfail]", "[teamcity][!mayfail] " ) { REQUIRE( 3 == 7 ); // doesn't fail test case this time, reports: testIgnored REQUIRE( 3 == 3 ); } // [!shouldfail] - like [!mayfail] but fails the test if it passes. // This can be useful if you want to be notified of accidental, or third-party, fixes. TEST_CASE( "TeamCity succeeding assertion with tag [!shouldfail]", "[teamcity][!shouldfail]" ) { SUCCEED( "Marked [!shouldfail]" ); } // Compile & run: // - g++ -std=c++11 -Wall -I$(CATCH_ROOT) -DCATCH_EXAMPLE_RPT_1=\"include/reporters/catch_reporter_teamcity.hpp\" -o 200-Rpt-CatchMainTeamCity.o -c 200-Rpt-CatchMain.cpp // - g++ -std=c++11 -Wall -I$(CATCH_ROOT) -o 207-Rpt-TeamCityReporter 207-Rpt-TeamCityReporter.cpp 200-Rpt-CatchMainTeamCity.o && 207-Rpt-TeamCityReporter --list-reporters // // - cl -EHsc -I%CATCH_ROOT% -DCATCH_EXAMPLE_RPT_1=\"include/reporters/catch_reporter_teamcity.hpp\" -Fo200-Rpt-CatchMainTeamCity.obj -c 200-Rpt-CatchMain.cpp // - cl -EHsc -I%CATCH_ROOT% 207-Rpt-TeamCityReporter.cpp 200-Rpt-CatchMainTeamCity.o && 207-Rpt-TeamCityReporter --list-reporters // Compilation output (--list-reporters): // Available reporters: // compact: Reports test results on a single line, suitable for IDEs // console: Reports test results as plain lines of text // junit: Reports test results in an XML format that looks like Ant's // junitreport target // teamcity: Reports test results as TeamCity service messages // xml: Reports test results as an XML document // Expected output (abbreviated and broken into shorter lines): // // prompt> 207-Rpt-TeamCityReporter.exe --reporter teamcity // ##teamcity[testSuiteStarted name='207-Rpt-TeamCityReporter.exe'] // ##teamcity[testStarted name='TeamCity passes unconditionally succeeding assertion'] // ##teamcity[testFinished name='TeamCity passes unconditionally succeeding assertion' duration='1'] // ##teamcity[testStarted name='TeamCity reports unconditionally failing assertion'] // ##teamcity[testFailed name='TeamCity reports unconditionally failing assertion' / // message='.../examples/207-Rpt-TeamCityReporter.cpp:23|n/ // ...............................................................................|n|n/ // .../examples/207-Rpt-TeamCityReporter.cpp:25|nexplicit failure'] // ##teamcity[testFinished name='TeamCity reports unconditionally failing assertion' duration='3'] // ...