Adds exception assertions. By balaz.dan@gmail.com.
This commit is contained in:
@@ -928,6 +928,28 @@ class AssertHelper {
|
||||
// Generates a success with a generic message.
|
||||
#define SUCCEED() GTEST_SUCCESS("Succeeded")
|
||||
|
||||
// Macros for testing exceptions.
|
||||
//
|
||||
// * {ASSERT|EXPECT}_THROW(statement, expected_exception):
|
||||
// Tests that the statement throws the expected exception.
|
||||
// * {ASSERT|EXPECT}_NO_THROW(statement):
|
||||
// Tests that the statement doesn't throw any exception.
|
||||
// * {ASSERT|EXPECT}_ANY_THROW(statement):
|
||||
// Tests that the statement throws an exception.
|
||||
|
||||
#define EXPECT_THROW(statement, expected_exception) \
|
||||
GTEST_TEST_THROW(statement, expected_exception, GTEST_NONFATAL_FAILURE)
|
||||
#define EXPECT_NO_THROW(statement) \
|
||||
GTEST_TEST_NO_THROW(statement, GTEST_NONFATAL_FAILURE)
|
||||
#define EXPECT_ANY_THROW(statement) \
|
||||
GTEST_TEST_ANY_THROW(statement, GTEST_NONFATAL_FAILURE)
|
||||
#define ASSERT_THROW(statement, expected_exception) \
|
||||
GTEST_TEST_THROW(statement, expected_exception, GTEST_FATAL_FAILURE)
|
||||
#define ASSERT_NO_THROW(statement) \
|
||||
GTEST_TEST_NO_THROW(statement, GTEST_FATAL_FAILURE)
|
||||
#define ASSERT_ANY_THROW(statement) \
|
||||
GTEST_TEST_ANY_THROW(statement, GTEST_FATAL_FAILURE)
|
||||
|
||||
// Boolean assertions.
|
||||
#define EXPECT_TRUE(condition) \
|
||||
GTEST_TEST_BOOLEAN(condition, #condition, false, true, \
|
||||
|
||||
@@ -717,6 +717,67 @@ class TypeParameterizedTestCase<Fixture, Templates0, Types> {
|
||||
#define GTEST_SUCCESS(message) \
|
||||
GTEST_MESSAGE(message, ::testing::TPRT_SUCCESS)
|
||||
|
||||
|
||||
#define GTEST_TEST_THROW(statement, expected_exception, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER \
|
||||
if (const char* gtest_msg = "") { \
|
||||
bool gtest_caught_expected = false; \
|
||||
try { \
|
||||
statement; \
|
||||
} \
|
||||
catch (expected_exception const&) { \
|
||||
gtest_caught_expected = true; \
|
||||
} \
|
||||
catch (...) { \
|
||||
gtest_msg = "Expected: " #statement " throws an exception of type " \
|
||||
#expected_exception ".\n Actual: it throws a different " \
|
||||
"type."; \
|
||||
goto GTEST_CONCAT_TOKEN(gtest_label_testthrow_, __LINE__); \
|
||||
} \
|
||||
if (!gtest_caught_expected) { \
|
||||
gtest_msg = "Expected: " #statement " throws an exception of type " \
|
||||
#expected_exception ".\n Actual: it throws nothing."; \
|
||||
goto GTEST_CONCAT_TOKEN(gtest_label_testthrow_, __LINE__); \
|
||||
} \
|
||||
} else \
|
||||
GTEST_CONCAT_TOKEN(gtest_label_testthrow_, __LINE__): \
|
||||
fail(gtest_msg)
|
||||
|
||||
#define GTEST_TEST_NO_THROW(statement, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER \
|
||||
if (const char* gtest_msg = "") { \
|
||||
try { \
|
||||
statement; \
|
||||
} \
|
||||
catch (...) { \
|
||||
gtest_msg = "Expected: " #statement " doesn't throw an exception.\n" \
|
||||
" Actual: it throws."; \
|
||||
goto GTEST_CONCAT_TOKEN(gtest_label_testnothrow_, __LINE__); \
|
||||
} \
|
||||
} else \
|
||||
GTEST_CONCAT_TOKEN(gtest_label_testnothrow_, __LINE__): \
|
||||
fail(gtest_msg)
|
||||
|
||||
#define GTEST_TEST_ANY_THROW(statement, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER \
|
||||
if (const char* gtest_msg = "") { \
|
||||
bool gtest_caught_any = false; \
|
||||
try { \
|
||||
statement; \
|
||||
} \
|
||||
catch (...) { \
|
||||
gtest_caught_any = true; \
|
||||
} \
|
||||
if (!gtest_caught_any) { \
|
||||
gtest_msg = "Expected: " #statement " throws an exception.\n" \
|
||||
" Actual: it doesn't."; \
|
||||
goto GTEST_CONCAT_TOKEN(gtest_label_testanythrow_, __LINE__); \
|
||||
} \
|
||||
} else \
|
||||
GTEST_CONCAT_TOKEN(gtest_label_testanythrow_, __LINE__): \
|
||||
fail(gtest_msg)
|
||||
|
||||
|
||||
#define GTEST_TEST_BOOLEAN(boolexpr, booltext, actual, expected, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER \
|
||||
if (boolexpr) \
|
||||
|
||||
Reference in New Issue
Block a user