Path: blob/main/contrib/googletest/googlemock/test/gmock_test.cc
48254 views
// Copyright 2008, Google Inc.1// All rights reserved.2//3// Redistribution and use in source and binary forms, with or without4// modification, are permitted provided that the following conditions are5// met:6//7// * Redistributions of source code must retain the above copyright8// notice, this list of conditions and the following disclaimer.9// * Redistributions in binary form must reproduce the above10// copyright notice, this list of conditions and the following disclaimer11// in the documentation and/or other materials provided with the12// distribution.13// * Neither the name of Google Inc. nor the names of its14// contributors may be used to endorse or promote products derived from15// this software without specific prior written permission.16//17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT19// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR20// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT21// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,22// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT23// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,24// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY25// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT26// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE27// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.2829// Google Mock - a framework for writing C++ mock classes.30//31// This file tests code in gmock.cc.3233#include "gmock/gmock.h"3435#include <string>3637#include "gtest/gtest.h"38#include "gtest/internal/custom/gtest.h"3940#if !defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)4142using testing::InitGoogleMock;4344// Verifies that calling InitGoogleMock() on argv results in new_argv,45// and the gmock_verbose flag's value is set to expected_gmock_verbose.46template <typename Char, int M, int N>47void TestInitGoogleMock(const Char* (&argv)[M], const Char* (&new_argv)[N],48const ::std::string& expected_gmock_verbose) {49const ::std::string old_verbose = GMOCK_FLAG_GET(verbose);5051int argc = M - 1;52InitGoogleMock(&argc, const_cast<Char**>(argv));53ASSERT_EQ(N - 1, argc) << "The new argv has wrong number of elements.";5455for (int i = 0; i < N; i++) {56EXPECT_STREQ(new_argv[i], argv[i]);57}5859EXPECT_EQ(expected_gmock_verbose, GMOCK_FLAG_GET(verbose));60GMOCK_FLAG_SET(verbose, old_verbose); // Restores the gmock_verbose flag.61}6263TEST(InitGoogleMockTest, ParsesInvalidCommandLine) {64const char* argv[] = {nullptr};6566const char* new_argv[] = {nullptr};6768TestInitGoogleMock(argv, new_argv, GMOCK_FLAG_GET(verbose));69}7071TEST(InitGoogleMockTest, ParsesEmptyCommandLine) {72const char* argv[] = {"foo.exe", nullptr};7374const char* new_argv[] = {"foo.exe", nullptr};7576TestInitGoogleMock(argv, new_argv, GMOCK_FLAG_GET(verbose));77}7879TEST(InitGoogleMockTest, ParsesSingleFlag) {80const char* argv[] = {"foo.exe", "--gmock_verbose=info", nullptr};8182const char* new_argv[] = {"foo.exe", nullptr};8384TestInitGoogleMock(argv, new_argv, "info");85}8687TEST(InitGoogleMockTest, ParsesMultipleFlags) {88int old_default_behavior = GMOCK_FLAG_GET(default_mock_behavior);89const wchar_t* argv[] = {L"foo.exe", L"--gmock_verbose=info",90L"--gmock_default_mock_behavior=2", nullptr};9192const wchar_t* new_argv[] = {L"foo.exe", nullptr};9394TestInitGoogleMock(argv, new_argv, "info");95EXPECT_EQ(2, GMOCK_FLAG_GET(default_mock_behavior));96EXPECT_NE(2, old_default_behavior);97GMOCK_FLAG_SET(default_mock_behavior, old_default_behavior);98}99100TEST(InitGoogleMockTest, ParsesUnrecognizedFlag) {101const char* argv[] = {"foo.exe", "--non_gmock_flag=blah", nullptr};102103const char* new_argv[] = {"foo.exe", "--non_gmock_flag=blah", nullptr};104105TestInitGoogleMock(argv, new_argv, GMOCK_FLAG_GET(verbose));106}107108TEST(InitGoogleMockTest, ParsesGoogleMockFlagAndUnrecognizedFlag) {109const char* argv[] = {"foo.exe", "--non_gmock_flag=blah",110"--gmock_verbose=error", nullptr};111112const char* new_argv[] = {"foo.exe", "--non_gmock_flag=blah", nullptr};113114TestInitGoogleMock(argv, new_argv, "error");115}116117TEST(WideInitGoogleMockTest, ParsesInvalidCommandLine) {118const wchar_t* argv[] = {nullptr};119120const wchar_t* new_argv[] = {nullptr};121122TestInitGoogleMock(argv, new_argv, GMOCK_FLAG_GET(verbose));123}124125TEST(WideInitGoogleMockTest, ParsesEmptyCommandLine) {126const wchar_t* argv[] = {L"foo.exe", nullptr};127128const wchar_t* new_argv[] = {L"foo.exe", nullptr};129130TestInitGoogleMock(argv, new_argv, GMOCK_FLAG_GET(verbose));131}132133TEST(WideInitGoogleMockTest, ParsesSingleFlag) {134const wchar_t* argv[] = {L"foo.exe", L"--gmock_verbose=info", nullptr};135136const wchar_t* new_argv[] = {L"foo.exe", nullptr};137138TestInitGoogleMock(argv, new_argv, "info");139}140141TEST(WideInitGoogleMockTest, ParsesMultipleFlags) {142int old_default_behavior = GMOCK_FLAG_GET(default_mock_behavior);143const wchar_t* argv[] = {L"foo.exe", L"--gmock_verbose=info",144L"--gmock_default_mock_behavior=2", nullptr};145146const wchar_t* new_argv[] = {L"foo.exe", nullptr};147148TestInitGoogleMock(argv, new_argv, "info");149EXPECT_EQ(2, GMOCK_FLAG_GET(default_mock_behavior));150EXPECT_NE(2, old_default_behavior);151GMOCK_FLAG_SET(default_mock_behavior, old_default_behavior);152}153154TEST(WideInitGoogleMockTest, ParsesUnrecognizedFlag) {155const wchar_t* argv[] = {L"foo.exe", L"--non_gmock_flag=blah", nullptr};156157const wchar_t* new_argv[] = {L"foo.exe", L"--non_gmock_flag=blah", nullptr};158159TestInitGoogleMock(argv, new_argv, GMOCK_FLAG_GET(verbose));160}161162TEST(WideInitGoogleMockTest, ParsesGoogleMockFlagAndUnrecognizedFlag) {163const wchar_t* argv[] = {L"foo.exe", L"--non_gmock_flag=blah",164L"--gmock_verbose=error", nullptr};165166const wchar_t* new_argv[] = {L"foo.exe", L"--non_gmock_flag=blah", nullptr};167168TestInitGoogleMock(argv, new_argv, "error");169}170171#endif // !defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)172173// Makes sure Google Mock flags can be accessed in code.174TEST(FlagTest, IsAccessibleInCode) {175bool dummy =176GMOCK_FLAG_GET(catch_leaked_mocks) && GMOCK_FLAG_GET(verbose).empty();177(void)dummy; // Avoids the "unused local variable" warning.178}179180181