gmock_test.cc revision 13481
1// Copyright 2008, Google Inc. 2// All rights reserved. 3// 4// Redistribution and use in source and binary forms, with or without 5// modification, are permitted provided that the following conditions are 6// met: 7// 8// * Redistributions of source code must retain the above copyright 9// notice, this list of conditions and the following disclaimer. 10// * Redistributions in binary form must reproduce the above 11// copyright notice, this list of conditions and the following disclaimer 12// in the documentation and/or other materials provided with the 13// distribution. 14// * Neither the name of Google Inc. nor the names of its 15// contributors may be used to endorse or promote products derived from 16// this software without specific prior written permission. 17// 18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29// 30// Author: wan@google.com (Zhanyong Wan) 31 32// Google Mock - a framework for writing C++ mock classes. 33// 34// This file tests code in gmock.cc. 35 36#include "gmock/gmock.h" 37 38#include <string> 39#include "gtest/gtest.h" 40 41#if !defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) 42 43using testing::GMOCK_FLAG(verbose); 44using testing::InitGoogleMock; 45 46// Verifies that calling InitGoogleMock() on argv results in new_argv, 47// and the gmock_verbose flag's value is set to expected_gmock_verbose. 48template <typename Char, int M, int N> 49void TestInitGoogleMock(const Char* (&argv)[M], const Char* (&new_argv)[N], 50 const ::std::string& expected_gmock_verbose) { 51 const ::std::string old_verbose = GMOCK_FLAG(verbose); 52 53 int argc = M; 54 InitGoogleMock(&argc, const_cast<Char**>(argv)); 55 ASSERT_EQ(N, argc) << "The new argv has wrong number of elements."; 56 57 for (int i = 0; i < N; i++) { 58 EXPECT_STREQ(new_argv[i], argv[i]); 59 } 60 61 EXPECT_EQ(expected_gmock_verbose, GMOCK_FLAG(verbose).c_str()); 62 GMOCK_FLAG(verbose) = old_verbose; // Restores the gmock_verbose flag. 63} 64 65TEST(InitGoogleMockTest, ParsesInvalidCommandLine) { 66 const char* argv[] = { 67 NULL 68 }; 69 70 const char* new_argv[] = { 71 NULL 72 }; 73 74 TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose)); 75} 76 77TEST(InitGoogleMockTest, ParsesEmptyCommandLine) { 78 const char* argv[] = { 79 "foo.exe", 80 NULL 81 }; 82 83 const char* new_argv[] = { 84 "foo.exe", 85 NULL 86 }; 87 88 TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose)); 89} 90 91TEST(InitGoogleMockTest, ParsesSingleFlag) { 92 const char* argv[] = { 93 "foo.exe", 94 "--gmock_verbose=info", 95 NULL 96 }; 97 98 const char* new_argv[] = { 99 "foo.exe", 100 NULL 101 }; 102 103 TestInitGoogleMock(argv, new_argv, "info"); 104} 105 106TEST(InitGoogleMockTest, ParsesUnrecognizedFlag) { 107 const char* argv[] = { 108 "foo.exe", 109 "--non_gmock_flag=blah", 110 NULL 111 }; 112 113 const char* new_argv[] = { 114 "foo.exe", 115 "--non_gmock_flag=blah", 116 NULL 117 }; 118 119 TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose)); 120} 121 122TEST(InitGoogleMockTest, ParsesGoogleMockFlagAndUnrecognizedFlag) { 123 const char* argv[] = { 124 "foo.exe", 125 "--non_gmock_flag=blah", 126 "--gmock_verbose=error", 127 NULL 128 }; 129 130 const char* new_argv[] = { 131 "foo.exe", 132 "--non_gmock_flag=blah", 133 NULL 134 }; 135 136 TestInitGoogleMock(argv, new_argv, "error"); 137} 138 139TEST(WideInitGoogleMockTest, ParsesInvalidCommandLine) { 140 const wchar_t* argv[] = { 141 NULL 142 }; 143 144 const wchar_t* new_argv[] = { 145 NULL 146 }; 147 148 TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose)); 149} 150 151TEST(WideInitGoogleMockTest, ParsesEmptyCommandLine) { 152 const wchar_t* argv[] = { 153 L"foo.exe", 154 NULL 155 }; 156 157 const wchar_t* new_argv[] = { 158 L"foo.exe", 159 NULL 160 }; 161 162 TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose)); 163} 164 165TEST(WideInitGoogleMockTest, ParsesSingleFlag) { 166 const wchar_t* argv[] = { 167 L"foo.exe", 168 L"--gmock_verbose=info", 169 NULL 170 }; 171 172 const wchar_t* new_argv[] = { 173 L"foo.exe", 174 NULL 175 }; 176 177 TestInitGoogleMock(argv, new_argv, "info"); 178} 179 180TEST(WideInitGoogleMockTest, ParsesUnrecognizedFlag) { 181 const wchar_t* argv[] = { 182 L"foo.exe", 183 L"--non_gmock_flag=blah", 184 NULL 185 }; 186 187 const wchar_t* new_argv[] = { 188 L"foo.exe", 189 L"--non_gmock_flag=blah", 190 NULL 191 }; 192 193 TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose)); 194} 195 196TEST(WideInitGoogleMockTest, ParsesGoogleMockFlagAndUnrecognizedFlag) { 197 const wchar_t* argv[] = { 198 L"foo.exe", 199 L"--non_gmock_flag=blah", 200 L"--gmock_verbose=error", 201 NULL 202 }; 203 204 const wchar_t* new_argv[] = { 205 L"foo.exe", 206 L"--non_gmock_flag=blah", 207 NULL 208 }; 209 210 TestInitGoogleMock(argv, new_argv, "error"); 211} 212 213#endif // !defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) 214 215// Makes sure Google Mock flags can be accessed in code. 216TEST(FlagTest, IsAccessibleInCode) { 217 bool dummy = testing::GMOCK_FLAG(catch_leaked_mocks) && 218 testing::GMOCK_FLAG(verbose) == ""; 219 (void)dummy; // Avoids the "unused local variable" warning. 220} 221