diff options
author | zhanyong.wan <zhanyong.wan@8415998a-534a-0410-bf83-d39667b30386> | 2013-02-28 22:58:51 +0000 |
---|---|---|
committer | zhanyong.wan <zhanyong.wan@8415998a-534a-0410-bf83-d39667b30386> | 2013-02-28 22:58:51 +0000 |
commit | edd4ab4945aeacdf9bd5ec3ac1654b940ca72532 (patch) | |
tree | 2f79533f5eeeb885491b8b4b707d44096e934f7c /test/gmock-spec-builders_test.cc | |
parent | cf40604cf087eb2a616f104fac587bd889b24e5d (diff) | |
download | googletest-edd4ab4945aeacdf9bd5ec3ac1654b940ca72532.tar.gz googletest-edd4ab4945aeacdf9bd5ec3ac1654b940ca72532.tar.bz2 googletest-edd4ab4945aeacdf9bd5ec3ac1654b940ca72532.zip |
Makes googlemock throw a runtime_error instead of abort when a mock
method with no default value is invoked (if exceptions are enabled).
Diffstat (limited to 'test/gmock-spec-builders_test.cc')
-rw-r--r-- | test/gmock-spec-builders_test.cc | 265 |
1 files changed, 173 insertions, 92 deletions
diff --git a/test/gmock-spec-builders_test.cc b/test/gmock-spec-builders_test.cc index 0e2e0090..8a8632dc 100644 --- a/test/gmock-spec-builders_test.cc +++ b/test/gmock-spec-builders_test.cc @@ -1111,7 +1111,11 @@ TEST(UndefinedReturnValueTest, ReturnValueIsMandatory) { // TODO(wan@google.com): We should really verify the output message, // but we cannot yet due to that EXPECT_DEATH only captures stderr // while Google Mock logs to stdout. +#if GTEST_HAS_EXCEPTIONS + EXPECT_ANY_THROW(a.ReturnResult(1)); +#else EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(1), ""); +#endif } // Tests that an excessive call (one whose arguments match the @@ -1260,87 +1264,116 @@ TEST(SequenceTest, AnyOrderIsOkByDefault) { // Tests that the calls must be in strict order when a complete order // is specified. -TEST(SequenceTest, CallsMustBeInStrictOrderWhenSaidSo) { +TEST(SequenceTest, CallsMustBeInStrictOrderWhenSaidSo1) { MockA a; - Sequence s; + ON_CALL(a, ReturnResult(_)) + .WillByDefault(Return(Result())); + Sequence s; EXPECT_CALL(a, ReturnResult(1)) - .InSequence(s) - .WillOnce(Return(Result())); - + .InSequence(s); EXPECT_CALL(a, ReturnResult(2)) - .InSequence(s) - .WillOnce(Return(Result())); - + .InSequence(s); EXPECT_CALL(a, ReturnResult(3)) - .InSequence(s) - .WillOnce(Return(Result())); + .InSequence(s); - EXPECT_DEATH_IF_SUPPORTED({ - a.ReturnResult(1); - a.ReturnResult(3); - a.ReturnResult(2); - }, ""); + a.ReturnResult(1); - EXPECT_DEATH_IF_SUPPORTED({ - a.ReturnResult(2); - a.ReturnResult(1); - a.ReturnResult(3); - }, ""); + // May only be called after a.ReturnResult(2). + EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), "Unexpected mock function call"); - a.ReturnResult(1); a.ReturnResult(2); a.ReturnResult(3); } -// Tests specifying a DAG using multiple sequences. -TEST(SequenceTest, CallsMustConformToSpecifiedDag) { +// Tests that the calls must be in strict order when a complete order +// is specified. +TEST(SequenceTest, CallsMustBeInStrictOrderWhenSaidSo2) { MockA a; - MockB b; - Sequence x, y; + ON_CALL(a, ReturnResult(_)) + .WillByDefault(Return(Result())); + Sequence s; EXPECT_CALL(a, ReturnResult(1)) - .InSequence(x) - .WillOnce(Return(Result())); + .InSequence(s); + EXPECT_CALL(a, ReturnResult(2)) + .InSequence(s); - EXPECT_CALL(b, DoB()) - .Times(2) - .InSequence(y); + // May only be called after a.ReturnResult(1). + EXPECT_NONFATAL_FAILURE(a.ReturnResult(2), "Unexpected mock function call"); - EXPECT_CALL(a, ReturnResult(2)) - .InSequence(x, y) - .WillRepeatedly(Return(Result())); + a.ReturnResult(1); + a.ReturnResult(2); +} - EXPECT_CALL(a, ReturnResult(3)) - .InSequence(x) - .WillOnce(Return(Result())); +// Tests specifying a DAG using multiple sequences. +class PartialOrderTest : public testing::Test { + protected: + PartialOrderTest() { + ON_CALL(a_, ReturnResult(_)) + .WillByDefault(Return(Result())); - EXPECT_DEATH_IF_SUPPORTED({ - a.ReturnResult(1); - b.DoB(); - a.ReturnResult(2); - }, ""); + // Specifies this partial ordering: + // + // a.ReturnResult(1) ==> + // a.ReturnResult(2) * n ==> a.ReturnResult(3) + // b.DoB() * 2 ==> + Sequence x, y; + EXPECT_CALL(a_, ReturnResult(1)) + .InSequence(x); + EXPECT_CALL(b_, DoB()) + .Times(2) + .InSequence(y); + EXPECT_CALL(a_, ReturnResult(2)) + .Times(AnyNumber()) + .InSequence(x, y); + EXPECT_CALL(a_, ReturnResult(3)) + .InSequence(x); + } - EXPECT_DEATH_IF_SUPPORTED({ - a.ReturnResult(2); - }, ""); + MockA a_; + MockB b_; +}; - EXPECT_DEATH_IF_SUPPORTED({ - a.ReturnResult(3); - }, ""); +TEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag1) { + a_.ReturnResult(1); + b_.DoB(); - EXPECT_DEATH_IF_SUPPORTED({ - a.ReturnResult(1); - b.DoB(); - b.DoB(); - a.ReturnResult(3); - a.ReturnResult(2); - }, ""); + // May only be called after the second DoB(). + EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), "Unexpected mock function call"); - b.DoB(); - a.ReturnResult(1); - b.DoB(); - a.ReturnResult(3); + b_.DoB(); + a_.ReturnResult(3); +} + +TEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag2) { + // May only be called after ReturnResult(1). + EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), "Unexpected mock function call"); + + a_.ReturnResult(1); + b_.DoB(); + b_.DoB(); + a_.ReturnResult(3); +} + +TEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag3) { + // May only be called last. + EXPECT_NONFATAL_FAILURE(a_.ReturnResult(3), "Unexpected mock function call"); + + a_.ReturnResult(1); + b_.DoB(); + b_.DoB(); + a_.ReturnResult(3); +} + +TEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag4) { + a_.ReturnResult(1); + b_.DoB(); + b_.DoB(); + a_.ReturnResult(3); + + // May only be called before ReturnResult(3). + EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), "Unexpected mock function call"); } TEST(SequenceTest, Retirement) { @@ -1530,71 +1563,112 @@ TEST(AfterTest, SucceedsWhenTotalOrderIsSatisfied) { a.DoA(2); } -// Calls must be in strict order when specified so. -TEST(AfterDeathTest, CallsMustBeInStrictOrderWhenSpecifiedSo) { +// Calls must be in strict order when specified so using .After(). +TEST(AfterTest, CallsMustBeInStrictOrderWhenSpecifiedSo1) { MockA a; MockB b; + + // Define ordering: + // a.DoA(1) ==> b.DoB() ==> a.DoA(2) Expectation e1 = EXPECT_CALL(a, DoA(1)); Expectation e2 = EXPECT_CALL(b, DoB()) - .Times(2) .After(e1); - EXPECT_CALL(a, ReturnResult(2)) - .After(e2) - .WillOnce(Return(Result())); + EXPECT_CALL(a, DoA(2)) + .After(e2); a.DoA(1); - // If a call to ReturnResult() violates the specified order, no - // matching expectation will be found, and thus the default action - // will be done. Since the return type of ReturnResult() is not a - // built-in type, gmock won't know what to return and will thus - // abort the program. Therefore a death test can tell us whether - // gmock catches the order violation correctly. - // - // gtest and gmock print messages to stdout, which isn't captured by - // death tests. Therefore we have to match with an empty regular - // expression in all the EXPECT_DEATH()s. - EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(2), ""); + + // May only be called after DoB(). + EXPECT_NONFATAL_FAILURE(a.DoA(2), "Unexpected mock function call"); b.DoB(); - EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(2), ""); + a.DoA(2); +} + +// Calls must be in strict order when specified so using .After(). +TEST(AfterTest, CallsMustBeInStrictOrderWhenSpecifiedSo2) { + MockA a; + MockB b; + + // Define ordering: + // a.DoA(1) ==> b.DoB() * 2 ==> a.DoA(2) + Expectation e1 = EXPECT_CALL(a, DoA(1)); + Expectation e2 = EXPECT_CALL(b, DoB()) + .Times(2) + .After(e1); + EXPECT_CALL(a, DoA(2)) + .After(e2); + a.DoA(1); b.DoB(); - a.ReturnResult(2); + + // May only be called after the second DoB(). + EXPECT_NONFATAL_FAILURE(a.DoA(2), "Unexpected mock function call"); + + b.DoB(); + a.DoA(2); } // Calls must satisfy the partial order when specified so. -TEST(AfterDeathTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo) { +TEST(AfterTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo) { MockA a; + ON_CALL(a, ReturnResult(_)) + .WillByDefault(Return(Result())); + + // Define ordering: + // a.DoA(1) ==> + // a.DoA(2) ==> a.ReturnResult(3) Expectation e = EXPECT_CALL(a, DoA(1)); const ExpectationSet es = EXPECT_CALL(a, DoA(2)); EXPECT_CALL(a, ReturnResult(3)) - .After(e, es) - .WillOnce(Return(Result())); + .After(e, es); - EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(3), ""); + // May only be called last. + EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), "Unexpected mock function call"); a.DoA(2); - EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(3), ""); - a.DoA(1); a.ReturnResult(3); } +// Calls must satisfy the partial order when specified so. +TEST(AfterTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo2) { + MockA a; + + // Define ordering: + // a.DoA(1) ==> + // a.DoA(2) ==> a.DoA(3) + Expectation e = EXPECT_CALL(a, DoA(1)); + const ExpectationSet es = EXPECT_CALL(a, DoA(2)); + EXPECT_CALL(a, DoA(3)) + .After(e, es); + + a.DoA(2); + + // May only be called last. + EXPECT_NONFATAL_FAILURE(a.DoA(3), "Unexpected mock function call"); + + a.DoA(1); + a.DoA(3); +} + // .After() can be combined with .InSequence(). -TEST(AfterDeathTest, CanBeUsedWithInSequence) { +TEST(AfterTest, CanBeUsedWithInSequence) { MockA a; Sequence s; Expectation e = EXPECT_CALL(a, DoA(1)); EXPECT_CALL(a, DoA(2)).InSequence(s); - EXPECT_CALL(a, ReturnResult(3)) - .InSequence(s).After(e) - .WillOnce(Return(Result())); + EXPECT_CALL(a, DoA(3)) + .InSequence(s) + .After(e); a.DoA(1); - EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(3), ""); + + // May only be after DoA(2). + EXPECT_NONFATAL_FAILURE(a.DoA(3), "Unexpected mock function call"); a.DoA(2); - a.ReturnResult(3); + a.DoA(3); } // .After() can be called multiple times. @@ -1636,17 +1710,24 @@ TEST(AfterTest, AcceptsUpToFiveArguments) { // .After() allows input to contain duplicated Expectations. TEST(AfterTest, AcceptsDuplicatedInput) { MockA a; + ON_CALL(a, ReturnResult(_)) + .WillByDefault(Return(Result())); + + // Define ordering: + // DoA(1) ==> + // DoA(2) ==> ReturnResult(3) Expectation e1 = EXPECT_CALL(a, DoA(1)); Expectation e2 = EXPECT_CALL(a, DoA(2)); ExpectationSet es; es += e1; es += e2; EXPECT_CALL(a, ReturnResult(3)) - .After(e1, e2, es, e1) - .WillOnce(Return(Result())); + .After(e1, e2, es, e1); a.DoA(1); - EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(3), ""); + + // May only be after DoA(2). + EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), "Unexpected mock function call"); a.DoA(2); a.ReturnResult(3); |