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