113481Sgiacomo.travaglini@arm.com// Copyright 2008, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3113481Sgiacomo.travaglini@arm.com
3213481Sgiacomo.travaglini@arm.com// Google Mock - a framework for writing C++ mock classes.
3313481Sgiacomo.travaglini@arm.com//
3413481Sgiacomo.travaglini@arm.com// This file tests code in gmock.cc.
3513481Sgiacomo.travaglini@arm.com
3613481Sgiacomo.travaglini@arm.com#include "gmock/gmock.h"
3713481Sgiacomo.travaglini@arm.com
3813481Sgiacomo.travaglini@arm.com#include <string>
3913481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h"
4013481Sgiacomo.travaglini@arm.com
4113481Sgiacomo.travaglini@arm.com#if !defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
4213481Sgiacomo.travaglini@arm.com
4313481Sgiacomo.travaglini@arm.comusing testing::GMOCK_FLAG(verbose);
4413481Sgiacomo.travaglini@arm.comusing testing::InitGoogleMock;
4513481Sgiacomo.travaglini@arm.com
4613481Sgiacomo.travaglini@arm.com// Verifies that calling InitGoogleMock() on argv results in new_argv,
4713481Sgiacomo.travaglini@arm.com// and the gmock_verbose flag's value is set to expected_gmock_verbose.
4813481Sgiacomo.travaglini@arm.comtemplate <typename Char, int M, int N>
4913481Sgiacomo.travaglini@arm.comvoid TestInitGoogleMock(const Char* (&argv)[M], const Char* (&new_argv)[N],
5013481Sgiacomo.travaglini@arm.com                        const ::std::string& expected_gmock_verbose) {
5113481Sgiacomo.travaglini@arm.com  const ::std::string old_verbose = GMOCK_FLAG(verbose);
5213481Sgiacomo.travaglini@arm.com
5313481Sgiacomo.travaglini@arm.com  int argc = M;
5413481Sgiacomo.travaglini@arm.com  InitGoogleMock(&argc, const_cast<Char**>(argv));
5513481Sgiacomo.travaglini@arm.com  ASSERT_EQ(N, argc) << "The new argv has wrong number of elements.";
5613481Sgiacomo.travaglini@arm.com
5713481Sgiacomo.travaglini@arm.com  for (int i = 0; i < N; i++) {
5813481Sgiacomo.travaglini@arm.com    EXPECT_STREQ(new_argv[i], argv[i]);
5913481Sgiacomo.travaglini@arm.com  }
6013481Sgiacomo.travaglini@arm.com
6113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(expected_gmock_verbose, GMOCK_FLAG(verbose).c_str());
6213481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = old_verbose;  // Restores the gmock_verbose flag.
6313481Sgiacomo.travaglini@arm.com}
6413481Sgiacomo.travaglini@arm.com
6513481Sgiacomo.travaglini@arm.comTEST(InitGoogleMockTest, ParsesInvalidCommandLine) {
6613481Sgiacomo.travaglini@arm.com  const char* argv[] = {
6713481Sgiacomo.travaglini@arm.com    NULL
6813481Sgiacomo.travaglini@arm.com  };
6913481Sgiacomo.travaglini@arm.com
7013481Sgiacomo.travaglini@arm.com  const char* new_argv[] = {
7113481Sgiacomo.travaglini@arm.com    NULL
7213481Sgiacomo.travaglini@arm.com  };
7313481Sgiacomo.travaglini@arm.com
7413481Sgiacomo.travaglini@arm.com  TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose));
7513481Sgiacomo.travaglini@arm.com}
7613481Sgiacomo.travaglini@arm.com
7713481Sgiacomo.travaglini@arm.comTEST(InitGoogleMockTest, ParsesEmptyCommandLine) {
7813481Sgiacomo.travaglini@arm.com  const char* argv[] = {
7913481Sgiacomo.travaglini@arm.com    "foo.exe",
8013481Sgiacomo.travaglini@arm.com    NULL
8113481Sgiacomo.travaglini@arm.com  };
8213481Sgiacomo.travaglini@arm.com
8313481Sgiacomo.travaglini@arm.com  const char* new_argv[] = {
8413481Sgiacomo.travaglini@arm.com    "foo.exe",
8513481Sgiacomo.travaglini@arm.com    NULL
8613481Sgiacomo.travaglini@arm.com  };
8713481Sgiacomo.travaglini@arm.com
8813481Sgiacomo.travaglini@arm.com  TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose));
8913481Sgiacomo.travaglini@arm.com}
9013481Sgiacomo.travaglini@arm.com
9113481Sgiacomo.travaglini@arm.comTEST(InitGoogleMockTest, ParsesSingleFlag) {
9213481Sgiacomo.travaglini@arm.com  const char* argv[] = {
9313481Sgiacomo.travaglini@arm.com    "foo.exe",
9413481Sgiacomo.travaglini@arm.com    "--gmock_verbose=info",
9513481Sgiacomo.travaglini@arm.com    NULL
9613481Sgiacomo.travaglini@arm.com  };
9713481Sgiacomo.travaglini@arm.com
9813481Sgiacomo.travaglini@arm.com  const char* new_argv[] = {
9913481Sgiacomo.travaglini@arm.com    "foo.exe",
10013481Sgiacomo.travaglini@arm.com    NULL
10113481Sgiacomo.travaglini@arm.com  };
10213481Sgiacomo.travaglini@arm.com
10313481Sgiacomo.travaglini@arm.com  TestInitGoogleMock(argv, new_argv, "info");
10413481Sgiacomo.travaglini@arm.com}
10513481Sgiacomo.travaglini@arm.com
10613481Sgiacomo.travaglini@arm.comTEST(InitGoogleMockTest, ParsesUnrecognizedFlag) {
10713481Sgiacomo.travaglini@arm.com  const char* argv[] = {
10813481Sgiacomo.travaglini@arm.com    "foo.exe",
10913481Sgiacomo.travaglini@arm.com    "--non_gmock_flag=blah",
11013481Sgiacomo.travaglini@arm.com    NULL
11113481Sgiacomo.travaglini@arm.com  };
11213481Sgiacomo.travaglini@arm.com
11313481Sgiacomo.travaglini@arm.com  const char* new_argv[] = {
11413481Sgiacomo.travaglini@arm.com    "foo.exe",
11513481Sgiacomo.travaglini@arm.com    "--non_gmock_flag=blah",
11613481Sgiacomo.travaglini@arm.com    NULL
11713481Sgiacomo.travaglini@arm.com  };
11813481Sgiacomo.travaglini@arm.com
11913481Sgiacomo.travaglini@arm.com  TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose));
12013481Sgiacomo.travaglini@arm.com}
12113481Sgiacomo.travaglini@arm.com
12213481Sgiacomo.travaglini@arm.comTEST(InitGoogleMockTest, ParsesGoogleMockFlagAndUnrecognizedFlag) {
12313481Sgiacomo.travaglini@arm.com  const char* argv[] = {
12413481Sgiacomo.travaglini@arm.com    "foo.exe",
12513481Sgiacomo.travaglini@arm.com    "--non_gmock_flag=blah",
12613481Sgiacomo.travaglini@arm.com    "--gmock_verbose=error",
12713481Sgiacomo.travaglini@arm.com    NULL
12813481Sgiacomo.travaglini@arm.com  };
12913481Sgiacomo.travaglini@arm.com
13013481Sgiacomo.travaglini@arm.com  const char* new_argv[] = {
13113481Sgiacomo.travaglini@arm.com    "foo.exe",
13213481Sgiacomo.travaglini@arm.com    "--non_gmock_flag=blah",
13313481Sgiacomo.travaglini@arm.com    NULL
13413481Sgiacomo.travaglini@arm.com  };
13513481Sgiacomo.travaglini@arm.com
13613481Sgiacomo.travaglini@arm.com  TestInitGoogleMock(argv, new_argv, "error");
13713481Sgiacomo.travaglini@arm.com}
13813481Sgiacomo.travaglini@arm.com
13913481Sgiacomo.travaglini@arm.comTEST(WideInitGoogleMockTest, ParsesInvalidCommandLine) {
14013481Sgiacomo.travaglini@arm.com  const wchar_t* argv[] = {
14113481Sgiacomo.travaglini@arm.com    NULL
14213481Sgiacomo.travaglini@arm.com  };
14313481Sgiacomo.travaglini@arm.com
14413481Sgiacomo.travaglini@arm.com  const wchar_t* new_argv[] = {
14513481Sgiacomo.travaglini@arm.com    NULL
14613481Sgiacomo.travaglini@arm.com  };
14713481Sgiacomo.travaglini@arm.com
14813481Sgiacomo.travaglini@arm.com  TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose));
14913481Sgiacomo.travaglini@arm.com}
15013481Sgiacomo.travaglini@arm.com
15113481Sgiacomo.travaglini@arm.comTEST(WideInitGoogleMockTest, ParsesEmptyCommandLine) {
15213481Sgiacomo.travaglini@arm.com  const wchar_t* argv[] = {
15313481Sgiacomo.travaglini@arm.com    L"foo.exe",
15413481Sgiacomo.travaglini@arm.com    NULL
15513481Sgiacomo.travaglini@arm.com  };
15613481Sgiacomo.travaglini@arm.com
15713481Sgiacomo.travaglini@arm.com  const wchar_t* new_argv[] = {
15813481Sgiacomo.travaglini@arm.com    L"foo.exe",
15913481Sgiacomo.travaglini@arm.com    NULL
16013481Sgiacomo.travaglini@arm.com  };
16113481Sgiacomo.travaglini@arm.com
16213481Sgiacomo.travaglini@arm.com  TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose));
16313481Sgiacomo.travaglini@arm.com}
16413481Sgiacomo.travaglini@arm.com
16513481Sgiacomo.travaglini@arm.comTEST(WideInitGoogleMockTest, ParsesSingleFlag) {
16613481Sgiacomo.travaglini@arm.com  const wchar_t* argv[] = {
16713481Sgiacomo.travaglini@arm.com    L"foo.exe",
16813481Sgiacomo.travaglini@arm.com    L"--gmock_verbose=info",
16913481Sgiacomo.travaglini@arm.com    NULL
17013481Sgiacomo.travaglini@arm.com  };
17113481Sgiacomo.travaglini@arm.com
17213481Sgiacomo.travaglini@arm.com  const wchar_t* new_argv[] = {
17313481Sgiacomo.travaglini@arm.com    L"foo.exe",
17413481Sgiacomo.travaglini@arm.com    NULL
17513481Sgiacomo.travaglini@arm.com  };
17613481Sgiacomo.travaglini@arm.com
17713481Sgiacomo.travaglini@arm.com  TestInitGoogleMock(argv, new_argv, "info");
17813481Sgiacomo.travaglini@arm.com}
17913481Sgiacomo.travaglini@arm.com
18013481Sgiacomo.travaglini@arm.comTEST(WideInitGoogleMockTest, ParsesUnrecognizedFlag) {
18113481Sgiacomo.travaglini@arm.com  const wchar_t* argv[] = {
18213481Sgiacomo.travaglini@arm.com    L"foo.exe",
18313481Sgiacomo.travaglini@arm.com    L"--non_gmock_flag=blah",
18413481Sgiacomo.travaglini@arm.com    NULL
18513481Sgiacomo.travaglini@arm.com  };
18613481Sgiacomo.travaglini@arm.com
18713481Sgiacomo.travaglini@arm.com  const wchar_t* new_argv[] = {
18813481Sgiacomo.travaglini@arm.com    L"foo.exe",
18913481Sgiacomo.travaglini@arm.com    L"--non_gmock_flag=blah",
19013481Sgiacomo.travaglini@arm.com    NULL
19113481Sgiacomo.travaglini@arm.com  };
19213481Sgiacomo.travaglini@arm.com
19313481Sgiacomo.travaglini@arm.com  TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose));
19413481Sgiacomo.travaglini@arm.com}
19513481Sgiacomo.travaglini@arm.com
19613481Sgiacomo.travaglini@arm.comTEST(WideInitGoogleMockTest, ParsesGoogleMockFlagAndUnrecognizedFlag) {
19713481Sgiacomo.travaglini@arm.com  const wchar_t* argv[] = {
19813481Sgiacomo.travaglini@arm.com    L"foo.exe",
19913481Sgiacomo.travaglini@arm.com    L"--non_gmock_flag=blah",
20013481Sgiacomo.travaglini@arm.com    L"--gmock_verbose=error",
20113481Sgiacomo.travaglini@arm.com    NULL
20213481Sgiacomo.travaglini@arm.com  };
20313481Sgiacomo.travaglini@arm.com
20413481Sgiacomo.travaglini@arm.com  const wchar_t* new_argv[] = {
20513481Sgiacomo.travaglini@arm.com    L"foo.exe",
20613481Sgiacomo.travaglini@arm.com    L"--non_gmock_flag=blah",
20713481Sgiacomo.travaglini@arm.com    NULL
20813481Sgiacomo.travaglini@arm.com  };
20913481Sgiacomo.travaglini@arm.com
21013481Sgiacomo.travaglini@arm.com  TestInitGoogleMock(argv, new_argv, "error");
21113481Sgiacomo.travaglini@arm.com}
21213481Sgiacomo.travaglini@arm.com
21313481Sgiacomo.travaglini@arm.com#endif  // !defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
21413481Sgiacomo.travaglini@arm.com
21513481Sgiacomo.travaglini@arm.com// Makes sure Google Mock flags can be accessed in code.
21613481Sgiacomo.travaglini@arm.comTEST(FlagTest, IsAccessibleInCode) {
21713481Sgiacomo.travaglini@arm.com  bool dummy = testing::GMOCK_FLAG(catch_leaked_mocks) &&
21813481Sgiacomo.travaglini@arm.com      testing::GMOCK_FLAG(verbose) == "";
21913481Sgiacomo.travaglini@arm.com  (void)dummy;  // Avoids the "unused local variable" warning.
22013481Sgiacomo.travaglini@arm.com}
221