Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
yangql
googletest
Commits
36865d8d
Commit
36865d8d
authored
Sep 12, 2008
by
shiqian
Browse files
Adds exception assertions. By balaz.dan@gmail.com.
parent
0bbdb14f
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
268 additions
and
0 deletions
+268
-0
include/gtest/gtest.h
include/gtest/gtest.h
+22
-0
include/gtest/internal/gtest-internal.h
include/gtest/internal/gtest-internal.h
+61
-0
test/gtest_unittest.cc
test/gtest_unittest.cc
+185
-0
No files found.
include/gtest/gtest.h
View file @
36865d8d
...
@@ -928,6 +928,28 @@ class AssertHelper {
...
@@ -928,6 +928,28 @@ class AssertHelper {
// Generates a success with a generic message.
// Generates a success with a generic message.
#define SUCCEED() GTEST_SUCCESS("Succeeded")
#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.
// Boolean assertions.
#define EXPECT_TRUE(condition) \
#define EXPECT_TRUE(condition) \
GTEST_TEST_BOOLEAN(condition, #condition, false, true, \
GTEST_TEST_BOOLEAN(condition, #condition, false, true, \
...
...
include/gtest/internal/gtest-internal.h
View file @
36865d8d
...
@@ -717,6 +717,67 @@ class TypeParameterizedTestCase<Fixture, Templates0, Types> {
...
@@ -717,6 +717,67 @@ class TypeParameterizedTestCase<Fixture, Templates0, Types> {
#define GTEST_SUCCESS(message) \
#define GTEST_SUCCESS(message) \
GTEST_MESSAGE(message, ::testing::TPRT_SUCCESS)
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) \
#define GTEST_TEST_BOOLEAN(boolexpr, booltext, actual, expected, fail) \
GTEST_AMBIGUOUS_ELSE_BLOCKER \
GTEST_AMBIGUOUS_ELSE_BLOCKER \
if (boolexpr) \
if (boolexpr) \
...
...
test/gtest_unittest.cc
View file @
36865d8d
...
@@ -2314,6 +2314,56 @@ TEST_F(SingleEvaluationTest, OtherCases) {
...
@@ -2314,6 +2314,56 @@ TEST_F(SingleEvaluationTest, OtherCases) {
EXPECT_EQ
(
3
,
b_
);
EXPECT_EQ
(
3
,
b_
);
}
}
#if GTEST_HAS_EXCEPTIONS
void
ThrowAnInteger
()
{
throw
1
;
}
// Tests that assertion arguments are evaluated exactly once.
TEST_F
(
SingleEvaluationTest
,
ExceptionTests
)
{
// successful EXPECT_THROW
EXPECT_THROW
({
// NOLINT
a_
++
;
ThrowAnInteger
();
},
int
);
EXPECT_EQ
(
1
,
a_
);
// failed EXPECT_THROW, throws different
EXPECT_NONFATAL_FAILURE
(
EXPECT_THROW
({
// NOLINT
a_
++
;
ThrowAnInteger
();
},
bool
),
"throws a different type"
);
EXPECT_EQ
(
2
,
a_
);
// failed EXPECT_THROW, throws nothing
EXPECT_NONFATAL_FAILURE
(
EXPECT_THROW
(
a_
++
,
bool
),
"throws nothing"
);
EXPECT_EQ
(
3
,
a_
);
// successful EXPECT_NO_THROW
EXPECT_NO_THROW
(
a_
++
);
EXPECT_EQ
(
4
,
a_
);
// failed EXPECT_NO_THROW
EXPECT_NONFATAL_FAILURE
(
EXPECT_NO_THROW
({
// NOLINT
a_
++
;
ThrowAnInteger
();
}),
"it throws"
);
EXPECT_EQ
(
5
,
a_
);
// successful EXPECT_ANY_THROW
EXPECT_ANY_THROW
({
// NOLINT
a_
++
;
ThrowAnInteger
();
});
EXPECT_EQ
(
6
,
a_
);
// failed EXPECT_ANY_THROW
EXPECT_NONFATAL_FAILURE
(
EXPECT_ANY_THROW
(
a_
++
),
"it doesn't"
);
EXPECT_EQ
(
7
,
a_
);
}
#endif // GTEST_HAS_EXCEPTIONS
// Tests non-string assertions.
// Tests non-string assertions.
...
@@ -2487,6 +2537,37 @@ TEST(AssertionTest, ASSERT_GT) {
...
@@ -2487,6 +2537,37 @@ TEST(AssertionTest, ASSERT_GT) {
"Expected: (2) > (2), actual: 2 vs 2"
);
"Expected: (2) > (2), actual: 2 vs 2"
);
}
}
#if GTEST_HAS_EXCEPTIONS
// Tests ASSERT_THROW.
TEST
(
AssertionTest
,
ASSERT_THROW
)
{
ASSERT_THROW
(
ThrowAnInteger
(),
int
);
EXPECT_FATAL_FAILURE
(
ASSERT_THROW
(
ThrowAnInteger
(),
bool
),
"Expected: ThrowAnInteger() throws an exception of type"
\
" bool.
\n
Actual: it throws a different type."
);
EXPECT_FATAL_FAILURE
(
ASSERT_THROW
(
1
,
bool
),
"Expected: 1 throws an exception of type bool.
\n
"
\
" Actual: it throws nothing."
);
}
// Tests ASSERT_NO_THROW.
TEST
(
AssertionTest
,
ASSERT_NO_THROW
)
{
ASSERT_NO_THROW
(
1
);
EXPECT_FATAL_FAILURE
(
ASSERT_NO_THROW
(
ThrowAnInteger
()),
"Expected: ThrowAnInteger() doesn't throw an exception."
\
"
\n
Actual: it throws."
);
}
// Tests ASSERT_ANY_THROW.
TEST
(
AssertionTest
,
ASSERT_ANY_THROW
)
{
ASSERT_ANY_THROW
(
ThrowAnInteger
());
EXPECT_FATAL_FAILURE
(
ASSERT_ANY_THROW
(
1
),
"Expected: 1 throws an exception.
\n
Actual: it "
\
"doesn't."
);
}
#endif // GTEST_HAS_EXCEPTIONS
// Makes sure we deal with the precedence of <<. This test should
// Makes sure we deal with the precedence of <<. This test should
// compile.
// compile.
TEST
(
AssertionTest
,
AssertPrecedence
)
{
TEST
(
AssertionTest
,
AssertPrecedence
)
{
...
@@ -2764,6 +2845,32 @@ TEST(AssertionSyntaxTest, BehavesLikeSingleStatement) {
...
@@ -2764,6 +2845,32 @@ TEST(AssertionSyntaxTest, BehavesLikeSingleStatement) {
;
;
else
else
EXPECT_GT
(
3
,
2
)
<<
""
;
EXPECT_GT
(
3
,
2
)
<<
""
;
#if GTEST_HAS_EXCEPTIONS
if
(
false
)
EXPECT_THROW
(
1
,
bool
);
if
(
true
)
EXPECT_THROW
(
ThrowAnInteger
(),
int
);
else
;
if
(
false
)
EXPECT_NO_THROW
(
ThrowAnInteger
());
if
(
true
)
EXPECT_NO_THROW
(
1
);
else
;
if
(
false
)
EXPECT_ANY_THROW
(
1
);
if
(
true
)
EXPECT_ANY_THROW
(
ThrowAnInteger
());
else
;
#endif // GTEST_HAS_EXCEPTIONS
}
}
// Tests that the assertion macros work well with switch statements.
// Tests that the assertion macros work well with switch statements.
...
@@ -2792,6 +2899,22 @@ TEST(AssertionSyntaxTest, WorksWithSwitch) {
...
@@ -2792,6 +2899,22 @@ TEST(AssertionSyntaxTest, WorksWithSwitch) {
EXPECT_NE
(
1
,
2
);
EXPECT_NE
(
1
,
2
);
}
}
#if GTEST_HAS_EXCEPTIONS
void
ThrowAString
()
{
throw
"String"
;
}
// Test that the exception assertion macros compile and work with const
// type qualifier.
TEST
(
AssertionSyntaxTest
,
WorksWithConst
)
{
ASSERT_THROW
(
ThrowAString
(),
const
char
*
);
EXPECT_THROW
(
ThrowAString
(),
const
char
*
);
}
#endif // GTEST_HAS_EXCEPTIONS
}
// namespace
}
// namespace
// Returns the number of successful parts in the current test.
// Returns the number of successful parts in the current test.
...
@@ -2971,6 +3094,37 @@ TEST(ExpectTest, EXPECT_GT) {
...
@@ -2971,6 +3094,37 @@ TEST(ExpectTest, EXPECT_GT) {
"(2) > (3)"
);
"(2) > (3)"
);
}
}
#if GTEST_HAS_EXCEPTIONS
// Tests EXPECT_THROW.
TEST
(
ExpectTest
,
EXPECT_THROW
)
{
EXPECT_THROW
(
ThrowAnInteger
(),
int
);
EXPECT_NONFATAL_FAILURE
(
EXPECT_THROW
(
ThrowAnInteger
(),
bool
),
"Expected: ThrowAnInteger() throws an exception of "
\
"type bool.
\n
Actual: it throws a different type."
);
EXPECT_NONFATAL_FAILURE
(
EXPECT_THROW
(
1
,
bool
),
"Expected: 1 throws an exception of type bool.
\n
"
\
" Actual: it throws nothing."
);
}
// Tests EXPECT_NO_THROW.
TEST
(
ExpectTest
,
EXPECT_NO_THROW
)
{
EXPECT_NO_THROW
(
1
);
EXPECT_NONFATAL_FAILURE
(
EXPECT_NO_THROW
(
ThrowAnInteger
()),
"Expected: ThrowAnInteger() doesn't throw an "
\
"exception.
\n
Actual: it throws."
);
}
// Tests EXPECT_ANY_THROW.
TEST
(
ExpectTest
,
EXPECT_ANY_THROW
)
{
EXPECT_ANY_THROW
(
ThrowAnInteger
());
EXPECT_NONFATAL_FAILURE
(
EXPECT_ANY_THROW
(
1
),
"Expected: 1 throws an exception.
\n
Actual: it "
\
"doesn't."
);
}
#endif // GTEST_HAS_EXCEPTIONS
// Make sure we deal with the precedence of <<.
// Make sure we deal with the precedence of <<.
TEST
(
ExpectTest
,
ExpectPrecedence
)
{
TEST
(
ExpectTest
,
ExpectPrecedence
)
{
EXPECT_EQ
(
1
<
2
,
true
);
EXPECT_EQ
(
1
<
2
,
true
);
...
@@ -4477,6 +4631,37 @@ TEST(StreamingAssertionsTest, FloatingPointEquals) {
...
@@ -4477,6 +4631,37 @@ TEST(StreamingAssertionsTest, FloatingPointEquals) {
"expected failure"
);
"expected failure"
);
}
}
#if GTEST_HAS_EXCEPTIONS
TEST
(
StreamingAssertionsTest
,
Throw
)
{
EXPECT_THROW
(
ThrowAnInteger
(),
int
)
<<
"unexpected failure"
;
ASSERT_THROW
(
ThrowAnInteger
(),
int
)
<<
"unexpected failure"
;
EXPECT_NONFATAL_FAILURE
(
EXPECT_THROW
(
ThrowAnInteger
(),
bool
)
<<
"expected failure"
,
"expected failure"
);
EXPECT_FATAL_FAILURE
(
ASSERT_THROW
(
ThrowAnInteger
(),
bool
)
<<
"expected failure"
,
"expected failure"
);
}
TEST
(
StreamingAssertionsTest
,
NoThrow
)
{
EXPECT_NO_THROW
(
1
)
<<
"unexpected failure"
;
ASSERT_NO_THROW
(
1
)
<<
"unexpected failure"
;
EXPECT_NONFATAL_FAILURE
(
EXPECT_NO_THROW
(
ThrowAnInteger
())
<<
"expected failure"
,
"expected failure"
);
EXPECT_FATAL_FAILURE
(
ASSERT_NO_THROW
(
ThrowAnInteger
())
<<
"expected failure"
,
"expected failure"
);
}
TEST
(
StreamingAssertionsTest
,
AnyThrow
)
{
EXPECT_ANY_THROW
(
ThrowAnInteger
())
<<
"unexpected failure"
;
ASSERT_ANY_THROW
(
ThrowAnInteger
())
<<
"unexpected failure"
;
EXPECT_NONFATAL_FAILURE
(
EXPECT_ANY_THROW
(
1
)
<<
"expected failure"
,
"expected failure"
);
EXPECT_FATAL_FAILURE
(
ASSERT_ANY_THROW
(
1
)
<<
"expected failure"
,
"expected failure"
);
}
#endif // GTEST_HAS_EXCEPTIONS
// Tests that Google Test correctly decides whether to use colors in the output.
// Tests that Google Test correctly decides whether to use colors in the output.
TEST
(
ColoredOutputTest
,
UsesColorsWhenGTestColorFlagIsYes
)
{
TEST
(
ColoredOutputTest
,
UsesColorsWhenGTestColorFlagIsYes
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment