xref: /freebsd-src/contrib/googletest/googlemock/test/gmock_test.cc (revision 28f6c2f292806bf31230a959bc4b19d7081669a7)
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