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 (at) 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 using testing::GMOCK_FLAG(verbose); 42 using testing::InitGoogleMock; 43 using testing::internal::g_init_gtest_count; 44 45 // Verifies that calling InitGoogleMock() on argv results in new_argv, 46 // and the gmock_verbose flag's value is set to expected_gmock_verbose. 47 template <typename Char, int M, int N> 48 void TestInitGoogleMock(const Char* (&argv)[M], const Char* (&new_argv)[N], 49 const ::std::string& expected_gmock_verbose) { 50 const ::std::string old_verbose = GMOCK_FLAG(verbose); 51 52 int argc = M; 53 InitGoogleMock(&argc, const_cast<Char**>(argv)); 54 ASSERT_EQ(N, argc) << "The new argv has wrong number of elements."; 55 56 for (int i = 0; i < N; i++) { 57 EXPECT_STREQ(new_argv[i], argv[i]); 58 } 59 60 EXPECT_EQ(expected_gmock_verbose, GMOCK_FLAG(verbose).c_str()); 61 GMOCK_FLAG(verbose) = old_verbose; // Restores the gmock_verbose flag. 62 } 63 64 TEST(InitGoogleMockTest, ParsesInvalidCommandLine) { 65 const char* argv[] = { 66 NULL 67 }; 68 69 const char* new_argv[] = { 70 NULL 71 }; 72 73 TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose)); 74 } 75 76 TEST(InitGoogleMockTest, ParsesEmptyCommandLine) { 77 const char* argv[] = { 78 "foo.exe", 79 NULL 80 }; 81 82 const char* new_argv[] = { 83 "foo.exe", 84 NULL 85 }; 86 87 TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose)); 88 } 89 90 TEST(InitGoogleMockTest, ParsesSingleFlag) { 91 const char* argv[] = { 92 "foo.exe", 93 "--gmock_verbose=info", 94 NULL 95 }; 96 97 const char* new_argv[] = { 98 "foo.exe", 99 NULL 100 }; 101 102 TestInitGoogleMock(argv, new_argv, "info"); 103 } 104 105 TEST(InitGoogleMockTest, ParsesUnrecognizedFlag) { 106 const char* argv[] = { 107 "foo.exe", 108 "--non_gmock_flag=blah", 109 NULL 110 }; 111 112 const char* new_argv[] = { 113 "foo.exe", 114 "--non_gmock_flag=blah", 115 NULL 116 }; 117 118 TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose)); 119 } 120 121 TEST(InitGoogleMockTest, ParsesGoogleMockFlagAndUnrecognizedFlag) { 122 const char* argv[] = { 123 "foo.exe", 124 "--non_gmock_flag=blah", 125 "--gmock_verbose=error", 126 NULL 127 }; 128 129 const char* new_argv[] = { 130 "foo.exe", 131 "--non_gmock_flag=blah", 132 NULL 133 }; 134 135 TestInitGoogleMock(argv, new_argv, "error"); 136 } 137 138 TEST(InitGoogleMockTest, CallsInitGoogleTest) { 139 const int old_init_gtest_count = g_init_gtest_count; 140 const char* argv[] = { 141 "foo.exe", 142 "--non_gmock_flag=blah", 143 "--gmock_verbose=error", 144 NULL 145 }; 146 147 const char* new_argv[] = { 148 "foo.exe", 149 "--non_gmock_flag=blah", 150 NULL 151 }; 152 153 TestInitGoogleMock(argv, new_argv, "error"); 154 EXPECT_EQ(old_init_gtest_count + 1, g_init_gtest_count); 155 } 156 157 TEST(WideInitGoogleMockTest, ParsesInvalidCommandLine) { 158 const wchar_t* argv[] = { 159 NULL 160 }; 161 162 const wchar_t* new_argv[] = { 163 NULL 164 }; 165 166 TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose)); 167 } 168 169 TEST(WideInitGoogleMockTest, ParsesEmptyCommandLine) { 170 const wchar_t* argv[] = { 171 L"foo.exe", 172 NULL 173 }; 174 175 const wchar_t* new_argv[] = { 176 L"foo.exe", 177 NULL 178 }; 179 180 TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose)); 181 } 182 183 TEST(WideInitGoogleMockTest, ParsesSingleFlag) { 184 const wchar_t* argv[] = { 185 L"foo.exe", 186 L"--gmock_verbose=info", 187 NULL 188 }; 189 190 const wchar_t* new_argv[] = { 191 L"foo.exe", 192 NULL 193 }; 194 195 TestInitGoogleMock(argv, new_argv, "info"); 196 } 197 198 TEST(WideInitGoogleMockTest, ParsesUnrecognizedFlag) { 199 const wchar_t* argv[] = { 200 L"foo.exe", 201 L"--non_gmock_flag=blah", 202 NULL 203 }; 204 205 const wchar_t* new_argv[] = { 206 L"foo.exe", 207 L"--non_gmock_flag=blah", 208 NULL 209 }; 210 211 TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose)); 212 } 213 214 TEST(WideInitGoogleMockTest, ParsesGoogleMockFlagAndUnrecognizedFlag) { 215 const wchar_t* argv[] = { 216 L"foo.exe", 217 L"--non_gmock_flag=blah", 218 L"--gmock_verbose=error", 219 NULL 220 }; 221 222 const wchar_t* new_argv[] = { 223 L"foo.exe", 224 L"--non_gmock_flag=blah", 225 NULL 226 }; 227 228 TestInitGoogleMock(argv, new_argv, "error"); 229 } 230 231 TEST(WideInitGoogleMockTest, CallsInitGoogleTest) { 232 const int old_init_gtest_count = g_init_gtest_count; 233 const wchar_t* argv[] = { 234 L"foo.exe", 235 L"--non_gmock_flag=blah", 236 L"--gmock_verbose=error", 237 NULL 238 }; 239 240 const wchar_t* new_argv[] = { 241 L"foo.exe", 242 L"--non_gmock_flag=blah", 243 NULL 244 }; 245 246 TestInitGoogleMock(argv, new_argv, "error"); 247 EXPECT_EQ(old_init_gtest_count + 1, g_init_gtest_count); 248 } 249 250 // Makes sure Google Mock flags can be accessed in code. 251 TEST(FlagTest, IsAccessibleInCode) { 252 bool dummy = testing::GMOCK_FLAG(catch_leaked_mocks) && 253 testing::GMOCK_FLAG(verbose) == ""; 254 (void)dummy; // Avoids the "unused local variable" warning. 255 } 256