Path: blob/main/contrib/googletest/googlemock/test/gmock-internal-utils_test.cc
48254 views
// Copyright 2007, 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 the internal utilities.3233#include "gmock/internal/gmock-internal-utils.h"3435#include <stdlib.h>3637#include <cstdint>38#include <map>39#include <memory>40#include <sstream>41#include <string>42#include <tuple>43#include <vector>4445#include "gmock/gmock.h"46#include "gmock/internal/gmock-port.h"47#include "gtest/gtest-spi.h"48#include "gtest/gtest.h"4950// Indicates that this translation unit is part of Google Test's51// implementation. It must come before gtest-internal-inl.h is52// included, or there will be a compiler error. This trick is to53// prevent a user from accidentally including gtest-internal-inl.h in54// their code.55#define GTEST_IMPLEMENTATION_ 156#include "src/gtest-internal-inl.h"57#undef GTEST_IMPLEMENTATION_5859#ifdef GTEST_OS_CYGWIN60#include <sys/types.h> // For ssize_t. NOLINT61#endif6263namespace proto2 {64class Message;65} // namespace proto26667namespace testing {68namespace internal {6970namespace {7172TEST(JoinAsKeyValueTupleTest, JoinsEmptyTuple) {73EXPECT_EQ("", JoinAsKeyValueTuple({}, Strings()));74}7576TEST(JoinAsKeyValueTupleTest, JoinsOneTuple) {77EXPECT_EQ("(a: 1)", JoinAsKeyValueTuple({"a"}, {"1"}));78}7980TEST(JoinAsKeyValueTupleTest, JoinsTwoTuple) {81EXPECT_EQ("(a: 1, b: 2)", JoinAsKeyValueTuple({"a", "b"}, {"1", "2"}));82}8384TEST(JoinAsKeyValueTupleTest, JoinsTenTuple) {85EXPECT_EQ(86"(a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9, j: 10)",87JoinAsKeyValueTuple({"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"},88{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}));89}9091TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsNoWord) {92EXPECT_EQ("", ConvertIdentifierNameToWords(""));93EXPECT_EQ("", ConvertIdentifierNameToWords("_"));94EXPECT_EQ("", ConvertIdentifierNameToWords("__"));95}9697TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsDigits) {98EXPECT_EQ("1", ConvertIdentifierNameToWords("_1"));99EXPECT_EQ("2", ConvertIdentifierNameToWords("2_"));100EXPECT_EQ("34", ConvertIdentifierNameToWords("_34_"));101EXPECT_EQ("34 56", ConvertIdentifierNameToWords("_34_56"));102}103104TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsCamelCaseWords) {105EXPECT_EQ("a big word", ConvertIdentifierNameToWords("ABigWord"));106EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("FooBar"));107EXPECT_EQ("foo", ConvertIdentifierNameToWords("Foo_"));108EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_Foo_Bar_"));109EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_Foo__And_Bar"));110}111112TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContains_SeparatedWords) {113EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("foo_bar"));114EXPECT_EQ("foo", ConvertIdentifierNameToWords("_foo_"));115EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_foo_bar_"));116EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_foo__and_bar"));117}118119TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameIsMixture) {120EXPECT_EQ("foo bar 123", ConvertIdentifierNameToWords("Foo_bar123"));121EXPECT_EQ("chapter 11 section 1",122ConvertIdentifierNameToWords("_Chapter11Section_1_"));123}124125TEST(GetRawPointerTest, WorksForSmartPointers) {126const char* const raw_p1 = new const char('a'); // NOLINT127const std::unique_ptr<const char> p1(raw_p1);128EXPECT_EQ(raw_p1, GetRawPointer(p1));129double* const raw_p2 = new double(2.5); // NOLINT130const std::shared_ptr<double> p2(raw_p2);131EXPECT_EQ(raw_p2, GetRawPointer(p2));132}133134TEST(GetRawPointerTest, WorksForRawPointers) {135int* p = nullptr;136EXPECT_TRUE(nullptr == GetRawPointer(p));137int n = 1;138EXPECT_EQ(&n, GetRawPointer(&n));139}140141TEST(GetRawPointerTest, WorksForStdReferenceWrapper) {142int n = 1;143EXPECT_EQ(&n, GetRawPointer(std::ref(n)));144EXPECT_EQ(&n, GetRawPointer(std::cref(n)));145}146147// Tests KindOf<T>.148149class Base {};150class Derived : public Base {};151152TEST(KindOfTest, Bool) {153EXPECT_EQ(kBool, GMOCK_KIND_OF_(bool)); // NOLINT154}155156TEST(KindOfTest, Integer) {157EXPECT_EQ(kInteger, GMOCK_KIND_OF_(char)); // NOLINT158EXPECT_EQ(kInteger, GMOCK_KIND_OF_(signed char)); // NOLINT159EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned char)); // NOLINT160EXPECT_EQ(kInteger, GMOCK_KIND_OF_(short)); // NOLINT161EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned short)); // NOLINT162EXPECT_EQ(kInteger, GMOCK_KIND_OF_(int)); // NOLINT163EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned int)); // NOLINT164EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long)); // NOLINT165EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long)); // NOLINT166EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long long)); // NOLINT167EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long long)); // NOLINT168EXPECT_EQ(kInteger, GMOCK_KIND_OF_(wchar_t)); // NOLINT169EXPECT_EQ(kInteger, GMOCK_KIND_OF_(size_t)); // NOLINT170#if defined(GTEST_OS_LINUX) || defined(GTEST_OS_MAC) || defined(GTEST_OS_CYGWIN)171// ssize_t is not defined on Windows and possibly some other OSes.172EXPECT_EQ(kInteger, GMOCK_KIND_OF_(ssize_t)); // NOLINT173#endif174}175176TEST(KindOfTest, FloatingPoint) {177EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(float)); // NOLINT178EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(double)); // NOLINT179EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(long double)); // NOLINT180}181182TEST(KindOfTest, Other) {183EXPECT_EQ(kOther, GMOCK_KIND_OF_(void*)); // NOLINT184EXPECT_EQ(kOther, GMOCK_KIND_OF_(char**)); // NOLINT185EXPECT_EQ(kOther, GMOCK_KIND_OF_(Base)); // NOLINT186}187188// Tests LosslessArithmeticConvertible<T, U>.189190TEST(LosslessArithmeticConvertibleTest, BoolToBool) {191EXPECT_TRUE((LosslessArithmeticConvertible<bool, bool>::value));192}193194TEST(LosslessArithmeticConvertibleTest, BoolToInteger) {195EXPECT_TRUE((LosslessArithmeticConvertible<bool, char>::value));196EXPECT_TRUE((LosslessArithmeticConvertible<bool, int>::value));197EXPECT_TRUE(198(LosslessArithmeticConvertible<bool, unsigned long>::value)); // NOLINT199}200201TEST(LosslessArithmeticConvertibleTest, BoolToFloatingPoint) {202EXPECT_TRUE((LosslessArithmeticConvertible<bool, float>::value));203EXPECT_TRUE((LosslessArithmeticConvertible<bool, double>::value));204}205206TEST(LosslessArithmeticConvertibleTest, IntegerToBool) {207EXPECT_FALSE((LosslessArithmeticConvertible<unsigned char, bool>::value));208EXPECT_FALSE((LosslessArithmeticConvertible<int, bool>::value));209}210211TEST(LosslessArithmeticConvertibleTest, IntegerToInteger) {212// Unsigned => larger signed is fine.213EXPECT_TRUE((LosslessArithmeticConvertible<unsigned char, int>::value));214215// Unsigned => larger unsigned is fine.216EXPECT_TRUE((LosslessArithmeticConvertible<unsigned short,217uint64_t>::value)); // NOLINT218219// Signed => unsigned is not fine.220EXPECT_FALSE(221(LosslessArithmeticConvertible<short, uint64_t>::value)); // NOLINT222EXPECT_FALSE((LosslessArithmeticConvertible<signed char,223unsigned int>::value)); // NOLINT224225// Same size and same signedness: fine too.226EXPECT_TRUE(227(LosslessArithmeticConvertible<unsigned char, unsigned char>::value));228EXPECT_TRUE((LosslessArithmeticConvertible<int, int>::value));229EXPECT_TRUE((LosslessArithmeticConvertible<wchar_t, wchar_t>::value));230EXPECT_TRUE((LosslessArithmeticConvertible<unsigned long,231unsigned long>::value)); // NOLINT232233// Same size, different signedness: not fine.234EXPECT_FALSE(235(LosslessArithmeticConvertible<unsigned char, signed char>::value));236EXPECT_FALSE((LosslessArithmeticConvertible<int, unsigned int>::value));237EXPECT_FALSE((LosslessArithmeticConvertible<uint64_t, int64_t>::value));238239// Larger size => smaller size is not fine.240EXPECT_FALSE((LosslessArithmeticConvertible<long, char>::value)); // NOLINT241EXPECT_FALSE((LosslessArithmeticConvertible<int, signed char>::value));242EXPECT_FALSE((LosslessArithmeticConvertible<int64_t, unsigned int>::value));243}244245TEST(LosslessArithmeticConvertibleTest, IntegerToFloatingPoint) {246// Integers cannot be losslessly converted to floating-points, as247// the format of the latter is implementation-defined.248EXPECT_FALSE((LosslessArithmeticConvertible<char, float>::value));249EXPECT_FALSE((LosslessArithmeticConvertible<int, double>::value));250EXPECT_FALSE(251(LosslessArithmeticConvertible<short, long double>::value)); // NOLINT252}253254TEST(LosslessArithmeticConvertibleTest, FloatingPointToBool) {255EXPECT_FALSE((LosslessArithmeticConvertible<float, bool>::value));256EXPECT_FALSE((LosslessArithmeticConvertible<double, bool>::value));257}258259TEST(LosslessArithmeticConvertibleTest, FloatingPointToInteger) {260EXPECT_FALSE((LosslessArithmeticConvertible<float, long>::value)); // NOLINT261EXPECT_FALSE((LosslessArithmeticConvertible<double, int64_t>::value));262EXPECT_FALSE((LosslessArithmeticConvertible<long double, int>::value));263}264265TEST(LosslessArithmeticConvertibleTest, FloatingPointToFloatingPoint) {266// Smaller size => larger size is fine.267EXPECT_TRUE((LosslessArithmeticConvertible<float, double>::value));268EXPECT_TRUE((LosslessArithmeticConvertible<float, long double>::value));269EXPECT_TRUE((LosslessArithmeticConvertible<double, long double>::value));270271// Same size: fine.272EXPECT_TRUE((LosslessArithmeticConvertible<float, float>::value));273EXPECT_TRUE((LosslessArithmeticConvertible<double, double>::value));274275// Larger size => smaller size is not fine.276EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value));277GTEST_INTENTIONAL_CONST_COND_PUSH_()278if (sizeof(double) == sizeof(long double)) { // NOLINT279GTEST_INTENTIONAL_CONST_COND_POP_()280// In some implementations (e.g. MSVC), double and long double281// have the same size.282EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value));283} else {284EXPECT_FALSE((LosslessArithmeticConvertible<long double, double>::value));285}286}287288// Tests the TupleMatches() template function.289290TEST(TupleMatchesTest, WorksForSize0) {291std::tuple<> matchers;292std::tuple<> values;293294EXPECT_TRUE(TupleMatches(matchers, values));295}296297TEST(TupleMatchesTest, WorksForSize1) {298std::tuple<Matcher<int>> matchers(Eq(1));299std::tuple<int> values1(1), values2(2);300301EXPECT_TRUE(TupleMatches(matchers, values1));302EXPECT_FALSE(TupleMatches(matchers, values2));303}304305TEST(TupleMatchesTest, WorksForSize2) {306std::tuple<Matcher<int>, Matcher<char>> matchers(Eq(1), Eq('a'));307std::tuple<int, char> values1(1, 'a'), values2(1, 'b'), values3(2, 'a'),308values4(2, 'b');309310EXPECT_TRUE(TupleMatches(matchers, values1));311EXPECT_FALSE(TupleMatches(matchers, values2));312EXPECT_FALSE(TupleMatches(matchers, values3));313EXPECT_FALSE(TupleMatches(matchers, values4));314}315316TEST(TupleMatchesTest, WorksForSize5) {317std::tuple<Matcher<int>, Matcher<char>, Matcher<bool>,318Matcher<long>, // NOLINT319Matcher<std::string>>320matchers(Eq(1), Eq('a'), Eq(true), Eq(2L), Eq("hi"));321std::tuple<int, char, bool, long, std::string> // NOLINT322values1(1, 'a', true, 2L, "hi"), values2(1, 'a', true, 2L, "hello"),323values3(2, 'a', true, 2L, "hi");324325EXPECT_TRUE(TupleMatches(matchers, values1));326EXPECT_FALSE(TupleMatches(matchers, values2));327EXPECT_FALSE(TupleMatches(matchers, values3));328}329330// Tests that Assert(true, ...) succeeds.331TEST(AssertTest, SucceedsOnTrue) {332Assert(true, __FILE__, __LINE__, "This should succeed.");333Assert(true, __FILE__, __LINE__); // This should succeed too.334}335336// Tests that Assert(false, ...) generates a fatal failure.337TEST(AssertTest, FailsFatallyOnFalse) {338EXPECT_DEATH_IF_SUPPORTED(339{ Assert(false, __FILE__, __LINE__, "This should fail."); }, "");340341EXPECT_DEATH_IF_SUPPORTED({ Assert(false, __FILE__, __LINE__); }, "");342}343344// Tests that Expect(true, ...) succeeds.345TEST(ExpectTest, SucceedsOnTrue) {346Expect(true, __FILE__, __LINE__, "This should succeed.");347Expect(true, __FILE__, __LINE__); // This should succeed too.348}349350// Tests that Expect(false, ...) generates a non-fatal failure.351TEST(ExpectTest, FailsNonfatallyOnFalse) {352EXPECT_NONFATAL_FAILURE(353{ // NOLINT354Expect(false, __FILE__, __LINE__, "This should fail.");355},356"This should fail");357358EXPECT_NONFATAL_FAILURE(359{ // NOLINT360Expect(false, __FILE__, __LINE__);361},362"Expectation failed");363}364365// Tests LogIsVisible().366367class LogIsVisibleTest : public ::testing::Test {368protected:369void SetUp() override { original_verbose_ = GMOCK_FLAG_GET(verbose); }370371void TearDown() override { GMOCK_FLAG_SET(verbose, original_verbose_); }372373std::string original_verbose_;374};375376TEST_F(LogIsVisibleTest, AlwaysReturnsTrueIfVerbosityIsInfo) {377GMOCK_FLAG_SET(verbose, kInfoVerbosity);378EXPECT_TRUE(LogIsVisible(kInfo));379EXPECT_TRUE(LogIsVisible(kWarning));380}381382TEST_F(LogIsVisibleTest, AlwaysReturnsFalseIfVerbosityIsError) {383GMOCK_FLAG_SET(verbose, kErrorVerbosity);384EXPECT_FALSE(LogIsVisible(kInfo));385EXPECT_FALSE(LogIsVisible(kWarning));386}387388TEST_F(LogIsVisibleTest, WorksWhenVerbosityIsWarning) {389GMOCK_FLAG_SET(verbose, kWarningVerbosity);390EXPECT_FALSE(LogIsVisible(kInfo));391EXPECT_TRUE(LogIsVisible(kWarning));392}393394#if GTEST_HAS_STREAM_REDIRECTION395396// Tests the Log() function.397398// Verifies that Log() behaves correctly for the given verbosity level399// and log severity.400void TestLogWithSeverity(const std::string& verbosity, LogSeverity severity,401bool should_print) {402const std::string old_flag = GMOCK_FLAG_GET(verbose);403GMOCK_FLAG_SET(verbose, verbosity);404CaptureStdout();405Log(severity, "Test log.\n", 0);406if (should_print) {407EXPECT_THAT(408GetCapturedStdout().c_str(),409ContainsRegex(severity == kWarning410? "^\nGMOCK WARNING:\nTest log\\.\nStack trace:\n"411: "^\nTest log\\.\nStack trace:\n"));412} else {413EXPECT_STREQ("", GetCapturedStdout().c_str());414}415GMOCK_FLAG_SET(verbose, old_flag);416}417418// Tests that when the stack_frames_to_skip parameter is negative,419// Log() doesn't include the stack trace in the output.420TEST(LogTest, NoStackTraceWhenStackFramesToSkipIsNegative) {421const std::string saved_flag = GMOCK_FLAG_GET(verbose);422GMOCK_FLAG_SET(verbose, kInfoVerbosity);423CaptureStdout();424Log(kInfo, "Test log.\n", -1);425EXPECT_STREQ("\nTest log.\n", GetCapturedStdout().c_str());426GMOCK_FLAG_SET(verbose, saved_flag);427}428429struct MockStackTraceGetter : testing::internal::OsStackTraceGetterInterface {430std::string CurrentStackTrace(int max_depth, int skip_count) override {431return (testing::Message() << max_depth << "::" << skip_count << "\n")432.GetString();433}434void UponLeavingGTest() override {}435};436437// Tests that in opt mode, a positive stack_frames_to_skip argument is438// treated as 0.439TEST(LogTest, NoSkippingStackFrameInOptMode) {440MockStackTraceGetter* mock_os_stack_trace_getter = new MockStackTraceGetter;441GetUnitTestImpl()->set_os_stack_trace_getter(mock_os_stack_trace_getter);442443CaptureStdout();444Log(kWarning, "Test log.\n", 100);445const std::string log = GetCapturedStdout();446447std::string expected_trace =448(testing::Message() << GTEST_FLAG_GET(stack_trace_depth) << "::")449.GetString();450std::string expected_message =451"\nGMOCK WARNING:\n"452"Test log.\n"453"Stack trace:\n" +454expected_trace;455EXPECT_THAT(log, HasSubstr(expected_message));456int skip_count = atoi(log.substr(expected_message.size()).c_str());457458#if defined(NDEBUG)459// In opt mode, no stack frame should be skipped.460const int expected_skip_count = 0;461#else462// In dbg mode, the stack frames should be skipped.463const int expected_skip_count = 100;464#endif465466// Note that each inner implementation layer will +1 the number to remove467// itself from the trace. This means that the value is a little higher than468// expected, but close enough.469EXPECT_THAT(skip_count,470AllOf(Ge(expected_skip_count), Le(expected_skip_count + 10)));471472// Restores the default OS stack trace getter.473GetUnitTestImpl()->set_os_stack_trace_getter(nullptr);474}475476// Tests that all logs are printed when the value of the477// --gmock_verbose flag is "info".478TEST(LogTest, AllLogsArePrintedWhenVerbosityIsInfo) {479TestLogWithSeverity(kInfoVerbosity, kInfo, true);480TestLogWithSeverity(kInfoVerbosity, kWarning, true);481}482483// Tests that only warnings are printed when the value of the484// --gmock_verbose flag is "warning".485TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsWarning) {486TestLogWithSeverity(kWarningVerbosity, kInfo, false);487TestLogWithSeverity(kWarningVerbosity, kWarning, true);488}489490// Tests that no logs are printed when the value of the491// --gmock_verbose flag is "error".492TEST(LogTest, NoLogsArePrintedWhenVerbosityIsError) {493TestLogWithSeverity(kErrorVerbosity, kInfo, false);494TestLogWithSeverity(kErrorVerbosity, kWarning, false);495}496497// Tests that only warnings are printed when the value of the498// --gmock_verbose flag is invalid.499TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsInvalid) {500TestLogWithSeverity("invalid", kInfo, false);501TestLogWithSeverity("invalid", kWarning, true);502}503504// Verifies that Log() behaves correctly for the given verbosity level505// and log severity.506std::string GrabOutput(void (*logger)(), const char* verbosity) {507const std::string saved_flag = GMOCK_FLAG_GET(verbose);508GMOCK_FLAG_SET(verbose, verbosity);509CaptureStdout();510logger();511GMOCK_FLAG_SET(verbose, saved_flag);512return GetCapturedStdout();513}514515class DummyMock {516public:517MOCK_METHOD0(TestMethod, void());518MOCK_METHOD1(TestMethodArg, void(int dummy));519};520521void ExpectCallLogger() {522DummyMock mock;523EXPECT_CALL(mock, TestMethod());524mock.TestMethod();525}526527// Verifies that EXPECT_CALL logs if the --gmock_verbose flag is set to "info".528TEST(ExpectCallTest, LogsWhenVerbosityIsInfo) {529EXPECT_THAT(std::string(GrabOutput(ExpectCallLogger, kInfoVerbosity)),530HasSubstr("EXPECT_CALL(mock, TestMethod())"));531}532533// Verifies that EXPECT_CALL doesn't log534// if the --gmock_verbose flag is set to "warning".535TEST(ExpectCallTest, DoesNotLogWhenVerbosityIsWarning) {536EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kWarningVerbosity).c_str());537}538539// Verifies that EXPECT_CALL doesn't log540// if the --gmock_verbose flag is set to "error".541TEST(ExpectCallTest, DoesNotLogWhenVerbosityIsError) {542EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kErrorVerbosity).c_str());543}544545void OnCallLogger() {546DummyMock mock;547ON_CALL(mock, TestMethod());548}549550// Verifies that ON_CALL logs if the --gmock_verbose flag is set to "info".551TEST(OnCallTest, LogsWhenVerbosityIsInfo) {552EXPECT_THAT(std::string(GrabOutput(OnCallLogger, kInfoVerbosity)),553HasSubstr("ON_CALL(mock, TestMethod())"));554}555556// Verifies that ON_CALL doesn't log557// if the --gmock_verbose flag is set to "warning".558TEST(OnCallTest, DoesNotLogWhenVerbosityIsWarning) {559EXPECT_STREQ("", GrabOutput(OnCallLogger, kWarningVerbosity).c_str());560}561562// Verifies that ON_CALL doesn't log if563// the --gmock_verbose flag is set to "error".564TEST(OnCallTest, DoesNotLogWhenVerbosityIsError) {565EXPECT_STREQ("", GrabOutput(OnCallLogger, kErrorVerbosity).c_str());566}567568void OnCallAnyArgumentLogger() {569DummyMock mock;570ON_CALL(mock, TestMethodArg(_));571}572573// Verifies that ON_CALL prints provided _ argument.574TEST(OnCallTest, LogsAnythingArgument) {575EXPECT_THAT(std::string(GrabOutput(OnCallAnyArgumentLogger, kInfoVerbosity)),576HasSubstr("ON_CALL(mock, TestMethodArg(_)"));577}578579#endif // GTEST_HAS_STREAM_REDIRECTION580581// Tests StlContainerView.582583TEST(StlContainerViewTest, WorksForStlContainer) {584StaticAssertTypeEq<std::vector<int>,585StlContainerView<std::vector<int>>::type>();586StaticAssertTypeEq<const std::vector<double>&,587StlContainerView<std::vector<double>>::const_reference>();588589typedef std::vector<char> Chars;590Chars v1;591const Chars& v2(StlContainerView<Chars>::ConstReference(v1));592EXPECT_EQ(&v1, &v2);593594v1.push_back('a');595Chars v3 = StlContainerView<Chars>::Copy(v1);596EXPECT_THAT(v3, Eq(v3));597}598599TEST(StlContainerViewTest, WorksForStaticNativeArray) {600StaticAssertTypeEq<NativeArray<int>, StlContainerView<int[3]>::type>();601StaticAssertTypeEq<NativeArray<double>,602StlContainerView<const double[4]>::type>();603StaticAssertTypeEq<NativeArray<char[3]>,604StlContainerView<const char[2][3]>::type>();605606StaticAssertTypeEq<const NativeArray<int>,607StlContainerView<int[2]>::const_reference>();608609int a1[3] = {0, 1, 2};610NativeArray<int> a2 = StlContainerView<int[3]>::ConstReference(a1);611EXPECT_EQ(3U, a2.size());612EXPECT_EQ(a1, a2.begin());613614const NativeArray<int> a3 = StlContainerView<int[3]>::Copy(a1);615ASSERT_EQ(3U, a3.size());616EXPECT_EQ(0, a3.begin()[0]);617EXPECT_EQ(1, a3.begin()[1]);618EXPECT_EQ(2, a3.begin()[2]);619620// Makes sure a1 and a3 aren't aliases.621a1[0] = 3;622EXPECT_EQ(0, a3.begin()[0]);623}624625TEST(StlContainerViewTest, WorksForDynamicNativeArray) {626StaticAssertTypeEq<NativeArray<int>,627StlContainerView<std::tuple<const int*, size_t>>::type>();628StaticAssertTypeEq<629NativeArray<double>,630StlContainerView<std::tuple<std::shared_ptr<double>, int>>::type>();631632StaticAssertTypeEq<633const NativeArray<int>,634StlContainerView<std::tuple<const int*, int>>::const_reference>();635636int a1[3] = {0, 1, 2};637const int* const p1 = a1;638NativeArray<int> a2 =639StlContainerView<std::tuple<const int*, int>>::ConstReference(640std::make_tuple(p1, 3));641EXPECT_EQ(3U, a2.size());642EXPECT_EQ(a1, a2.begin());643644const NativeArray<int> a3 = StlContainerView<std::tuple<int*, size_t>>::Copy(645std::make_tuple(static_cast<int*>(a1), 3));646ASSERT_EQ(3U, a3.size());647EXPECT_EQ(0, a3.begin()[0]);648EXPECT_EQ(1, a3.begin()[1]);649EXPECT_EQ(2, a3.begin()[2]);650651// Makes sure a1 and a3 aren't aliases.652a1[0] = 3;653EXPECT_EQ(0, a3.begin()[0]);654}655656// Tests the Function template struct.657658TEST(FunctionTest, Nullary) {659typedef Function<int()> F; // NOLINT660EXPECT_EQ(0u, F::ArgumentCount);661EXPECT_TRUE((std::is_same<int, F::Result>::value));662EXPECT_TRUE((std::is_same<std::tuple<>, F::ArgumentTuple>::value));663EXPECT_TRUE((std::is_same<std::tuple<>, F::ArgumentMatcherTuple>::value));664EXPECT_TRUE((std::is_same<void(), F::MakeResultVoid>::value));665EXPECT_TRUE((std::is_same<IgnoredValue(), F::MakeResultIgnoredValue>::value));666}667668TEST(FunctionTest, Unary) {669typedef Function<int(bool)> F; // NOLINT670EXPECT_EQ(1u, F::ArgumentCount);671EXPECT_TRUE((std::is_same<int, F::Result>::value));672EXPECT_TRUE((std::is_same<bool, F::Arg<0>::type>::value));673EXPECT_TRUE((std::is_same<std::tuple<bool>, F::ArgumentTuple>::value));674EXPECT_TRUE((675std::is_same<std::tuple<Matcher<bool>>, F::ArgumentMatcherTuple>::value));676EXPECT_TRUE((std::is_same<void(bool), F::MakeResultVoid>::value)); // NOLINT677EXPECT_TRUE((std::is_same<IgnoredValue(bool), // NOLINT678F::MakeResultIgnoredValue>::value));679}680681TEST(FunctionTest, Binary) {682typedef Function<int(bool, const long&)> F; // NOLINT683EXPECT_EQ(2u, F::ArgumentCount);684EXPECT_TRUE((std::is_same<int, F::Result>::value));685EXPECT_TRUE((std::is_same<bool, F::Arg<0>::type>::value));686EXPECT_TRUE((std::is_same<const long&, F::Arg<1>::type>::value)); // NOLINT687EXPECT_TRUE((std::is_same<std::tuple<bool, const long&>, // NOLINT688F::ArgumentTuple>::value));689EXPECT_TRUE(690(std::is_same<std::tuple<Matcher<bool>, Matcher<const long&>>, // NOLINT691F::ArgumentMatcherTuple>::value));692EXPECT_TRUE((std::is_same<void(bool, const long&), // NOLINT693F::MakeResultVoid>::value));694EXPECT_TRUE((std::is_same<IgnoredValue(bool, const long&), // NOLINT695F::MakeResultIgnoredValue>::value));696}697698TEST(FunctionTest, LongArgumentList) {699typedef Function<char(bool, int, char*, int&, const long&)> F; // NOLINT700EXPECT_EQ(5u, F::ArgumentCount);701EXPECT_TRUE((std::is_same<char, F::Result>::value));702EXPECT_TRUE((std::is_same<bool, F::Arg<0>::type>::value));703EXPECT_TRUE((std::is_same<int, F::Arg<1>::type>::value));704EXPECT_TRUE((std::is_same<char*, F::Arg<2>::type>::value));705EXPECT_TRUE((std::is_same<int&, F::Arg<3>::type>::value));706EXPECT_TRUE((std::is_same<const long&, F::Arg<4>::type>::value)); // NOLINT707EXPECT_TRUE(708(std::is_same<std::tuple<bool, int, char*, int&, const long&>, // NOLINT709F::ArgumentTuple>::value));710EXPECT_TRUE(711(std::is_same<712std::tuple<Matcher<bool>, Matcher<int>, Matcher<char*>, Matcher<int&>,713Matcher<const long&>>, // NOLINT714F::ArgumentMatcherTuple>::value));715EXPECT_TRUE(716(std::is_same<void(bool, int, char*, int&, const long&), // NOLINT717F::MakeResultVoid>::value));718EXPECT_TRUE((719std::is_same<IgnoredValue(bool, int, char*, int&, const long&), // NOLINT720F::MakeResultIgnoredValue>::value));721}722723TEST(Base64Unescape, InvalidString) {724std::string unescaped;725EXPECT_FALSE(Base64Unescape("(invalid)", &unescaped));726}727728TEST(Base64Unescape, ShortString) {729std::string unescaped;730EXPECT_TRUE(Base64Unescape("SGVsbG8gd29ybGQh", &unescaped));731EXPECT_EQ("Hello world!", unescaped);732}733734TEST(Base64Unescape, ShortStringWithPadding) {735std::string unescaped;736EXPECT_TRUE(Base64Unescape("SGVsbG8gd29ybGQ=", &unescaped));737EXPECT_EQ("Hello world", unescaped);738}739740TEST(Base64Unescape, ShortStringWithoutPadding) {741std::string unescaped;742EXPECT_TRUE(Base64Unescape("SGVsbG8gd29ybGQ", &unescaped));743EXPECT_EQ("Hello world", unescaped);744}745746TEST(Base64Unescape, LongStringWithWhiteSpaces) {747std::string escaped =748R"(TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz749IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg750dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu751dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo752ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=)";753std::string expected =754"Man is distinguished, not only by his reason, but by this singular "755"passion from other animals, which is a lust of the mind, that by a "756"perseverance of delight in the continued and indefatigable generation "757"of knowledge, exceeds the short vehemence of any carnal pleasure.";758std::string unescaped;759EXPECT_TRUE(Base64Unescape(escaped, &unescaped));760EXPECT_EQ(expected, unescaped);761}762763} // namespace764} // namespace internal765} // namespace testing766767768