| // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 | // | 
 | // This test is a simple sanity check to make sure gmock is able to build/link | 
 | // correctly.  It just instantiates a mock object and runs through a couple of | 
 | // the basic mock features. | 
 |  | 
 | #include "testing/gmock/include/gmock/gmock.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | // Gmock matchers and actions that we use below. | 
 | using testing::AnyOf; | 
 | using testing::Eq; | 
 | using testing::Return; | 
 | using testing::SetArgPointee; | 
 | using testing::WithArg; | 
 | using testing::_; | 
 |  | 
 | namespace { | 
 |  | 
 | // Simple class that we can mock out the behavior for.  Everything is virtual | 
 | // for easy mocking. | 
 | class SampleClass { | 
 |  public: | 
 |   SampleClass() = default; | 
 |   virtual ~SampleClass() = default; | 
 |  | 
 |   virtual int ReturnSomething() { | 
 |     return -1; | 
 |   } | 
 |  | 
 |   virtual void ReturnNothingConstly() const { | 
 |   } | 
 |  | 
 |   virtual void OutputParam(int* a) { | 
 |   } | 
 |  | 
 |   virtual int ReturnSecond(int a, int b) { | 
 |     return b; | 
 |   } | 
 | }; | 
 |  | 
 | // Declare a mock for the class. | 
 | class MockSampleClass : public SampleClass { | 
 |  public: | 
 |   MOCK_METHOD0(ReturnSomething, int()); | 
 |   MOCK_CONST_METHOD0(ReturnNothingConstly, void()); | 
 |   MOCK_METHOD1(OutputParam, void(int* a)); | 
 |   MOCK_METHOD2(ReturnSecond, int(int a, int b)); | 
 | }; | 
 |  | 
 | // Create a couple of custom actions.  Custom actions can be used for adding | 
 | // more complex behavior into your mock...though if you start needing these, ask | 
 | // if you're asking your mock to do too much. | 
 | ACTION(ReturnVal) { | 
 |   // Return the first argument received. | 
 |   return arg0; | 
 | } | 
 | ACTION(ReturnSecond) { | 
 |   // Returns the second argument.  This basically implemetns ReturnSecond. | 
 |   return arg1; | 
 | } | 
 |  | 
 | TEST(GmockTest, SimpleMatchAndActions) { | 
 |   // Basic test of some simple gmock matchers, actions, and cardinality | 
 |   // expectations. | 
 |   MockSampleClass mock; | 
 |  | 
 |   EXPECT_CALL(mock, ReturnSomething()) | 
 |       .WillOnce(Return(1)) | 
 |       .WillOnce(Return(2)) | 
 |       .WillOnce(Return(3)); | 
 |   EXPECT_EQ(1, mock.ReturnSomething()); | 
 |   EXPECT_EQ(2, mock.ReturnSomething()); | 
 |   EXPECT_EQ(3, mock.ReturnSomething()); | 
 |  | 
 |   EXPECT_CALL(mock, ReturnNothingConstly()).Times(2); | 
 |   mock.ReturnNothingConstly(); | 
 |   mock.ReturnNothingConstly(); | 
 | } | 
 |  | 
 | TEST(GmockTest, AssignArgument) { | 
 |   // Capture an argument for examination. | 
 |   MockSampleClass mock; | 
 |  | 
 |   EXPECT_CALL(mock, OutputParam(_)).WillRepeatedly(SetArgPointee<0>(5)); | 
 |  | 
 |   int arg = 0; | 
 |   mock.OutputParam(&arg); | 
 |   EXPECT_EQ(5, arg); | 
 | } | 
 |  | 
 | TEST(GmockTest, SideEffects) { | 
 |   // Capture an argument for examination. | 
 |   MockSampleClass mock; | 
 |  | 
 |   EXPECT_CALL(mock, OutputParam(_)).WillRepeatedly(SetArgPointee<0>(5)); | 
 |  | 
 |   int arg = 0; | 
 |   mock.OutputParam(&arg); | 
 |   EXPECT_EQ(5, arg); | 
 | } | 
 |  | 
 | TEST(GmockTest, CustomAction_ReturnSecond) { | 
 |   // Test a mock of the ReturnSecond behavior using an action that provides an | 
 |   // alternate implementation of the function.  Danger here though, this is | 
 |   // starting to add too much behavior of the mock, which means the mock | 
 |   // implementation might start to have bugs itself. | 
 |   MockSampleClass mock; | 
 |  | 
 |   EXPECT_CALL(mock, ReturnSecond(_, AnyOf(Eq(4), Eq(5)))) | 
 |       .WillRepeatedly(ReturnSecond()); | 
 |   EXPECT_EQ(4, mock.ReturnSecond(-1, 4)); | 
 |   EXPECT_EQ(5, mock.ReturnSecond(0, 5)); | 
 |   EXPECT_EQ(4, mock.ReturnSecond(0xdeadbeef, 4)); | 
 |   EXPECT_EQ(4, mock.ReturnSecond(112358, 4)); | 
 |   EXPECT_EQ(5, mock.ReturnSecond(1337, 5)); | 
 | } | 
 |  | 
 | TEST(GmockTest, CustomAction_ReturnVal) { | 
 |   // Alternate implemention of ReturnSecond using a more general custom action, | 
 |   // and a WithArg adapter to bridge the interfaces. | 
 |   MockSampleClass mock; | 
 |  | 
 |   EXPECT_CALL(mock, ReturnSecond(_, AnyOf(Eq(4), Eq(5)))) | 
 |       .WillRepeatedly(WithArg<1>(ReturnVal())); | 
 |   EXPECT_EQ(4, mock.ReturnSecond(-1, 4)); | 
 |   EXPECT_EQ(5, mock.ReturnSecond(0, 5)); | 
 |   EXPECT_EQ(4, mock.ReturnSecond(0xdeadbeef, 4)); | 
 |   EXPECT_EQ(4, mock.ReturnSecond(112358, 4)); | 
 |   EXPECT_EQ(5, mock.ReturnSecond(1337, 5)); | 
 | } | 
 |  | 
 | }  // namespace |