123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775 |
- // Copyright 2007, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- // Google Mock - a framework for writing C++ mock classes.
- //
- // This file tests the spec builder syntax.
- #include "gmock/gmock-spec-builders.h"
- #include <memory>
- #include <ostream> // NOLINT
- #include <sstream>
- #include <string>
- #include "gmock/gmock.h"
- #include "gmock/internal/gmock-port.h"
- #include "gtest/gtest.h"
- #include "gtest/gtest-spi.h"
- #include "gtest/internal/gtest-port.h"
- namespace testing {
- namespace internal {
- // Helper class for testing the Expectation class template.
- class ExpectationTester {
- public:
- // Sets the call count of the given expectation to the given number.
- void SetCallCount(int n, ExpectationBase* exp) {
- exp->call_count_ = n;
- }
- };
- } // namespace internal
- } // namespace testing
- namespace {
- using testing::_;
- using testing::AnyNumber;
- using testing::AtLeast;
- using testing::AtMost;
- using testing::Between;
- using testing::Cardinality;
- using testing::CardinalityInterface;
- using testing::Const;
- using testing::ContainsRegex;
- using testing::DoAll;
- using testing::DoDefault;
- using testing::Eq;
- using testing::Expectation;
- using testing::ExpectationSet;
- using testing::GMOCK_FLAG(verbose);
- using testing::Gt;
- using testing::IgnoreResult;
- using testing::InSequence;
- using testing::Invoke;
- using testing::InvokeWithoutArgs;
- using testing::IsNotSubstring;
- using testing::IsSubstring;
- using testing::Lt;
- using testing::Message;
- using testing::Mock;
- using testing::NaggyMock;
- using testing::Ne;
- using testing::Return;
- using testing::SaveArg;
- using testing::Sequence;
- using testing::SetArgPointee;
- using testing::internal::ExpectationTester;
- using testing::internal::FormatFileLocation;
- using testing::internal::kAllow;
- using testing::internal::kErrorVerbosity;
- using testing::internal::kFail;
- using testing::internal::kInfoVerbosity;
- using testing::internal::kWarn;
- using testing::internal::kWarningVerbosity;
- #if GTEST_HAS_STREAM_REDIRECTION
- using testing::HasSubstr;
- using testing::internal::CaptureStdout;
- using testing::internal::GetCapturedStdout;
- #endif
- class Incomplete;
- class MockIncomplete {
- public:
- // This line verifies that a mock method can take a by-reference
- // argument of an incomplete type.
- MOCK_METHOD1(ByRefFunc, void(const Incomplete& x));
- };
- // Tells Google Mock how to print a value of type Incomplete.
- void PrintTo(const Incomplete& x, ::std::ostream* os);
- TEST(MockMethodTest, CanInstantiateWithIncompleteArgType) {
- // Even though this mock class contains a mock method that takes
- // by-reference an argument whose type is incomplete, we can still
- // use the mock, as long as Google Mock knows how to print the
- // argument.
- MockIncomplete incomplete;
- EXPECT_CALL(incomplete, ByRefFunc(_))
- .Times(AnyNumber());
- }
- // The definition of the printer for the argument type doesn't have to
- // be visible where the mock is used.
- void PrintTo(const Incomplete& /* x */, ::std::ostream* os) {
- *os << "incomplete";
- }
- class Result {};
- // A type that's not default constructible.
- class NonDefaultConstructible {
- public:
- explicit NonDefaultConstructible(int /* dummy */) {}
- };
- class MockA {
- public:
- MockA() {}
- MOCK_METHOD1(DoA, void(int n));
- MOCK_METHOD1(ReturnResult, Result(int n));
- MOCK_METHOD0(ReturnNonDefaultConstructible, NonDefaultConstructible());
- MOCK_METHOD2(Binary, bool(int x, int y));
- MOCK_METHOD2(ReturnInt, int(int x, int y));
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockA);
- };
- class MockB {
- public:
- MockB() {}
- MOCK_CONST_METHOD0(DoB, int()); // NOLINT
- MOCK_METHOD1(DoB, int(int n)); // NOLINT
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockB);
- };
- class ReferenceHoldingMock {
- public:
- ReferenceHoldingMock() {}
- MOCK_METHOD1(AcceptReference, void(std::shared_ptr<MockA>*));
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ReferenceHoldingMock);
- };
- // Tests that EXPECT_CALL and ON_CALL compile in a presence of macro
- // redefining a mock method name. This could happen, for example, when
- // the tested code #includes Win32 API headers which define many APIs
- // as macros, e.g. #define TextOut TextOutW.
- #define Method MethodW
- class CC {
- public:
- virtual ~CC() {}
- virtual int Method() = 0;
- };
- class MockCC : public CC {
- public:
- MockCC() {}
- MOCK_METHOD0(Method, int());
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockCC);
- };
- // Tests that a method with expanded name compiles.
- TEST(OnCallSyntaxTest, CompilesWithMethodNameExpandedFromMacro) {
- MockCC cc;
- ON_CALL(cc, Method());
- }
- // Tests that the method with expanded name not only compiles but runs
- // and returns a correct value, too.
- TEST(OnCallSyntaxTest, WorksWithMethodNameExpandedFromMacro) {
- MockCC cc;
- ON_CALL(cc, Method()).WillByDefault(Return(42));
- EXPECT_EQ(42, cc.Method());
- }
- // Tests that a method with expanded name compiles.
- TEST(ExpectCallSyntaxTest, CompilesWithMethodNameExpandedFromMacro) {
- MockCC cc;
- EXPECT_CALL(cc, Method());
- cc.Method();
- }
- // Tests that it works, too.
- TEST(ExpectCallSyntaxTest, WorksWithMethodNameExpandedFromMacro) {
- MockCC cc;
- EXPECT_CALL(cc, Method()).WillOnce(Return(42));
- EXPECT_EQ(42, cc.Method());
- }
- #undef Method // Done with macro redefinition tests.
- // Tests that ON_CALL evaluates its arguments exactly once as promised
- // by Google Mock.
- TEST(OnCallSyntaxTest, EvaluatesFirstArgumentOnce) {
- MockA a;
- MockA* pa = &a;
- ON_CALL(*pa++, DoA(_));
- EXPECT_EQ(&a + 1, pa);
- }
- TEST(OnCallSyntaxTest, EvaluatesSecondArgumentOnce) {
- MockA a;
- int n = 0;
- ON_CALL(a, DoA(n++));
- EXPECT_EQ(1, n);
- }
- // Tests that the syntax of ON_CALL() is enforced at run time.
- TEST(OnCallSyntaxTest, WithIsOptional) {
- MockA a;
- ON_CALL(a, DoA(5))
- .WillByDefault(Return());
- ON_CALL(a, DoA(_))
- .With(_)
- .WillByDefault(Return());
- }
- TEST(OnCallSyntaxTest, WithCanAppearAtMostOnce) {
- MockA a;
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- ON_CALL(a, ReturnResult(_))
- .With(_)
- .With(_)
- .WillByDefault(Return(Result()));
- }, ".With() cannot appear more than once in an ON_CALL()");
- }
- TEST(OnCallSyntaxTest, WillByDefaultIsMandatory) {
- MockA a;
- EXPECT_DEATH_IF_SUPPORTED({
- ON_CALL(a, DoA(5));
- a.DoA(5);
- }, "");
- }
- TEST(OnCallSyntaxTest, WillByDefaultCanAppearAtMostOnce) {
- MockA a;
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- ON_CALL(a, DoA(5))
- .WillByDefault(Return())
- .WillByDefault(Return());
- }, ".WillByDefault() must appear exactly once in an ON_CALL()");
- }
- // Tests that EXPECT_CALL evaluates its arguments exactly once as
- // promised by Google Mock.
- TEST(ExpectCallSyntaxTest, EvaluatesFirstArgumentOnce) {
- MockA a;
- MockA* pa = &a;
- EXPECT_CALL(*pa++, DoA(_));
- a.DoA(0);
- EXPECT_EQ(&a + 1, pa);
- }
- TEST(ExpectCallSyntaxTest, EvaluatesSecondArgumentOnce) {
- MockA a;
- int n = 0;
- EXPECT_CALL(a, DoA(n++));
- a.DoA(0);
- EXPECT_EQ(1, n);
- }
- // Tests that the syntax of EXPECT_CALL() is enforced at run time.
- TEST(ExpectCallSyntaxTest, WithIsOptional) {
- MockA a;
- EXPECT_CALL(a, DoA(5))
- .Times(0);
- EXPECT_CALL(a, DoA(6))
- .With(_)
- .Times(0);
- }
- TEST(ExpectCallSyntaxTest, WithCanAppearAtMostOnce) {
- MockA a;
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- EXPECT_CALL(a, DoA(6))
- .With(_)
- .With(_);
- }, ".With() cannot appear more than once in an EXPECT_CALL()");
- a.DoA(6);
- }
- TEST(ExpectCallSyntaxTest, WithMustBeFirstClause) {
- MockA a;
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- EXPECT_CALL(a, DoA(1))
- .Times(1)
- .With(_);
- }, ".With() must be the first clause in an EXPECT_CALL()");
- a.DoA(1);
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- EXPECT_CALL(a, DoA(2))
- .WillOnce(Return())
- .With(_);
- }, ".With() must be the first clause in an EXPECT_CALL()");
- a.DoA(2);
- }
- TEST(ExpectCallSyntaxTest, TimesCanBeInferred) {
- MockA a;
- EXPECT_CALL(a, DoA(1))
- .WillOnce(Return());
- EXPECT_CALL(a, DoA(2))
- .WillOnce(Return())
- .WillRepeatedly(Return());
- a.DoA(1);
- a.DoA(2);
- a.DoA(2);
- }
- TEST(ExpectCallSyntaxTest, TimesCanAppearAtMostOnce) {
- MockA a;
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- EXPECT_CALL(a, DoA(1))
- .Times(1)
- .Times(2);
- }, ".Times() cannot appear more than once in an EXPECT_CALL()");
- a.DoA(1);
- a.DoA(1);
- }
- TEST(ExpectCallSyntaxTest, TimesMustBeBeforeInSequence) {
- MockA a;
- Sequence s;
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- EXPECT_CALL(a, DoA(1))
- .InSequence(s)
- .Times(1);
- }, ".Times() cannot appear after ");
- a.DoA(1);
- }
- TEST(ExpectCallSyntaxTest, InSequenceIsOptional) {
- MockA a;
- Sequence s;
- EXPECT_CALL(a, DoA(1));
- EXPECT_CALL(a, DoA(2))
- .InSequence(s);
- a.DoA(1);
- a.DoA(2);
- }
- TEST(ExpectCallSyntaxTest, InSequenceCanAppearMultipleTimes) {
- MockA a;
- Sequence s1, s2;
- EXPECT_CALL(a, DoA(1))
- .InSequence(s1, s2)
- .InSequence(s1);
- a.DoA(1);
- }
- TEST(ExpectCallSyntaxTest, InSequenceMustBeBeforeAfter) {
- MockA a;
- Sequence s;
- Expectation e = EXPECT_CALL(a, DoA(1))
- .Times(AnyNumber());
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- EXPECT_CALL(a, DoA(2))
- .After(e)
- .InSequence(s);
- }, ".InSequence() cannot appear after ");
- a.DoA(2);
- }
- TEST(ExpectCallSyntaxTest, InSequenceMustBeBeforeWillOnce) {
- MockA a;
- Sequence s;
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- EXPECT_CALL(a, DoA(1))
- .WillOnce(Return())
- .InSequence(s);
- }, ".InSequence() cannot appear after ");
- a.DoA(1);
- }
- TEST(ExpectCallSyntaxTest, AfterMustBeBeforeWillOnce) {
- MockA a;
- Expectation e = EXPECT_CALL(a, DoA(1));
- EXPECT_NONFATAL_FAILURE({
- EXPECT_CALL(a, DoA(2))
- .WillOnce(Return())
- .After(e);
- }, ".After() cannot appear after ");
- a.DoA(1);
- a.DoA(2);
- }
- TEST(ExpectCallSyntaxTest, WillIsOptional) {
- MockA a;
- EXPECT_CALL(a, DoA(1));
- EXPECT_CALL(a, DoA(2))
- .WillOnce(Return());
- a.DoA(1);
- a.DoA(2);
- }
- TEST(ExpectCallSyntaxTest, WillCanAppearMultipleTimes) {
- MockA a;
- EXPECT_CALL(a, DoA(1))
- .Times(AnyNumber())
- .WillOnce(Return())
- .WillOnce(Return())
- .WillOnce(Return());
- }
- TEST(ExpectCallSyntaxTest, WillMustBeBeforeWillRepeatedly) {
- MockA a;
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- EXPECT_CALL(a, DoA(1))
- .WillRepeatedly(Return())
- .WillOnce(Return());
- }, ".WillOnce() cannot appear after ");
- a.DoA(1);
- }
- TEST(ExpectCallSyntaxTest, WillRepeatedlyIsOptional) {
- MockA a;
- EXPECT_CALL(a, DoA(1))
- .WillOnce(Return());
- EXPECT_CALL(a, DoA(2))
- .WillOnce(Return())
- .WillRepeatedly(Return());
- a.DoA(1);
- a.DoA(2);
- a.DoA(2);
- }
- TEST(ExpectCallSyntaxTest, WillRepeatedlyCannotAppearMultipleTimes) {
- MockA a;
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- EXPECT_CALL(a, DoA(1))
- .WillRepeatedly(Return())
- .WillRepeatedly(Return());
- }, ".WillRepeatedly() cannot appear more than once in an "
- "EXPECT_CALL()");
- }
- TEST(ExpectCallSyntaxTest, WillRepeatedlyMustBeBeforeRetiresOnSaturation) {
- MockA a;
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- EXPECT_CALL(a, DoA(1))
- .RetiresOnSaturation()
- .WillRepeatedly(Return());
- }, ".WillRepeatedly() cannot appear after ");
- }
- TEST(ExpectCallSyntaxTest, RetiresOnSaturationIsOptional) {
- MockA a;
- EXPECT_CALL(a, DoA(1));
- EXPECT_CALL(a, DoA(1))
- .RetiresOnSaturation();
- a.DoA(1);
- a.DoA(1);
- }
- TEST(ExpectCallSyntaxTest, RetiresOnSaturationCannotAppearMultipleTimes) {
- MockA a;
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- EXPECT_CALL(a, DoA(1))
- .RetiresOnSaturation()
- .RetiresOnSaturation();
- }, ".RetiresOnSaturation() cannot appear more than once");
- a.DoA(1);
- }
- TEST(ExpectCallSyntaxTest, DefaultCardinalityIsOnce) {
- {
- MockA a;
- EXPECT_CALL(a, DoA(1));
- a.DoA(1);
- }
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- MockA a;
- EXPECT_CALL(a, DoA(1));
- }, "to be called once");
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- MockA a;
- EXPECT_CALL(a, DoA(1));
- a.DoA(1);
- a.DoA(1);
- }, "to be called once");
- }
- #if GTEST_HAS_STREAM_REDIRECTION
- // Tests that Google Mock doesn't print a warning when the number of
- // WillOnce() is adequate.
- TEST(ExpectCallSyntaxTest, DoesNotWarnOnAdequateActionCount) {
- CaptureStdout();
- {
- MockB b;
- // It's always fine to omit WillOnce() entirely.
- EXPECT_CALL(b, DoB())
- .Times(0);
- EXPECT_CALL(b, DoB(1))
- .Times(AtMost(1));
- EXPECT_CALL(b, DoB(2))
- .Times(1)
- .WillRepeatedly(Return(1));
- // It's fine for the number of WillOnce()s to equal the upper bound.
- EXPECT_CALL(b, DoB(3))
- .Times(Between(1, 2))
- .WillOnce(Return(1))
- .WillOnce(Return(2));
- // It's fine for the number of WillOnce()s to be smaller than the
- // upper bound when there is a WillRepeatedly().
- EXPECT_CALL(b, DoB(4))
- .Times(AtMost(3))
- .WillOnce(Return(1))
- .WillRepeatedly(Return(2));
- // Satisfies the above expectations.
- b.DoB(2);
- b.DoB(3);
- }
- EXPECT_STREQ("", GetCapturedStdout().c_str());
- }
- // Tests that Google Mock warns on having too many actions in an
- // expectation compared to its cardinality.
- TEST(ExpectCallSyntaxTest, WarnsOnTooManyActions) {
- CaptureStdout();
- {
- MockB b;
- // Warns when the number of WillOnce()s is larger than the upper bound.
- EXPECT_CALL(b, DoB())
- .Times(0)
- .WillOnce(Return(1)); // #1
- EXPECT_CALL(b, DoB())
- .Times(AtMost(1))
- .WillOnce(Return(1))
- .WillOnce(Return(2)); // #2
- EXPECT_CALL(b, DoB(1))
- .Times(1)
- .WillOnce(Return(1))
- .WillOnce(Return(2))
- .RetiresOnSaturation(); // #3
- // Warns when the number of WillOnce()s equals the upper bound and
- // there is a WillRepeatedly().
- EXPECT_CALL(b, DoB())
- .Times(0)
- .WillRepeatedly(Return(1)); // #4
- EXPECT_CALL(b, DoB(2))
- .Times(1)
- .WillOnce(Return(1))
- .WillRepeatedly(Return(2)); // #5
- // Satisfies the above expectations.
- b.DoB(1);
- b.DoB(2);
- }
- const std::string output = GetCapturedStdout();
- EXPECT_PRED_FORMAT2(
- IsSubstring,
- "Too many actions specified in EXPECT_CALL(b, DoB())...\n"
- "Expected to be never called, but has 1 WillOnce().",
- output); // #1
- EXPECT_PRED_FORMAT2(
- IsSubstring,
- "Too many actions specified in EXPECT_CALL(b, DoB())...\n"
- "Expected to be called at most once, "
- "but has 2 WillOnce()s.",
- output); // #2
- EXPECT_PRED_FORMAT2(
- IsSubstring,
- "Too many actions specified in EXPECT_CALL(b, DoB(1))...\n"
- "Expected to be called once, but has 2 WillOnce()s.",
- output); // #3
- EXPECT_PRED_FORMAT2(
- IsSubstring,
- "Too many actions specified in EXPECT_CALL(b, DoB())...\n"
- "Expected to be never called, but has 0 WillOnce()s "
- "and a WillRepeatedly().",
- output); // #4
- EXPECT_PRED_FORMAT2(
- IsSubstring,
- "Too many actions specified in EXPECT_CALL(b, DoB(2))...\n"
- "Expected to be called once, but has 1 WillOnce() "
- "and a WillRepeatedly().",
- output); // #5
- }
- // Tests that Google Mock warns on having too few actions in an
- // expectation compared to its cardinality.
- TEST(ExpectCallSyntaxTest, WarnsOnTooFewActions) {
- MockB b;
- EXPECT_CALL(b, DoB())
- .Times(Between(2, 3))
- .WillOnce(Return(1));
- CaptureStdout();
- b.DoB();
- const std::string output = GetCapturedStdout();
- EXPECT_PRED_FORMAT2(
- IsSubstring,
- "Too few actions specified in EXPECT_CALL(b, DoB())...\n"
- "Expected to be called between 2 and 3 times, "
- "but has only 1 WillOnce().",
- output);
- b.DoB();
- }
- TEST(ExpectCallSyntaxTest, WarningIsErrorWithFlag) {
- int original_behavior = testing::GMOCK_FLAG(default_mock_behavior);
- testing::GMOCK_FLAG(default_mock_behavior) = kAllow;
- CaptureStdout();
- {
- MockA a;
- a.DoA(0);
- }
- std::string output = GetCapturedStdout();
- EXPECT_TRUE(output.empty()) << output;
- testing::GMOCK_FLAG(default_mock_behavior) = kWarn;
- CaptureStdout();
- {
- MockA a;
- a.DoA(0);
- }
- std::string warning_output = GetCapturedStdout();
- EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", warning_output);
- EXPECT_PRED_FORMAT2(IsSubstring, "Uninteresting mock function call",
- warning_output);
- testing::GMOCK_FLAG(default_mock_behavior) = kFail;
- EXPECT_NONFATAL_FAILURE({
- MockA a;
- a.DoA(0);
- }, "Uninteresting mock function call");
- // Out of bounds values are converted to kWarn
- testing::GMOCK_FLAG(default_mock_behavior) = -1;
- CaptureStdout();
- {
- MockA a;
- a.DoA(0);
- }
- warning_output = GetCapturedStdout();
- EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", warning_output);
- EXPECT_PRED_FORMAT2(IsSubstring, "Uninteresting mock function call",
- warning_output);
- testing::GMOCK_FLAG(default_mock_behavior) = 3;
- CaptureStdout();
- {
- MockA a;
- a.DoA(0);
- }
- warning_output = GetCapturedStdout();
- EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", warning_output);
- EXPECT_PRED_FORMAT2(IsSubstring, "Uninteresting mock function call",
- warning_output);
- testing::GMOCK_FLAG(default_mock_behavior) = original_behavior;
- }
- #endif // GTEST_HAS_STREAM_REDIRECTION
- // Tests the semantics of ON_CALL().
- // Tests that the built-in default action is taken when no ON_CALL()
- // is specified.
- TEST(OnCallTest, TakesBuiltInDefaultActionWhenNoOnCall) {
- MockB b;
- EXPECT_CALL(b, DoB());
- EXPECT_EQ(0, b.DoB());
- }
- // Tests that the built-in default action is taken when no ON_CALL()
- // matches the invocation.
- TEST(OnCallTest, TakesBuiltInDefaultActionWhenNoOnCallMatches) {
- MockB b;
- ON_CALL(b, DoB(1))
- .WillByDefault(Return(1));
- EXPECT_CALL(b, DoB(_));
- EXPECT_EQ(0, b.DoB(2));
- }
- // Tests that the last matching ON_CALL() action is taken.
- TEST(OnCallTest, PicksLastMatchingOnCall) {
- MockB b;
- ON_CALL(b, DoB(_))
- .WillByDefault(Return(3));
- ON_CALL(b, DoB(2))
- .WillByDefault(Return(2));
- ON_CALL(b, DoB(1))
- .WillByDefault(Return(1));
- EXPECT_CALL(b, DoB(_));
- EXPECT_EQ(2, b.DoB(2));
- }
- // Tests the semantics of EXPECT_CALL().
- // Tests that any call is allowed when no EXPECT_CALL() is specified.
- TEST(ExpectCallTest, AllowsAnyCallWhenNoSpec) {
- MockB b;
- EXPECT_CALL(b, DoB());
- // There is no expectation on DoB(int).
- b.DoB();
- // DoB(int) can be called any number of times.
- b.DoB(1);
- b.DoB(2);
- }
- // Tests that the last matching EXPECT_CALL() fires.
- TEST(ExpectCallTest, PicksLastMatchingExpectCall) {
- MockB b;
- EXPECT_CALL(b, DoB(_))
- .WillRepeatedly(Return(2));
- EXPECT_CALL(b, DoB(1))
- .WillRepeatedly(Return(1));
- EXPECT_EQ(1, b.DoB(1));
- }
- // Tests lower-bound violation.
- TEST(ExpectCallTest, CatchesTooFewCalls) {
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- MockB b;
- EXPECT_CALL(b, DoB(5))
- .Times(AtLeast(2));
- b.DoB(5);
- }, "Actual function call count doesn't match EXPECT_CALL(b, DoB(5))...\n"
- " Expected: to be called at least twice\n"
- " Actual: called once - unsatisfied and active");
- }
- // Tests that the cardinality can be inferred when no Times(...) is
- // specified.
- TEST(ExpectCallTest, InfersCardinalityWhenThereIsNoWillRepeatedly) {
- {
- MockB b;
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(1))
- .WillOnce(Return(2));
- EXPECT_EQ(1, b.DoB());
- EXPECT_EQ(2, b.DoB());
- }
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- MockB b;
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(1))
- .WillOnce(Return(2));
- EXPECT_EQ(1, b.DoB());
- }, "to be called twice");
- { // NOLINT
- MockB b;
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(1))
- .WillOnce(Return(2));
- EXPECT_EQ(1, b.DoB());
- EXPECT_EQ(2, b.DoB());
- EXPECT_NONFATAL_FAILURE(b.DoB(), "to be called twice");
- }
- }
- TEST(ExpectCallTest, InfersCardinality1WhenThereIsWillRepeatedly) {
- {
- MockB b;
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(1))
- .WillRepeatedly(Return(2));
- EXPECT_EQ(1, b.DoB());
- }
- { // NOLINT
- MockB b;
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(1))
- .WillRepeatedly(Return(2));
- EXPECT_EQ(1, b.DoB());
- EXPECT_EQ(2, b.DoB());
- EXPECT_EQ(2, b.DoB());
- }
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- MockB b;
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(1))
- .WillRepeatedly(Return(2));
- }, "to be called at least once");
- }
- // Tests that the n-th action is taken for the n-th matching
- // invocation.
- TEST(ExpectCallTest, NthMatchTakesNthAction) {
- MockB b;
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(1))
- .WillOnce(Return(2))
- .WillOnce(Return(3));
- EXPECT_EQ(1, b.DoB());
- EXPECT_EQ(2, b.DoB());
- EXPECT_EQ(3, b.DoB());
- }
- // Tests that the WillRepeatedly() action is taken when the WillOnce(...)
- // list is exhausted.
- TEST(ExpectCallTest, TakesRepeatedActionWhenWillListIsExhausted) {
- MockB b;
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(1))
- .WillRepeatedly(Return(2));
- EXPECT_EQ(1, b.DoB());
- EXPECT_EQ(2, b.DoB());
- EXPECT_EQ(2, b.DoB());
- }
- #if GTEST_HAS_STREAM_REDIRECTION
- // Tests that the default action is taken when the WillOnce(...) list is
- // exhausted and there is no WillRepeatedly().
- TEST(ExpectCallTest, TakesDefaultActionWhenWillListIsExhausted) {
- MockB b;
- EXPECT_CALL(b, DoB(_))
- .Times(1);
- EXPECT_CALL(b, DoB())
- .Times(AnyNumber())
- .WillOnce(Return(1))
- .WillOnce(Return(2));
- CaptureStdout();
- EXPECT_EQ(0, b.DoB(1)); // Shouldn't generate a warning as the
- // expectation has no action clause at all.
- EXPECT_EQ(1, b.DoB());
- EXPECT_EQ(2, b.DoB());
- const std::string output1 = GetCapturedStdout();
- EXPECT_STREQ("", output1.c_str());
- CaptureStdout();
- EXPECT_EQ(0, b.DoB());
- EXPECT_EQ(0, b.DoB());
- const std::string output2 = GetCapturedStdout();
- EXPECT_THAT(output2.c_str(),
- HasSubstr("Actions ran out in EXPECT_CALL(b, DoB())...\n"
- "Called 3 times, but only 2 WillOnce()s are specified"
- " - returning default value."));
- EXPECT_THAT(output2.c_str(),
- HasSubstr("Actions ran out in EXPECT_CALL(b, DoB())...\n"
- "Called 4 times, but only 2 WillOnce()s are specified"
- " - returning default value."));
- }
- TEST(FunctionMockerMessageTest, ReportsExpectCallLocationForExhausedActions) {
- MockB b;
- std::string expect_call_location = FormatFileLocation(__FILE__, __LINE__ + 1);
- EXPECT_CALL(b, DoB()).Times(AnyNumber()).WillOnce(Return(1));
- EXPECT_EQ(1, b.DoB());
- CaptureStdout();
- EXPECT_EQ(0, b.DoB());
- const std::string output = GetCapturedStdout();
- // The warning message should contain the call location.
- EXPECT_PRED_FORMAT2(IsSubstring, expect_call_location, output);
- }
- TEST(FunctionMockerMessageTest,
- ReportsDefaultActionLocationOfUninterestingCallsForNaggyMock) {
- std::string on_call_location;
- CaptureStdout();
- {
- NaggyMock<MockB> b;
- on_call_location = FormatFileLocation(__FILE__, __LINE__ + 1);
- ON_CALL(b, DoB(_)).WillByDefault(Return(0));
- b.DoB(0);
- }
- EXPECT_PRED_FORMAT2(IsSubstring, on_call_location, GetCapturedStdout());
- }
- #endif // GTEST_HAS_STREAM_REDIRECTION
- // Tests that an uninteresting call performs the default action.
- TEST(UninterestingCallTest, DoesDefaultAction) {
- // When there is an ON_CALL() statement, the action specified by it
- // should be taken.
- MockA a;
- ON_CALL(a, Binary(_, _))
- .WillByDefault(Return(true));
- EXPECT_TRUE(a.Binary(1, 2));
- // When there is no ON_CALL(), the default value for the return type
- // should be returned.
- MockB b;
- EXPECT_EQ(0, b.DoB());
- }
- // Tests that an unexpected call performs the default action.
- TEST(UnexpectedCallTest, DoesDefaultAction) {
- // When there is an ON_CALL() statement, the action specified by it
- // should be taken.
- MockA a;
- ON_CALL(a, Binary(_, _))
- .WillByDefault(Return(true));
- EXPECT_CALL(a, Binary(0, 0));
- a.Binary(0, 0);
- bool result = false;
- EXPECT_NONFATAL_FAILURE(result = a.Binary(1, 2),
- "Unexpected mock function call");
- EXPECT_TRUE(result);
- // When there is no ON_CALL(), the default value for the return type
- // should be returned.
- MockB b;
- EXPECT_CALL(b, DoB(0))
- .Times(0);
- int n = -1;
- EXPECT_NONFATAL_FAILURE(n = b.DoB(1),
- "Unexpected mock function call");
- EXPECT_EQ(0, n);
- }
- // Tests that when an unexpected void function generates the right
- // failure message.
- TEST(UnexpectedCallTest, GeneratesFailureForVoidFunction) {
- // First, tests the message when there is only one EXPECT_CALL().
- MockA a1;
- EXPECT_CALL(a1, DoA(1));
- a1.DoA(1);
- // Ideally we should match the failure message against a regex, but
- // EXPECT_NONFATAL_FAILURE doesn't support that, so we test for
- // multiple sub-strings instead.
- EXPECT_NONFATAL_FAILURE(
- a1.DoA(9),
- "Unexpected mock function call - returning directly.\n"
- " Function call: DoA(9)\n"
- "Google Mock tried the following 1 expectation, but it didn't match:");
- EXPECT_NONFATAL_FAILURE(
- a1.DoA(9),
- " Expected arg #0: is equal to 1\n"
- " Actual: 9\n"
- " Expected: to be called once\n"
- " Actual: called once - saturated and active");
- // Next, tests the message when there are more than one EXPECT_CALL().
- MockA a2;
- EXPECT_CALL(a2, DoA(1));
- EXPECT_CALL(a2, DoA(3));
- a2.DoA(1);
- EXPECT_NONFATAL_FAILURE(
- a2.DoA(2),
- "Unexpected mock function call - returning directly.\n"
- " Function call: DoA(2)\n"
- "Google Mock tried the following 2 expectations, but none matched:");
- EXPECT_NONFATAL_FAILURE(
- a2.DoA(2),
- "tried expectation #0: EXPECT_CALL(a2, DoA(1))...\n"
- " Expected arg #0: is equal to 1\n"
- " Actual: 2\n"
- " Expected: to be called once\n"
- " Actual: called once - saturated and active");
- EXPECT_NONFATAL_FAILURE(
- a2.DoA(2),
- "tried expectation #1: EXPECT_CALL(a2, DoA(3))...\n"
- " Expected arg #0: is equal to 3\n"
- " Actual: 2\n"
- " Expected: to be called once\n"
- " Actual: never called - unsatisfied and active");
- a2.DoA(3);
- }
- // Tests that an unexpected non-void function generates the right
- // failure message.
- TEST(UnexpectedCallTest, GeneartesFailureForNonVoidFunction) {
- MockB b1;
- EXPECT_CALL(b1, DoB(1));
- b1.DoB(1);
- EXPECT_NONFATAL_FAILURE(
- b1.DoB(2),
- "Unexpected mock function call - returning default value.\n"
- " Function call: DoB(2)\n"
- " Returns: 0\n"
- "Google Mock tried the following 1 expectation, but it didn't match:");
- EXPECT_NONFATAL_FAILURE(
- b1.DoB(2),
- " Expected arg #0: is equal to 1\n"
- " Actual: 2\n"
- " Expected: to be called once\n"
- " Actual: called once - saturated and active");
- }
- // Tests that Google Mock explains that an retired expectation doesn't
- // match the call.
- TEST(UnexpectedCallTest, RetiredExpectation) {
- MockB b;
- EXPECT_CALL(b, DoB(1))
- .RetiresOnSaturation();
- b.DoB(1);
- EXPECT_NONFATAL_FAILURE(
- b.DoB(1),
- " Expected: the expectation is active\n"
- " Actual: it is retired");
- }
- // Tests that Google Mock explains that an expectation that doesn't
- // match the arguments doesn't match the call.
- TEST(UnexpectedCallTest, UnmatchedArguments) {
- MockB b;
- EXPECT_CALL(b, DoB(1));
- EXPECT_NONFATAL_FAILURE(
- b.DoB(2),
- " Expected arg #0: is equal to 1\n"
- " Actual: 2\n");
- b.DoB(1);
- }
- // Tests that Google Mock explains that an expectation with
- // unsatisfied pre-requisites doesn't match the call.
- TEST(UnexpectedCallTest, UnsatisifiedPrerequisites) {
- Sequence s1, s2;
- MockB b;
- EXPECT_CALL(b, DoB(1))
- .InSequence(s1);
- EXPECT_CALL(b, DoB(2))
- .Times(AnyNumber())
- .InSequence(s1);
- EXPECT_CALL(b, DoB(3))
- .InSequence(s2);
- EXPECT_CALL(b, DoB(4))
- .InSequence(s1, s2);
- ::testing::TestPartResultArray failures;
- {
- ::testing::ScopedFakeTestPartResultReporter reporter(&failures);
- b.DoB(4);
- // Now 'failures' contains the Google Test failures generated by
- // the above statement.
- }
- // There should be one non-fatal failure.
- ASSERT_EQ(1, failures.size());
- const ::testing::TestPartResult& r = failures.GetTestPartResult(0);
- EXPECT_EQ(::testing::TestPartResult::kNonFatalFailure, r.type());
- // Verifies that the failure message contains the two unsatisfied
- // pre-requisites but not the satisfied one.
- #if GTEST_USES_PCRE
- EXPECT_THAT(r.message(), ContainsRegex(
- // PCRE has trouble using (.|\n) to match any character, but
- // supports the (?s) prefix for using . to match any character.
- "(?s)the following immediate pre-requisites are not satisfied:\n"
- ".*: pre-requisite #0\n"
- ".*: pre-requisite #1"));
- #elif GTEST_USES_POSIX_RE
- EXPECT_THAT(r.message(), ContainsRegex(
- // POSIX RE doesn't understand the (?s) prefix, but has no trouble
- // with (.|\n).
- "the following immediate pre-requisites are not satisfied:\n"
- "(.|\n)*: pre-requisite #0\n"
- "(.|\n)*: pre-requisite #1"));
- #else
- // We can only use Google Test's own simple regex.
- EXPECT_THAT(r.message(), ContainsRegex(
- "the following immediate pre-requisites are not satisfied:"));
- EXPECT_THAT(r.message(), ContainsRegex(": pre-requisite #0"));
- EXPECT_THAT(r.message(), ContainsRegex(": pre-requisite #1"));
- #endif // GTEST_USES_PCRE
- b.DoB(1);
- b.DoB(3);
- b.DoB(4);
- }
- TEST(UndefinedReturnValueTest,
- ReturnValueIsMandatoryWhenNotDefaultConstructible) {
- MockA a;
- // FIXME: 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.ReturnNonDefaultConstructible());
- #else
- EXPECT_DEATH_IF_SUPPORTED(a.ReturnNonDefaultConstructible(), "");
- #endif
- }
- // Tests that an excessive call (one whose arguments match the
- // matchers but is called too many times) performs the default action.
- TEST(ExcessiveCallTest, DoesDefaultAction) {
- // When there is an ON_CALL() statement, the action specified by it
- // should be taken.
- MockA a;
- ON_CALL(a, Binary(_, _))
- .WillByDefault(Return(true));
- EXPECT_CALL(a, Binary(0, 0));
- a.Binary(0, 0);
- bool result = false;
- EXPECT_NONFATAL_FAILURE(result = a.Binary(0, 0),
- "Mock function called more times than expected");
- EXPECT_TRUE(result);
- // When there is no ON_CALL(), the default value for the return type
- // should be returned.
- MockB b;
- EXPECT_CALL(b, DoB(0))
- .Times(0);
- int n = -1;
- EXPECT_NONFATAL_FAILURE(n = b.DoB(0),
- "Mock function called more times than expected");
- EXPECT_EQ(0, n);
- }
- // Tests that when a void function is called too many times,
- // the failure message contains the argument values.
- TEST(ExcessiveCallTest, GeneratesFailureForVoidFunction) {
- MockA a;
- EXPECT_CALL(a, DoA(_))
- .Times(0);
- EXPECT_NONFATAL_FAILURE(
- a.DoA(9),
- "Mock function called more times than expected - returning directly.\n"
- " Function call: DoA(9)\n"
- " Expected: to be never called\n"
- " Actual: called once - over-saturated and active");
- }
- // Tests that when a non-void function is called too many times, the
- // failure message contains the argument values and the return value.
- TEST(ExcessiveCallTest, GeneratesFailureForNonVoidFunction) {
- MockB b;
- EXPECT_CALL(b, DoB(_));
- b.DoB(1);
- EXPECT_NONFATAL_FAILURE(
- b.DoB(2),
- "Mock function called more times than expected - "
- "returning default value.\n"
- " Function call: DoB(2)\n"
- " Returns: 0\n"
- " Expected: to be called once\n"
- " Actual: called twice - over-saturated and active");
- }
- // Tests using sequences.
- TEST(InSequenceTest, AllExpectationInScopeAreInSequence) {
- MockA a;
- {
- InSequence dummy;
- EXPECT_CALL(a, DoA(1));
- EXPECT_CALL(a, DoA(2));
- }
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- a.DoA(2);
- }, "Unexpected mock function call");
- a.DoA(1);
- a.DoA(2);
- }
- TEST(InSequenceTest, NestedInSequence) {
- MockA a;
- {
- InSequence dummy;
- EXPECT_CALL(a, DoA(1));
- {
- InSequence dummy2;
- EXPECT_CALL(a, DoA(2));
- EXPECT_CALL(a, DoA(3));
- }
- }
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- a.DoA(1);
- a.DoA(3);
- }, "Unexpected mock function call");
- a.DoA(2);
- a.DoA(3);
- }
- TEST(InSequenceTest, ExpectationsOutOfScopeAreNotAffected) {
- MockA a;
- {
- InSequence dummy;
- EXPECT_CALL(a, DoA(1));
- EXPECT_CALL(a, DoA(2));
- }
- EXPECT_CALL(a, DoA(3));
- EXPECT_NONFATAL_FAILURE({ // NOLINT
- a.DoA(2);
- }, "Unexpected mock function call");
- a.DoA(3);
- a.DoA(1);
- a.DoA(2);
- }
- // Tests that any order is allowed when no sequence is used.
- TEST(SequenceTest, AnyOrderIsOkByDefault) {
- {
- MockA a;
- MockB b;
- EXPECT_CALL(a, DoA(1));
- EXPECT_CALL(b, DoB())
- .Times(AnyNumber());
- a.DoA(1);
- b.DoB();
- }
- { // NOLINT
- MockA a;
- MockB b;
- EXPECT_CALL(a, DoA(1));
- EXPECT_CALL(b, DoB())
- .Times(AnyNumber());
- b.DoB();
- a.DoA(1);
- }
- }
- // Tests that the calls must be in strict order when a complete order
- // is specified.
- TEST(SequenceTest, CallsMustBeInStrictOrderWhenSaidSo1) {
- MockA a;
- ON_CALL(a, ReturnResult(_))
- .WillByDefault(Return(Result()));
- Sequence s;
- EXPECT_CALL(a, ReturnResult(1))
- .InSequence(s);
- EXPECT_CALL(a, ReturnResult(2))
- .InSequence(s);
- EXPECT_CALL(a, ReturnResult(3))
- .InSequence(s);
- a.ReturnResult(1);
- // May only be called after a.ReturnResult(2).
- EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), "Unexpected mock function call");
- a.ReturnResult(2);
- a.ReturnResult(3);
- }
- // Tests that the calls must be in strict order when a complete order
- // is specified.
- TEST(SequenceTest, CallsMustBeInStrictOrderWhenSaidSo2) {
- MockA a;
- ON_CALL(a, ReturnResult(_))
- .WillByDefault(Return(Result()));
- Sequence s;
- EXPECT_CALL(a, ReturnResult(1))
- .InSequence(s);
- EXPECT_CALL(a, ReturnResult(2))
- .InSequence(s);
- // May only be called after a.ReturnResult(1).
- EXPECT_NONFATAL_FAILURE(a.ReturnResult(2), "Unexpected mock function call");
- a.ReturnResult(1);
- a.ReturnResult(2);
- }
- // Tests specifying a DAG using multiple sequences.
- class PartialOrderTest : public testing::Test {
- protected:
- PartialOrderTest() {
- ON_CALL(a_, ReturnResult(_))
- .WillByDefault(Return(Result()));
- // 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);
- }
- MockA a_;
- MockB b_;
- };
- TEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag1) {
- a_.ReturnResult(1);
- b_.DoB();
- // May only be called after the second DoB().
- EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), "Unexpected mock function call");
- 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) {
- MockA a;
- Sequence s;
- EXPECT_CALL(a, DoA(1))
- .InSequence(s);
- EXPECT_CALL(a, DoA(_))
- .InSequence(s)
- .RetiresOnSaturation();
- EXPECT_CALL(a, DoA(1))
- .InSequence(s);
- a.DoA(1);
- a.DoA(2);
- a.DoA(1);
- }
- // Tests Expectation.
- TEST(ExpectationTest, ConstrutorsWork) {
- MockA a;
- Expectation e1; // Default ctor.
- // Ctor from various forms of EXPECT_CALL.
- Expectation e2 = EXPECT_CALL(a, DoA(2));
- Expectation e3 = EXPECT_CALL(a, DoA(3)).With(_);
- {
- Sequence s;
- Expectation e4 = EXPECT_CALL(a, DoA(4)).Times(1);
- Expectation e5 = EXPECT_CALL(a, DoA(5)).InSequence(s);
- }
- Expectation e6 = EXPECT_CALL(a, DoA(6)).After(e2);
- Expectation e7 = EXPECT_CALL(a, DoA(7)).WillOnce(Return());
- Expectation e8 = EXPECT_CALL(a, DoA(8)).WillRepeatedly(Return());
- Expectation e9 = EXPECT_CALL(a, DoA(9)).RetiresOnSaturation();
- Expectation e10 = e2; // Copy ctor.
- EXPECT_THAT(e1, Ne(e2));
- EXPECT_THAT(e2, Eq(e10));
- a.DoA(2);
- a.DoA(3);
- a.DoA(4);
- a.DoA(5);
- a.DoA(6);
- a.DoA(7);
- a.DoA(8);
- a.DoA(9);
- }
- TEST(ExpectationTest, AssignmentWorks) {
- MockA a;
- Expectation e1;
- Expectation e2 = EXPECT_CALL(a, DoA(1));
- EXPECT_THAT(e1, Ne(e2));
- e1 = e2;
- EXPECT_THAT(e1, Eq(e2));
- a.DoA(1);
- }
- // Tests ExpectationSet.
- TEST(ExpectationSetTest, MemberTypesAreCorrect) {
- ::testing::StaticAssertTypeEq<Expectation, ExpectationSet::value_type>();
- }
- TEST(ExpectationSetTest, ConstructorsWork) {
- MockA a;
- Expectation e1;
- const Expectation e2;
- ExpectationSet es1; // Default ctor.
- ExpectationSet es2 = EXPECT_CALL(a, DoA(1)); // Ctor from EXPECT_CALL.
- ExpectationSet es3 = e1; // Ctor from Expectation.
- ExpectationSet es4(e1); // Ctor from Expectation; alternative syntax.
- ExpectationSet es5 = e2; // Ctor from const Expectation.
- ExpectationSet es6(e2); // Ctor from const Expectation; alternative syntax.
- ExpectationSet es7 = es2; // Copy ctor.
- EXPECT_EQ(0, es1.size());
- EXPECT_EQ(1, es2.size());
- EXPECT_EQ(1, es3.size());
- EXPECT_EQ(1, es4.size());
- EXPECT_EQ(1, es5.size());
- EXPECT_EQ(1, es6.size());
- EXPECT_EQ(1, es7.size());
- EXPECT_THAT(es3, Ne(es2));
- EXPECT_THAT(es4, Eq(es3));
- EXPECT_THAT(es5, Eq(es4));
- EXPECT_THAT(es6, Eq(es5));
- EXPECT_THAT(es7, Eq(es2));
- a.DoA(1);
- }
- TEST(ExpectationSetTest, AssignmentWorks) {
- ExpectationSet es1;
- ExpectationSet es2 = Expectation();
- es1 = es2;
- EXPECT_EQ(1, es1.size());
- EXPECT_THAT(*(es1.begin()), Eq(Expectation()));
- EXPECT_THAT(es1, Eq(es2));
- }
- TEST(ExpectationSetTest, InsertionWorks) {
- ExpectationSet es1;
- Expectation e1;
- es1 += e1;
- EXPECT_EQ(1, es1.size());
- EXPECT_THAT(*(es1.begin()), Eq(e1));
- MockA a;
- Expectation e2 = EXPECT_CALL(a, DoA(1));
- es1 += e2;
- EXPECT_EQ(2, es1.size());
- ExpectationSet::const_iterator it1 = es1.begin();
- ExpectationSet::const_iterator it2 = it1;
- ++it2;
- EXPECT_TRUE(*it1 == e1 || *it2 == e1); // e1 must be in the set.
- EXPECT_TRUE(*it1 == e2 || *it2 == e2); // e2 must be in the set too.
- a.DoA(1);
- }
- TEST(ExpectationSetTest, SizeWorks) {
- ExpectationSet es;
- EXPECT_EQ(0, es.size());
- es += Expectation();
- EXPECT_EQ(1, es.size());
- MockA a;
- es += EXPECT_CALL(a, DoA(1));
- EXPECT_EQ(2, es.size());
- a.DoA(1);
- }
- TEST(ExpectationSetTest, IsEnumerable) {
- ExpectationSet es;
- EXPECT_TRUE(es.begin() == es.end());
- es += Expectation();
- ExpectationSet::const_iterator it = es.begin();
- EXPECT_TRUE(it != es.end());
- EXPECT_THAT(*it, Eq(Expectation()));
- ++it;
- EXPECT_TRUE(it== es.end());
- }
- // Tests the .After() clause.
- TEST(AfterTest, SucceedsWhenPartialOrderIsSatisfied) {
- MockA a;
- ExpectationSet es;
- es += EXPECT_CALL(a, DoA(1));
- es += EXPECT_CALL(a, DoA(2));
- EXPECT_CALL(a, DoA(3))
- .After(es);
- a.DoA(1);
- a.DoA(2);
- a.DoA(3);
- }
- TEST(AfterTest, SucceedsWhenTotalOrderIsSatisfied) {
- MockA a;
- MockB b;
- // The following also verifies that const Expectation objects work
- // too. Do not remove the const modifiers.
- const Expectation e1 = EXPECT_CALL(a, DoA(1));
- const Expectation e2 = EXPECT_CALL(b, DoB())
- .Times(2)
- .After(e1);
- EXPECT_CALL(a, DoA(2)).After(e2);
- a.DoA(1);
- b.DoB();
- b.DoB();
- a.DoA(2);
- }
- // 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())
- .After(e1);
- EXPECT_CALL(a, DoA(2))
- .After(e2);
- a.DoA(1);
- // May only be called after DoB().
- EXPECT_NONFATAL_FAILURE(a.DoA(2), "Unexpected mock function call");
- b.DoB();
- 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();
- // 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(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);
- // May only be called last.
- EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), "Unexpected mock function call");
- a.DoA(2);
- 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(AfterTest, CanBeUsedWithInSequence) {
- MockA a;
- Sequence s;
- Expectation e = EXPECT_CALL(a, DoA(1));
- EXPECT_CALL(a, DoA(2)).InSequence(s);
- EXPECT_CALL(a, DoA(3))
- .InSequence(s)
- .After(e);
- a.DoA(1);
- // May only be after DoA(2).
- EXPECT_NONFATAL_FAILURE(a.DoA(3), "Unexpected mock function call");
- a.DoA(2);
- a.DoA(3);
- }
- // .After() can be called multiple times.
- TEST(AfterTest, CanBeCalledManyTimes) {
- MockA a;
- Expectation e1 = EXPECT_CALL(a, DoA(1));
- Expectation e2 = EXPECT_CALL(a, DoA(2));
- Expectation e3 = EXPECT_CALL(a, DoA(3));
- EXPECT_CALL(a, DoA(4))
- .After(e1)
- .After(e2)
- .After(e3);
- a.DoA(3);
- a.DoA(1);
- a.DoA(2);
- a.DoA(4);
- }
- // .After() accepts up to 5 arguments.
- TEST(AfterTest, AcceptsUpToFiveArguments) {
- MockA a;
- Expectation e1 = EXPECT_CALL(a, DoA(1));
- Expectation e2 = EXPECT_CALL(a, DoA(2));
- Expectation e3 = EXPECT_CALL(a, DoA(3));
- ExpectationSet es1 = EXPECT_CALL(a, DoA(4));
- ExpectationSet es2 = EXPECT_CALL(a, DoA(5));
- EXPECT_CALL(a, DoA(6))
- .After(e1, e2, e3, es1, es2);
- a.DoA(5);
- a.DoA(2);
- a.DoA(4);
- a.DoA(1);
- a.DoA(3);
- a.DoA(6);
- }
- // .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);
- a.DoA(1);
- // May only be after DoA(2).
- EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), "Unexpected mock function call");
- a.DoA(2);
- a.ReturnResult(3);
- }
- // An Expectation added to an ExpectationSet after it has been used in
- // an .After() has no effect.
- TEST(AfterTest, ChangesToExpectationSetHaveNoEffectAfterwards) {
- MockA a;
- ExpectationSet es1 = EXPECT_CALL(a, DoA(1));
- Expectation e2 = EXPECT_CALL(a, DoA(2));
- EXPECT_CALL(a, DoA(3))
- .After(es1);
- es1 += e2;
- a.DoA(1);
- a.DoA(3);
- a.DoA(2);
- }
- // Tests that Google Mock correctly handles calls to mock functions
- // after a mock object owning one of their pre-requisites has died.
- // Tests that calls that satisfy the original spec are successful.
- TEST(DeletingMockEarlyTest, Success1) {
- MockB* const b1 = new MockB;
- MockA* const a = new MockA;
- MockB* const b2 = new MockB;
- {
- InSequence dummy;
- EXPECT_CALL(*b1, DoB(_))
- .WillOnce(Return(1));
- EXPECT_CALL(*a, Binary(_, _))
- .Times(AnyNumber())
- .WillRepeatedly(Return(true));
- EXPECT_CALL(*b2, DoB(_))
- .Times(AnyNumber())
- .WillRepeatedly(Return(2));
- }
- EXPECT_EQ(1, b1->DoB(1));
- delete b1;
- // a's pre-requisite has died.
- EXPECT_TRUE(a->Binary(0, 1));
- delete b2;
- // a's successor has died.
- EXPECT_TRUE(a->Binary(1, 2));
- delete a;
- }
- // Tests that calls that satisfy the original spec are successful.
- TEST(DeletingMockEarlyTest, Success2) {
- MockB* const b1 = new MockB;
- MockA* const a = new MockA;
- MockB* const b2 = new MockB;
- {
- InSequence dummy;
- EXPECT_CALL(*b1, DoB(_))
- .WillOnce(Return(1));
- EXPECT_CALL(*a, Binary(_, _))
- .Times(AnyNumber());
- EXPECT_CALL(*b2, DoB(_))
- .Times(AnyNumber())
- .WillRepeatedly(Return(2));
- }
- delete a; // a is trivially satisfied.
- EXPECT_EQ(1, b1->DoB(1));
- EXPECT_EQ(2, b2->DoB(2));
- delete b1;
- delete b2;
- }
- // Tests that it's OK to delete a mock object itself in its action.
- // Suppresses warning on unreferenced formal parameter in MSVC with
- // -W4.
- #ifdef _MSC_VER
- # pragma warning(push)
- # pragma warning(disable:4100)
- #endif
- ACTION_P(Delete, ptr) { delete ptr; }
- #ifdef _MSC_VER
- # pragma warning(pop)
- #endif
- TEST(DeletingMockEarlyTest, CanDeleteSelfInActionReturningVoid) {
- MockA* const a = new MockA;
- EXPECT_CALL(*a, DoA(_)).WillOnce(Delete(a));
- a->DoA(42); // This will cause a to be deleted.
- }
- TEST(DeletingMockEarlyTest, CanDeleteSelfInActionReturningValue) {
- MockA* const a = new MockA;
- EXPECT_CALL(*a, ReturnResult(_))
- .WillOnce(DoAll(Delete(a), Return(Result())));
- a->ReturnResult(42); // This will cause a to be deleted.
- }
- // Tests that calls that violate the original spec yield failures.
- TEST(DeletingMockEarlyTest, Failure1) {
- MockB* const b1 = new MockB;
- MockA* const a = new MockA;
- MockB* const b2 = new MockB;
- {
- InSequence dummy;
- EXPECT_CALL(*b1, DoB(_))
- .WillOnce(Return(1));
- EXPECT_CALL(*a, Binary(_, _))
- .Times(AnyNumber());
- EXPECT_CALL(*b2, DoB(_))
- .Times(AnyNumber())
- .WillRepeatedly(Return(2));
- }
- delete a; // a is trivially satisfied.
- EXPECT_NONFATAL_FAILURE({
- b2->DoB(2);
- }, "Unexpected mock function call");
- EXPECT_EQ(1, b1->DoB(1));
- delete b1;
- delete b2;
- }
- // Tests that calls that violate the original spec yield failures.
- TEST(DeletingMockEarlyTest, Failure2) {
- MockB* const b1 = new MockB;
- MockA* const a = new MockA;
- MockB* const b2 = new MockB;
- {
- InSequence dummy;
- EXPECT_CALL(*b1, DoB(_));
- EXPECT_CALL(*a, Binary(_, _))
- .Times(AnyNumber());
- EXPECT_CALL(*b2, DoB(_))
- .Times(AnyNumber());
- }
- EXPECT_NONFATAL_FAILURE(delete b1,
- "Actual: never called");
- EXPECT_NONFATAL_FAILURE(a->Binary(0, 1),
- "Unexpected mock function call");
- EXPECT_NONFATAL_FAILURE(b2->DoB(1),
- "Unexpected mock function call");
- delete a;
- delete b2;
- }
- class EvenNumberCardinality : public CardinalityInterface {
- public:
- // Returns true if and only if call_count calls will satisfy this
- // cardinality.
- bool IsSatisfiedByCallCount(int call_count) const override {
- return call_count % 2 == 0;
- }
- // Returns true if and only if call_count calls will saturate this
- // cardinality.
- bool IsSaturatedByCallCount(int /* call_count */) const override {
- return false;
- }
- // Describes self to an ostream.
- void DescribeTo(::std::ostream* os) const override {
- *os << "called even number of times";
- }
- };
- Cardinality EvenNumber() {
- return Cardinality(new EvenNumberCardinality);
- }
- TEST(ExpectationBaseTest,
- AllPrerequisitesAreSatisfiedWorksForNonMonotonicCardinality) {
- MockA* a = new MockA;
- Sequence s;
- EXPECT_CALL(*a, DoA(1))
- .Times(EvenNumber())
- .InSequence(s);
- EXPECT_CALL(*a, DoA(2))
- .Times(AnyNumber())
- .InSequence(s);
- EXPECT_CALL(*a, DoA(3))
- .Times(AnyNumber());
- a->DoA(3);
- a->DoA(1);
- EXPECT_NONFATAL_FAILURE(a->DoA(2), "Unexpected mock function call");
- EXPECT_NONFATAL_FAILURE(delete a, "to be called even number of times");
- }
- // The following tests verify the message generated when a mock
- // function is called.
- struct Printable {
- };
- inline void operator<<(::std::ostream& os, const Printable&) {
- os << "Printable";
- }
- struct Unprintable {
- Unprintable() : value(0) {}
- int value;
- };
- class MockC {
- public:
- MockC() {}
- MOCK_METHOD6(VoidMethod, void(bool cond, int n, std::string s, void* p,
- const Printable& x, Unprintable y));
- MOCK_METHOD0(NonVoidMethod, int()); // NOLINT
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockC);
- };
- class VerboseFlagPreservingFixture : public testing::Test {
- protected:
- VerboseFlagPreservingFixture()
- : saved_verbose_flag_(GMOCK_FLAG(verbose)) {}
- ~VerboseFlagPreservingFixture() override {
- GMOCK_FLAG(verbose) = saved_verbose_flag_;
- }
- private:
- const std::string saved_verbose_flag_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(VerboseFlagPreservingFixture);
- };
- #if GTEST_HAS_STREAM_REDIRECTION
- // Tests that an uninteresting mock function call on a naggy mock
- // generates a warning without the stack trace when
- // --gmock_verbose=warning is specified.
- TEST(FunctionCallMessageTest,
- UninterestingCallOnNaggyMockGeneratesNoStackTraceWhenVerboseWarning) {
- GMOCK_FLAG(verbose) = kWarningVerbosity;
- NaggyMock<MockC> c;
- CaptureStdout();
- c.VoidMethod(false, 5, "Hi", nullptr, Printable(), Unprintable());
- const std::string output = GetCapturedStdout();
- EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", output);
- EXPECT_PRED_FORMAT2(IsNotSubstring, "Stack trace:", output);
- }
- // Tests that an uninteresting mock function call on a naggy mock
- // generates a warning containing the stack trace when
- // --gmock_verbose=info is specified.
- TEST(FunctionCallMessageTest,
- UninterestingCallOnNaggyMockGeneratesFyiWithStackTraceWhenVerboseInfo) {
- GMOCK_FLAG(verbose) = kInfoVerbosity;
- NaggyMock<MockC> c;
- CaptureStdout();
- c.VoidMethod(false, 5, "Hi", nullptr, Printable(), Unprintable());
- const std::string output = GetCapturedStdout();
- EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", output);
- EXPECT_PRED_FORMAT2(IsSubstring, "Stack trace:", output);
- # ifndef NDEBUG
- // We check the stack trace content in dbg-mode only, as opt-mode
- // may inline the call we are interested in seeing.
- // Verifies that a void mock function's name appears in the stack
- // trace.
- EXPECT_PRED_FORMAT2(IsSubstring, "VoidMethod(", output);
- // Verifies that a non-void mock function's name appears in the
- // stack trace.
- CaptureStdout();
- c.NonVoidMethod();
- const std::string output2 = GetCapturedStdout();
- EXPECT_PRED_FORMAT2(IsSubstring, "NonVoidMethod(", output2);
- # endif // NDEBUG
- }
- // Tests that an uninteresting mock function call on a naggy mock
- // causes the function arguments and return value to be printed.
- TEST(FunctionCallMessageTest,
- UninterestingCallOnNaggyMockPrintsArgumentsAndReturnValue) {
- // A non-void mock function.
- NaggyMock<MockB> b;
- CaptureStdout();
- b.DoB();
- const std::string output1 = GetCapturedStdout();
- EXPECT_PRED_FORMAT2(
- IsSubstring,
- "Uninteresting mock function call - returning default value.\n"
- " Function call: DoB()\n"
- " Returns: 0\n", output1.c_str());
- // Makes sure the return value is printed.
- // A void mock function.
- NaggyMock<MockC> c;
- CaptureStdout();
- c.VoidMethod(false, 5, "Hi", nullptr, Printable(), Unprintable());
- const std::string output2 = GetCapturedStdout();
- EXPECT_THAT(output2.c_str(),
- ContainsRegex(
- "Uninteresting mock function call - returning directly\\.\n"
- " Function call: VoidMethod"
- "\\(false, 5, \"Hi\", NULL, @.+ "
- "Printable, 4-byte object <00-00 00-00>\\)"));
- // A void function has no return value to print.
- }
- // Tests how the --gmock_verbose flag affects Google Mock's output.
- class GMockVerboseFlagTest : public VerboseFlagPreservingFixture {
- public:
- // Verifies that the given Google Mock output is correct. (When
- // should_print is true, the output should match the given regex and
- // contain the given function name in the stack trace. When it's
- // false, the output should be empty.)
- void VerifyOutput(const std::string& output, bool should_print,
- const std::string& expected_substring,
- const std::string& function_name) {
- if (should_print) {
- EXPECT_THAT(output.c_str(), HasSubstr(expected_substring));
- # ifndef NDEBUG
- // We check the stack trace content in dbg-mode only, as opt-mode
- // may inline the call we are interested in seeing.
- EXPECT_THAT(output.c_str(), HasSubstr(function_name));
- # else
- // Suppresses 'unused function parameter' warnings.
- static_cast<void>(function_name);
- # endif // NDEBUG
- } else {
- EXPECT_STREQ("", output.c_str());
- }
- }
- // Tests how the flag affects expected calls.
- void TestExpectedCall(bool should_print) {
- MockA a;
- EXPECT_CALL(a, DoA(5));
- EXPECT_CALL(a, Binary(_, 1))
- .WillOnce(Return(true));
- // A void-returning function.
- CaptureStdout();
- a.DoA(5);
- VerifyOutput(
- GetCapturedStdout(),
- should_print,
- "Mock function call matches EXPECT_CALL(a, DoA(5))...\n"
- " Function call: DoA(5)\n"
- "Stack trace:\n",
- "DoA");
- // A non-void-returning function.
- CaptureStdout();
- a.Binary(2, 1);
- VerifyOutput(
- GetCapturedStdout(),
- should_print,
- "Mock function call matches EXPECT_CALL(a, Binary(_, 1))...\n"
- " Function call: Binary(2, 1)\n"
- " Returns: true\n"
- "Stack trace:\n",
- "Binary");
- }
- // Tests how the flag affects uninteresting calls on a naggy mock.
- void TestUninterestingCallOnNaggyMock(bool should_print) {
- NaggyMock<MockA> a;
- const std::string note =
- "NOTE: You can safely ignore the above warning unless this "
- "call should not happen. Do not suppress it by blindly adding "
- "an EXPECT_CALL() if you don't mean to enforce the call. "
- "See "
- "https://github.com/google/googletest/blob/master/docs/"
- "gmock_cook_book.md#"
- "knowing-when-to-expect for details.";
- // A void-returning function.
- CaptureStdout();
- a.DoA(5);
- VerifyOutput(
- GetCapturedStdout(),
- should_print,
- "\nGMOCK WARNING:\n"
- "Uninteresting mock function call - returning directly.\n"
- " Function call: DoA(5)\n" +
- note,
- "DoA");
- // A non-void-returning function.
- CaptureStdout();
- a.Binary(2, 1);
- VerifyOutput(
- GetCapturedStdout(),
- should_print,
- "\nGMOCK WARNING:\n"
- "Uninteresting mock function call - returning default value.\n"
- " Function call: Binary(2, 1)\n"
- " Returns: false\n" +
- note,
- "Binary");
- }
- };
- // Tests that --gmock_verbose=info causes both expected and
- // uninteresting calls to be reported.
- TEST_F(GMockVerboseFlagTest, Info) {
- GMOCK_FLAG(verbose) = kInfoVerbosity;
- TestExpectedCall(true);
- TestUninterestingCallOnNaggyMock(true);
- }
- // Tests that --gmock_verbose=warning causes uninteresting calls to be
- // reported.
- TEST_F(GMockVerboseFlagTest, Warning) {
- GMOCK_FLAG(verbose) = kWarningVerbosity;
- TestExpectedCall(false);
- TestUninterestingCallOnNaggyMock(true);
- }
- // Tests that --gmock_verbose=warning causes neither expected nor
- // uninteresting calls to be reported.
- TEST_F(GMockVerboseFlagTest, Error) {
- GMOCK_FLAG(verbose) = kErrorVerbosity;
- TestExpectedCall(false);
- TestUninterestingCallOnNaggyMock(false);
- }
- // Tests that --gmock_verbose=SOME_INVALID_VALUE has the same effect
- // as --gmock_verbose=warning.
- TEST_F(GMockVerboseFlagTest, InvalidFlagIsTreatedAsWarning) {
- GMOCK_FLAG(verbose) = "invalid"; // Treated as "warning".
- TestExpectedCall(false);
- TestUninterestingCallOnNaggyMock(true);
- }
- #endif // GTEST_HAS_STREAM_REDIRECTION
- // A helper class that generates a failure when printed. We use it to
- // ensure that Google Mock doesn't print a value (even to an internal
- // buffer) when it is not supposed to do so.
- class PrintMeNot {};
- void PrintTo(PrintMeNot /* dummy */, ::std::ostream* /* os */) {
- ADD_FAILURE() << "Google Mock is printing a value that shouldn't be "
- << "printed even to an internal buffer.";
- }
- class LogTestHelper {
- public:
- LogTestHelper() {}
- MOCK_METHOD1(Foo, PrintMeNot(PrintMeNot));
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(LogTestHelper);
- };
- class GMockLogTest : public VerboseFlagPreservingFixture {
- protected:
- LogTestHelper helper_;
- };
- TEST_F(GMockLogTest, DoesNotPrintGoodCallInternallyIfVerbosityIsWarning) {
- GMOCK_FLAG(verbose) = kWarningVerbosity;
- EXPECT_CALL(helper_, Foo(_))
- .WillOnce(Return(PrintMeNot()));
- helper_.Foo(PrintMeNot()); // This is an expected call.
- }
- TEST_F(GMockLogTest, DoesNotPrintGoodCallInternallyIfVerbosityIsError) {
- GMOCK_FLAG(verbose) = kErrorVerbosity;
- EXPECT_CALL(helper_, Foo(_))
- .WillOnce(Return(PrintMeNot()));
- helper_.Foo(PrintMeNot()); // This is an expected call.
- }
- TEST_F(GMockLogTest, DoesNotPrintWarningInternallyIfVerbosityIsError) {
- GMOCK_FLAG(verbose) = kErrorVerbosity;
- ON_CALL(helper_, Foo(_))
- .WillByDefault(Return(PrintMeNot()));
- helper_.Foo(PrintMeNot()); // This should generate a warning.
- }
- // Tests Mock::AllowLeak().
- TEST(AllowLeakTest, AllowsLeakingUnusedMockObject) {
- MockA* a = new MockA;
- Mock::AllowLeak(a);
- }
- TEST(AllowLeakTest, CanBeCalledBeforeOnCall) {
- MockA* a = new MockA;
- Mock::AllowLeak(a);
- ON_CALL(*a, DoA(_)).WillByDefault(Return());
- a->DoA(0);
- }
- TEST(AllowLeakTest, CanBeCalledAfterOnCall) {
- MockA* a = new MockA;
- ON_CALL(*a, DoA(_)).WillByDefault(Return());
- Mock::AllowLeak(a);
- }
- TEST(AllowLeakTest, CanBeCalledBeforeExpectCall) {
- MockA* a = new MockA;
- Mock::AllowLeak(a);
- EXPECT_CALL(*a, DoA(_));
- a->DoA(0);
- }
- TEST(AllowLeakTest, CanBeCalledAfterExpectCall) {
- MockA* a = new MockA;
- EXPECT_CALL(*a, DoA(_)).Times(AnyNumber());
- Mock::AllowLeak(a);
- }
- TEST(AllowLeakTest, WorksWhenBothOnCallAndExpectCallArePresent) {
- MockA* a = new MockA;
- ON_CALL(*a, DoA(_)).WillByDefault(Return());
- EXPECT_CALL(*a, DoA(_)).Times(AnyNumber());
- Mock::AllowLeak(a);
- }
- // Tests that we can verify and clear a mock object's expectations
- // when none of its methods has expectations.
- TEST(VerifyAndClearExpectationsTest, NoMethodHasExpectations) {
- MockB b;
- ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));
- // There should be no expectations on the methods now, so we can
- // freely call them.
- EXPECT_EQ(0, b.DoB());
- EXPECT_EQ(0, b.DoB(1));
- }
- // Tests that we can verify and clear a mock object's expectations
- // when some, but not all, of its methods have expectations *and* the
- // verification succeeds.
- TEST(VerifyAndClearExpectationsTest, SomeMethodsHaveExpectationsAndSucceed) {
- MockB b;
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(1));
- b.DoB();
- ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));
- // There should be no expectations on the methods now, so we can
- // freely call them.
- EXPECT_EQ(0, b.DoB());
- EXPECT_EQ(0, b.DoB(1));
- }
- // Tests that we can verify and clear a mock object's expectations
- // when some, but not all, of its methods have expectations *and* the
- // verification fails.
- TEST(VerifyAndClearExpectationsTest, SomeMethodsHaveExpectationsAndFail) {
- MockB b;
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(1));
- bool result = true;
- EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClearExpectations(&b),
- "Actual: never called");
- ASSERT_FALSE(result);
- // There should be no expectations on the methods now, so we can
- // freely call them.
- EXPECT_EQ(0, b.DoB());
- EXPECT_EQ(0, b.DoB(1));
- }
- // Tests that we can verify and clear a mock object's expectations
- // when all of its methods have expectations.
- TEST(VerifyAndClearExpectationsTest, AllMethodsHaveExpectations) {
- MockB b;
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(1));
- EXPECT_CALL(b, DoB(_))
- .WillOnce(Return(2));
- b.DoB();
- b.DoB(1);
- ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));
- // There should be no expectations on the methods now, so we can
- // freely call them.
- EXPECT_EQ(0, b.DoB());
- EXPECT_EQ(0, b.DoB(1));
- }
- // Tests that we can verify and clear a mock object's expectations
- // when a method has more than one expectation.
- TEST(VerifyAndClearExpectationsTest, AMethodHasManyExpectations) {
- MockB b;
- EXPECT_CALL(b, DoB(0))
- .WillOnce(Return(1));
- EXPECT_CALL(b, DoB(_))
- .WillOnce(Return(2));
- b.DoB(1);
- bool result = true;
- EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClearExpectations(&b),
- "Actual: never called");
- ASSERT_FALSE(result);
- // There should be no expectations on the methods now, so we can
- // freely call them.
- EXPECT_EQ(0, b.DoB());
- EXPECT_EQ(0, b.DoB(1));
- }
- // Tests that we can call VerifyAndClearExpectations() on the same
- // mock object multiple times.
- TEST(VerifyAndClearExpectationsTest, CanCallManyTimes) {
- MockB b;
- EXPECT_CALL(b, DoB());
- b.DoB();
- Mock::VerifyAndClearExpectations(&b);
- EXPECT_CALL(b, DoB(_))
- .WillOnce(Return(1));
- b.DoB(1);
- Mock::VerifyAndClearExpectations(&b);
- Mock::VerifyAndClearExpectations(&b);
- // There should be no expectations on the methods now, so we can
- // freely call them.
- EXPECT_EQ(0, b.DoB());
- EXPECT_EQ(0, b.DoB(1));
- }
- // Tests that we can clear a mock object's default actions when none
- // of its methods has default actions.
- TEST(VerifyAndClearTest, NoMethodHasDefaultActions) {
- MockB b;
- // If this crashes or generates a failure, the test will catch it.
- Mock::VerifyAndClear(&b);
- EXPECT_EQ(0, b.DoB());
- }
- // Tests that we can clear a mock object's default actions when some,
- // but not all of its methods have default actions.
- TEST(VerifyAndClearTest, SomeMethodsHaveDefaultActions) {
- MockB b;
- ON_CALL(b, DoB())
- .WillByDefault(Return(1));
- Mock::VerifyAndClear(&b);
- // Verifies that the default action of int DoB() was removed.
- EXPECT_EQ(0, b.DoB());
- }
- // Tests that we can clear a mock object's default actions when all of
- // its methods have default actions.
- TEST(VerifyAndClearTest, AllMethodsHaveDefaultActions) {
- MockB b;
- ON_CALL(b, DoB())
- .WillByDefault(Return(1));
- ON_CALL(b, DoB(_))
- .WillByDefault(Return(2));
- Mock::VerifyAndClear(&b);
- // Verifies that the default action of int DoB() was removed.
- EXPECT_EQ(0, b.DoB());
- // Verifies that the default action of int DoB(int) was removed.
- EXPECT_EQ(0, b.DoB(0));
- }
- // Tests that we can clear a mock object's default actions when a
- // method has more than one ON_CALL() set on it.
- TEST(VerifyAndClearTest, AMethodHasManyDefaultActions) {
- MockB b;
- ON_CALL(b, DoB(0))
- .WillByDefault(Return(1));
- ON_CALL(b, DoB(_))
- .WillByDefault(Return(2));
- Mock::VerifyAndClear(&b);
- // Verifies that the default actions (there are two) of int DoB(int)
- // were removed.
- EXPECT_EQ(0, b.DoB(0));
- EXPECT_EQ(0, b.DoB(1));
- }
- // Tests that we can call VerifyAndClear() on a mock object multiple
- // times.
- TEST(VerifyAndClearTest, CanCallManyTimes) {
- MockB b;
- ON_CALL(b, DoB())
- .WillByDefault(Return(1));
- Mock::VerifyAndClear(&b);
- Mock::VerifyAndClear(&b);
- ON_CALL(b, DoB(_))
- .WillByDefault(Return(1));
- Mock::VerifyAndClear(&b);
- EXPECT_EQ(0, b.DoB());
- EXPECT_EQ(0, b.DoB(1));
- }
- // Tests that VerifyAndClear() works when the verification succeeds.
- TEST(VerifyAndClearTest, Success) {
- MockB b;
- ON_CALL(b, DoB())
- .WillByDefault(Return(1));
- EXPECT_CALL(b, DoB(1))
- .WillOnce(Return(2));
- b.DoB();
- b.DoB(1);
- ASSERT_TRUE(Mock::VerifyAndClear(&b));
- // There should be no expectations on the methods now, so we can
- // freely call them.
- EXPECT_EQ(0, b.DoB());
- EXPECT_EQ(0, b.DoB(1));
- }
- // Tests that VerifyAndClear() works when the verification fails.
- TEST(VerifyAndClearTest, Failure) {
- MockB b;
- ON_CALL(b, DoB(_))
- .WillByDefault(Return(1));
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(2));
- b.DoB(1);
- bool result = true;
- EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClear(&b),
- "Actual: never called");
- ASSERT_FALSE(result);
- // There should be no expectations on the methods now, so we can
- // freely call them.
- EXPECT_EQ(0, b.DoB());
- EXPECT_EQ(0, b.DoB(1));
- }
- // Tests that VerifyAndClear() works when the default actions and
- // expectations are set on a const mock object.
- TEST(VerifyAndClearTest, Const) {
- MockB b;
- ON_CALL(Const(b), DoB())
- .WillByDefault(Return(1));
- EXPECT_CALL(Const(b), DoB())
- .WillOnce(DoDefault())
- .WillOnce(Return(2));
- b.DoB();
- b.DoB();
- ASSERT_TRUE(Mock::VerifyAndClear(&b));
- // There should be no expectations on the methods now, so we can
- // freely call them.
- EXPECT_EQ(0, b.DoB());
- EXPECT_EQ(0, b.DoB(1));
- }
- // Tests that we can set default actions and expectations on a mock
- // object after VerifyAndClear() has been called on it.
- TEST(VerifyAndClearTest, CanSetDefaultActionsAndExpectationsAfterwards) {
- MockB b;
- ON_CALL(b, DoB())
- .WillByDefault(Return(1));
- EXPECT_CALL(b, DoB(_))
- .WillOnce(Return(2));
- b.DoB(1);
- Mock::VerifyAndClear(&b);
- EXPECT_CALL(b, DoB())
- .WillOnce(Return(3));
- ON_CALL(b, DoB(_))
- .WillByDefault(Return(4));
- EXPECT_EQ(3, b.DoB());
- EXPECT_EQ(4, b.DoB(1));
- }
- // Tests that calling VerifyAndClear() on one mock object does not
- // affect other mock objects (either of the same type or not).
- TEST(VerifyAndClearTest, DoesNotAffectOtherMockObjects) {
- MockA a;
- MockB b1;
- MockB b2;
- ON_CALL(a, Binary(_, _))
- .WillByDefault(Return(true));
- EXPECT_CALL(a, Binary(_, _))
- .WillOnce(DoDefault())
- .WillOnce(Return(false));
- ON_CALL(b1, DoB())
- .WillByDefault(Return(1));
- EXPECT_CALL(b1, DoB(_))
- .WillOnce(Return(2));
- ON_CALL(b2, DoB())
- .WillByDefault(Return(3));
- EXPECT_CALL(b2, DoB(_));
- b2.DoB(0);
- Mock::VerifyAndClear(&b2);
- // Verifies that the default actions and expectations of a and b1
- // are still in effect.
- EXPECT_TRUE(a.Binary(0, 0));
- EXPECT_FALSE(a.Binary(0, 0));
- EXPECT_EQ(1, b1.DoB());
- EXPECT_EQ(2, b1.DoB(0));
- }
- TEST(VerifyAndClearTest,
- DestroyingChainedMocksDoesNotDeadlockThroughExpectations) {
- std::shared_ptr<MockA> a(new MockA);
- ReferenceHoldingMock test_mock;
- // EXPECT_CALL stores a reference to a inside test_mock.
- EXPECT_CALL(test_mock, AcceptReference(_))
- .WillRepeatedly(SetArgPointee<0>(a));
- // Throw away the reference to the mock that we have in a. After this, the
- // only reference to it is stored by test_mock.
- a.reset();
- // When test_mock goes out of scope, it destroys the last remaining reference
- // to the mock object originally pointed to by a. This will cause the MockA
- // destructor to be called from inside the ReferenceHoldingMock destructor.
- // The state of all mocks is protected by a single global lock, but there
- // should be no deadlock.
- }
- TEST(VerifyAndClearTest,
- DestroyingChainedMocksDoesNotDeadlockThroughDefaultAction) {
- std::shared_ptr<MockA> a(new MockA);
- ReferenceHoldingMock test_mock;
- // ON_CALL stores a reference to a inside test_mock.
- ON_CALL(test_mock, AcceptReference(_))
- .WillByDefault(SetArgPointee<0>(a));
- // Throw away the reference to the mock that we have in a. After this, the
- // only reference to it is stored by test_mock.
- a.reset();
- // When test_mock goes out of scope, it destroys the last remaining reference
- // to the mock object originally pointed to by a. This will cause the MockA
- // destructor to be called from inside the ReferenceHoldingMock destructor.
- // The state of all mocks is protected by a single global lock, but there
- // should be no deadlock.
- }
- // Tests that a mock function's action can call a mock function
- // (either the same function or a different one) either as an explicit
- // action or as a default action without causing a dead lock. It
- // verifies that the action is not performed inside the critical
- // section.
- TEST(SynchronizationTest, CanCallMockMethodInAction) {
- MockA a;
- MockC c;
- ON_CALL(a, DoA(_))
- .WillByDefault(IgnoreResult(InvokeWithoutArgs(&c,
- &MockC::NonVoidMethod)));
- EXPECT_CALL(a, DoA(1));
- EXPECT_CALL(a, DoA(1))
- .WillOnce(Invoke(&a, &MockA::DoA))
- .RetiresOnSaturation();
- EXPECT_CALL(c, NonVoidMethod());
- a.DoA(1);
- // This will match the second EXPECT_CALL() and trigger another a.DoA(1),
- // which will in turn match the first EXPECT_CALL() and trigger a call to
- // c.NonVoidMethod() that was specified by the ON_CALL() since the first
- // EXPECT_CALL() did not specify an action.
- }
- TEST(ParameterlessExpectationsTest, CanSetExpectationsWithoutMatchers) {
- MockA a;
- int do_a_arg0 = 0;
- ON_CALL(a, DoA).WillByDefault(SaveArg<0>(&do_a_arg0));
- int do_a_47_arg0 = 0;
- ON_CALL(a, DoA(47)).WillByDefault(SaveArg<0>(&do_a_47_arg0));
- a.DoA(17);
- EXPECT_THAT(do_a_arg0, 17);
- EXPECT_THAT(do_a_47_arg0, 0);
- a.DoA(47);
- EXPECT_THAT(do_a_arg0, 17);
- EXPECT_THAT(do_a_47_arg0, 47);
- ON_CALL(a, Binary).WillByDefault(Return(true));
- ON_CALL(a, Binary(_, 14)).WillByDefault(Return(false));
- EXPECT_THAT(a.Binary(14, 17), true);
- EXPECT_THAT(a.Binary(17, 14), false);
- }
- TEST(ParameterlessExpectationsTest, CanSetExpectationsForOverloadedMethods) {
- MockB b;
- ON_CALL(b, DoB()).WillByDefault(Return(9));
- ON_CALL(b, DoB(5)).WillByDefault(Return(11));
- EXPECT_THAT(b.DoB(), 9);
- EXPECT_THAT(b.DoB(1), 0); // default value
- EXPECT_THAT(b.DoB(5), 11);
- }
- struct MockWithConstMethods {
- public:
- MOCK_CONST_METHOD1(Foo, int(int));
- MOCK_CONST_METHOD2(Bar, int(int, const char*));
- };
- TEST(ParameterlessExpectationsTest, CanSetExpectationsForConstMethods) {
- MockWithConstMethods mock;
- ON_CALL(mock, Foo).WillByDefault(Return(7));
- ON_CALL(mock, Bar).WillByDefault(Return(33));
- EXPECT_THAT(mock.Foo(17), 7);
- EXPECT_THAT(mock.Bar(27, "purple"), 33);
- }
- class MockConstOverload {
- public:
- MOCK_METHOD1(Overloaded, int(int));
- MOCK_CONST_METHOD1(Overloaded, int(int));
- };
- TEST(ParameterlessExpectationsTest,
- CanSetExpectationsForConstOverloadedMethods) {
- MockConstOverload mock;
- ON_CALL(mock, Overloaded(_)).WillByDefault(Return(7));
- ON_CALL(mock, Overloaded(5)).WillByDefault(Return(9));
- ON_CALL(Const(mock), Overloaded(5)).WillByDefault(Return(11));
- ON_CALL(Const(mock), Overloaded(7)).WillByDefault(Return(13));
- EXPECT_THAT(mock.Overloaded(1), 7);
- EXPECT_THAT(mock.Overloaded(5), 9);
- EXPECT_THAT(mock.Overloaded(7), 7);
- const MockConstOverload& const_mock = mock;
- EXPECT_THAT(const_mock.Overloaded(1), 0);
- EXPECT_THAT(const_mock.Overloaded(5), 11);
- EXPECT_THAT(const_mock.Overloaded(7), 13);
- }
- } // namespace
- // Allows the user to define their own main and then invoke gmock_main
- // from it. This might be necessary on some platforms which require
- // specific setup and teardown.
- #if GMOCK_RENAME_MAIN
- int gmock_main(int argc, char **argv) {
- #else
- int main(int argc, char **argv) {
- #endif // GMOCK_RENAME_MAIN
- testing::InitGoogleMock(&argc, argv);
- // Ensures that the tests pass no matter what value of
- // --gmock_catch_leaked_mocks and --gmock_verbose the user specifies.
- testing::GMOCK_FLAG(catch_leaked_mocks) = true;
- testing::GMOCK_FLAG(verbose) = testing::internal::kWarningVerbosity;
- return RUN_ALL_TESTS();
- }
|