15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2009 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test is a simple sanity check to make sure gmock is able to build/link
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly.  It just instantiates a mock object and runs through a couple of
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the basic mock features.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gmock matchers and actions that we use below.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyOf;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Eq;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::SetArgumentPointee;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::WithArg;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simple class that we can mock out the behavior for.  Everything is virtual
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for easy mocking.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SampleClass {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SampleClass() {}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SampleClass() {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int ReturnSomething() {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -1;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReturnNothingConstly() const {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OutputParam(int* a) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int ReturnSecond(int a, int b) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return b;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Declare a mock for the class.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockSampleClass : public SampleClass {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(ReturnSomething, int());
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(ReturnNothingConstly, void());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(OutputParam, void(int* a));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(ReturnSecond, int(int a, int b));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a couple of custom actions.  Custom actions can be used for adding
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// more complex behavior into your mock...though if you start needing these, ask
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if you're asking your mock to do too much.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(ReturnVal) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the first argument received.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(ReturnSecond) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the second argument.  This basically implemetns ReturnSecond.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg1;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GmockTest, SimpleMatchAndActions) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Basic test of some simple gmock matchers, actions, and cardinality
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expectations.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockSampleClass mock;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, ReturnSomething())
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(1))
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(2))
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(3));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, mock.ReturnSomething());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, mock.ReturnSomething());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, mock.ReturnSomething());
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, ReturnNothingConstly()).Times(2);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock.ReturnNothingConstly();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock.ReturnNothingConstly();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GmockTest, AssignArgument) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Capture an argument for examination.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockSampleClass mock;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, OutputParam(_))
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(SetArgumentPointee<0>(5));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int arg = 0;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock.OutputParam(&arg);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, arg);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GmockTest, SideEffects) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Capture an argument for examination.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockSampleClass mock;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, OutputParam(_))
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(SetArgumentPointee<0>(5));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int arg = 0;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock.OutputParam(&arg);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, arg);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GmockTest, CustomAction_ReturnSecond) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test a mock of the ReturnSecond behavior using an action that provides an
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // alternate implementation of the function.  Danger here though, this is
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // starting to add too much behavior of the mock, which means the mock
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implementation might start to have bugs itself.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockSampleClass mock;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, ReturnSecond(_, AnyOf(Eq(4), Eq(5))))
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(ReturnSecond());
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, mock.ReturnSecond(-1, 4));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, mock.ReturnSecond(0, 5));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, mock.ReturnSecond(0xdeadbeef, 4));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, mock.ReturnSecond(112358, 4));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, mock.ReturnSecond(1337, 5));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GmockTest, CustomAction_ReturnVal) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Alternate implemention of ReturnSecond using a more general custom action,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and a WithArg adapter to bridge the interfaces.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockSampleClass mock;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, ReturnSecond(_, AnyOf(Eq(4), Eq(5))))
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(WithArg<1>(ReturnVal()));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, mock.ReturnSecond(-1, 4));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, mock.ReturnSecond(0, 5));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, mock.ReturnSecond(0xdeadbeef, 4));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, mock.ReturnSecond(112358, 4));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, mock.ReturnSecond(1337, 5));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
138