diff --git a/UnitTest++/CheckMacros.h b/UnitTest++/CheckMacros.h index 7948726..20f2ec9 100644 --- a/UnitTest++/CheckMacros.h +++ b/UnitTest++/CheckMacros.h @@ -225,6 +225,10 @@ UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \ "Expected exception: \"" #ExpectedExceptionType "\" not thrown")) +#define CHECK_THROW_DESCRIBED(expression, ExpectedExceptionType, description) \ + UNITTEST_CHECK_THROW(expression, ExpectedExceptionType, \ + UNITTEST_CHECK_WITH_DESCRIPTION(false, description)) + #define UNITTEST_CHECK_THROW(expression, ExpectedExceptionType, failure_action) \ UNITTEST_MULTILINE_MACRO_BEGIN \ bool caught_ = false; \ diff --git a/tests/TestCheckMacros.cpp b/tests/TestCheckMacros.cpp index e0a6d0a..518ed75 100644 --- a/tests/TestCheckMacros.cpp +++ b/tests/TestCheckMacros.cpp @@ -1128,6 +1128,89 @@ TEST(CheckThrowDoesNotHaveSideEffectsWhenFailing) CHECK_EQUAL(1, g_sideEffect); } +TEST(CheckThrowDescribedSucceedsWhenCorrectTypeTrown) +{ + bool failure = true; + { + RecordingReporter reporter; + UnitTest::TestResults testResults(&reporter); + ScopedCurrentTest scopedResults(testResults); + CHECK_THROW_DESCRIBED(ThrowInt(), int, "description"); + failure = (testResults.GetFailureCount() > 0); + } + + CHECK(!failure); +} + +TEST(CheckThrowDescribedFailsWhenNothingThrown) +{ + bool failure = false; + { + RecordingReporter reporter; + UnitTest::TestResults testResults(&reporter); + ScopedCurrentTest scopedResults(testResults); + CHECK_THROW_DESCRIBED(ThrowNothing(), int, "description"); + failure = (testResults.GetFailureCount() > 0); + } + + CHECK(failure); +} + +TEST(CheckThrowDescribedFailsWhenWrongTypeThrown) +{ + bool failure = false; + { + RecordingReporter reporter; + UnitTest::TestResults testResults(&reporter); + ScopedCurrentTest scopedResults(testResults); + CHECK_THROW_DESCRIBED(ThrowInt(), float, "description"); + failure = (testResults.GetFailureCount() > 0); + } + + CHECK(failure); +} + +TEST(CheckThrowDescribedFailureContainsCorrectDetails) +{ + int line = 0; + RecordingReporter reporter; + { + UnitTest::TestResults testResults(&reporter); + UnitTest::TestDetails const testDetails("testName", "suiteName", "filename", -1); + ScopedCurrentTest scopedResults(testResults, &testDetails); + + CHECK_THROW_DESCRIBED(ThrowInt(), float, "description " << hex << 0x1234); line = __LINE__; + } + + CHECK_EQUAL("testName", reporter.lastFailedTest); + CHECK_EQUAL("suiteName", reporter.lastFailedSuite); + CHECK_EQUAL("filename", reporter.lastFailedFile); + CHECK_EQUAL("description 1234", reporter.lastFailedMessage); + CHECK_EQUAL(line, reporter.lastFailedLine); +} + +TEST(CheckThrowDescribedDoesNotHaveSideEffectsWhenPassing) +{ + g_sideEffect = 0; + { + UnitTest::TestResults testResults; + ScopedCurrentTest scopedResults(testResults); + CHECK_THROW_DESCRIBED(ThrowIntWithSideEffect(), int, "description"); + } + CHECK_EQUAL(1, g_sideEffect); +} + +TEST(CheckThrowDescribedDoesNotHaveSideEffectsWhenFailing) +{ + g_sideEffect = 0; + { + UnitTest::TestResults testResults; + ScopedCurrentTest scopedResults(testResults); + CHECK_THROW_DESCRIBED(ThrowIntWithSideEffect(), float, "description"); + } + CHECK_EQUAL(1, g_sideEffect); +} + void Assert() { UnitTest::ReportAssert("description", "filename", __LINE__); diff --git a/tests/TestUnitTestPP.cpp b/tests/TestUnitTestPP.cpp index c173697..8fbc298 100644 --- a/tests/TestUnitTestPP.cpp +++ b/tests/TestUnitTestPP.cpp @@ -109,6 +109,12 @@ TEST(CheckThrowMacroSucceedsOnCorrectException) CHECK_THROW(throw TestException(), TestException); } +TEST(CanUseCheckThrowDescribedToGetCustomFailureMessage) +{ + struct TestException {}; + CHECK_THROW_DESCRIBED(throw TestException(), TestException, "This should really throw a TestException"); +} + TEST(CheckAssertSucceeds) { CHECK_ASSERT(UnitTest::ReportAssert("desc", "file", 0));