1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright 2008, Google Inc. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// All rights reserved. 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Redistribution and use in source and binary forms, with or without 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// modification, are permitted provided that the following conditions are 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// met: 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Redistributions of source code must retain the above copyright 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notice, this list of conditions and the following disclaimer. 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Redistributions in binary form must reproduce the above 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// copyright notice, this list of conditions and the following disclaimer 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the documentation and/or other materials provided with the 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// distribution. 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Neither the name of Google Inc. nor the names of its 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// contributors may be used to endorse or promote products derived from 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this software without specific prior written permission. 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Author: wan@google.com (Zhanyong Wan) 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gmock/gmock-generated-nice-strict.h" 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gmock/gmock.h" 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gtest/gtest.h" 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gtest/gtest-spi.h" 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This must not be defined inside the ::testing namespace, or it will 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// clash with ::testing::Mock. 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Mock { 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Mock() {} 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MOCK_METHOD0(DoThis, void()); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTEST_DISALLOW_COPY_AND_ASSIGN_(Mock); 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing { 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace gmock_nice_strict_test { 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::internal::string; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::GMOCK_FLAG(verbose); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::HasSubstr; 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::NiceMock; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::StrictMock; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if GTEST_HAS_STREAM_REDIRECTION 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::internal::CaptureStdout; 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::internal::GetCapturedStdout; 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Defines some mock classes needed by the tests. 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Foo { 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~Foo() {} 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void DoThis() = 0; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual int DoThat(bool flag) = 0; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockFoo : public Foo { 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockFoo() {} 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Delete() { delete this; } 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MOCK_METHOD0(DoThis, void()); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MOCK_METHOD1(DoThat, int(bool flag)); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockBar { 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit MockBar(const string& s) : str_(s) {} 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockBar(char a1, char a2, string a3, string a4, int a5, int a6, 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string& a7, const string& a8, bool a9, bool a10) { 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch str_ = string() + a1 + a2 + a3 + a4 + static_cast<char>(a5) + 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<char>(a6) + a7 + a8 + (a9 ? 'T' : 'F') + (a10 ? 'T' : 'F'); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~MockBar() {} 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string& str() const { return str_; } 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MOCK_METHOD0(This, int()); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MOCK_METHOD2(That, string(int, bool)); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string str_; 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTEST_DISALLOW_COPY_AND_ASSIGN_(MockBar); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if GTEST_HAS_STREAM_REDIRECTION 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that a nice mock generates no warning for uninteresting calls. 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, NoWarningForUninterestingCall) { 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NiceMock<MockFoo> nice_foo; 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CaptureStdout(); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nice_foo.DoThis(); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nice_foo.DoThat(true); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("", GetCapturedStdout().c_str()); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that a nice mock generates no warning for uninteresting calls 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// that delete the mock object. 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, NoWarningForUninterestingCallAfterDeath) { 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NiceMock<MockFoo>* const nice_foo = new NiceMock<MockFoo>; 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ON_CALL(*nice_foo, DoThis()) 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch .WillByDefault(Invoke(nice_foo, &MockFoo::Delete)); 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CaptureStdout(); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nice_foo->DoThis(); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("", GetCapturedStdout().c_str()); 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that a nice mock generates informational logs for 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// uninteresting calls. 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, InfoForUninterestingCall) { 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NiceMock<MockFoo> nice_foo; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string saved_flag = GMOCK_FLAG(verbose); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GMOCK_FLAG(verbose) = "info"; 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CaptureStdout(); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nice_foo.DoThis(); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_THAT(GetCapturedStdout(), 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HasSubstr("Uninteresting mock function call")); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CaptureStdout(); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nice_foo.DoThat(true); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_THAT(GetCapturedStdout(), 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HasSubstr("Uninteresting mock function call")); 1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GMOCK_FLAG(verbose) = saved_flag; 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif // GTEST_HAS_STREAM_REDIRECTION 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that a nice mock allows expected calls. 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, AllowsExpectedCall) { 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NiceMock<MockFoo> nice_foo; 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL(nice_foo, DoThis()); 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nice_foo.DoThis(); 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that an unexpected call on a nice mock fails. 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, UnexpectedCallFails) { 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NiceMock<MockFoo> nice_foo; 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL(nice_foo, DoThis()).Times(0); 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(nice_foo.DoThis(), "called more times than expected"); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that NiceMock works with a mock class that has a non-default 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// constructor. 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, NonDefaultConstructor) { 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NiceMock<MockBar> nice_bar("hi"); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("hi", nice_bar.str()); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nice_bar.This(); 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nice_bar.That(5, true); 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that NiceMock works with a mock class that has a 10-ary 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// non-default constructor. 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, NonDefaultConstructor10) { 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NiceMock<MockBar> nice_bar('a', 'b', "c", "d", 'e', 'f', 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "g", "h", true, false); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("abcdefghTF", nice_bar.str()); 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nice_bar.This(); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nice_bar.That(5, true); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that NiceMock<Mock> compiles where Mock is a user-defined 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// class (as opposed to ::testing::Mock). We had to workaround an 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// MSVC 8.0 bug that caused the symbol Mock used in the definition of 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NiceMock to be looked up in the wrong context, and this test 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ensures that our fix works. 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We have to skip this test on Symbian and Windows Mobile, as it 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// causes the program to crash there, for reasons unclear to us yet. 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, AcceptsClassNamedMock) { 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NiceMock< ::Mock> nice; 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL(nice, DoThis()); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nice.DoThis(); 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that a strict mock allows expected calls. 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, AllowsExpectedCall) { 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StrictMock<MockFoo> strict_foo; 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL(strict_foo, DoThis()); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch strict_foo.DoThis(); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that an unexpected call on a strict mock fails. 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, UnexpectedCallFails) { 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StrictMock<MockFoo> strict_foo; 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL(strict_foo, DoThis()).Times(0); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(), 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "called more times than expected"); 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that an uninteresting call on a strict mock fails. 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, UninterestingCallFails) { 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StrictMock<MockFoo> strict_foo; 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(), 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Uninteresting mock function call"); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that an uninteresting call on a strict mock fails, even if 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the call deletes the mock object. 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, UninterestingCallFailsAfterDeath) { 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StrictMock<MockFoo>* const strict_foo = new StrictMock<MockFoo>; 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ON_CALL(*strict_foo, DoThis()) 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch .WillByDefault(Invoke(strict_foo, &MockFoo::Delete)); 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(strict_foo->DoThis(), 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Uninteresting mock function call"); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that StrictMock works with a mock class that has a 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// non-default constructor. 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, NonDefaultConstructor) { 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StrictMock<MockBar> strict_bar("hi"); 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("hi", strict_bar.str()); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true), 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Uninteresting mock function call"); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that StrictMock works with a mock class that has a 10-ary 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// non-default constructor. 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, NonDefaultConstructor10) { 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StrictMock<MockBar> strict_bar('a', 'b', "c", "d", 'e', 'f', 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "g", "h", true, false); 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("abcdefghTF", strict_bar.str()); 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true), 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Uninteresting mock function call"); 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that StrictMock<Mock> compiles where Mock is a user-defined 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// class (as opposed to ::testing::Mock). We had to workaround an 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// MSVC 8.0 bug that caused the symbol Mock used in the definition of 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// StrictMock to be looked up in the wrong context, and this test 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ensures that our fix works. 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We have to skip this test on Symbian and Windows Mobile, as it 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// causes the program to crash there, for reasons unclear to us yet. 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, AcceptsClassNamedMock) { 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StrictMock< ::Mock> strict; 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL(strict, DoThis()); 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch strict.DoThis(); 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace gmock_nice_strict_test 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace testing 285