Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:19:56

0001 // Copyright 2007, Google Inc.
0002 // All rights reserved.
0003 //
0004 // Redistribution and use in source and binary forms, with or without
0005 // modification, are permitted provided that the following conditions are
0006 // met:
0007 //
0008 //     * Redistributions of source code must retain the above copyright
0009 // notice, this list of conditions and the following disclaimer.
0010 //     * Redistributions in binary form must reproduce the above
0011 // copyright notice, this list of conditions and the following disclaimer
0012 // in the documentation and/or other materials provided with the
0013 // distribution.
0014 //     * Neither the name of Google Inc. nor the names of its
0015 // contributors may be used to endorse or promote products derived from
0016 // this software without specific prior written permission.
0017 //
0018 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
0019 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
0020 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
0021 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
0022 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
0023 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
0024 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
0025 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
0026 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
0027 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
0028 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0029 //
0030 // Author: wan@google.com (Zhanyong Wan)
0031 
0032 // Google Mock - a framework for writing C++ mock classes.
0033 //
0034 // This file tests the internal utilities.
0035 
0036 #include "gmock/internal/gmock-internal-utils.h"
0037 #include <stdlib.h>
0038 #include <map>
0039 #include <memory>
0040 #include <string>
0041 #include <sstream>
0042 #include <vector>
0043 #include "gmock/gmock.h"
0044 #include "gmock/internal/gmock-port.h"
0045 #include "gtest/gtest.h"
0046 #include "gtest/gtest-spi.h"
0047 
0048 // Indicates that this translation unit is part of Google Test's
0049 // implementation.  It must come before gtest-internal-inl.h is
0050 // included, or there will be a compiler error.  This trick is to
0051 // prevent a user from accidentally including gtest-internal-inl.h in
0052 // his code.
0053 #define GTEST_IMPLEMENTATION_ 1
0054 #include "src/gtest-internal-inl.h"
0055 #undef GTEST_IMPLEMENTATION_
0056 
0057 #if GTEST_OS_CYGWIN
0058 # include <sys/types.h>  // For ssize_t. NOLINT
0059 #endif
0060 
0061 class ProtocolMessage;
0062 
0063 namespace proto2 {
0064 class Message;
0065 }  // namespace proto2
0066 
0067 namespace testing {
0068 namespace internal {
0069 
0070 namespace {
0071 
0072 TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsNoWord) {
0073   EXPECT_EQ("", ConvertIdentifierNameToWords(""));
0074   EXPECT_EQ("", ConvertIdentifierNameToWords("_"));
0075   EXPECT_EQ("", ConvertIdentifierNameToWords("__"));
0076 }
0077 
0078 TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsDigits) {
0079   EXPECT_EQ("1", ConvertIdentifierNameToWords("_1"));
0080   EXPECT_EQ("2", ConvertIdentifierNameToWords("2_"));
0081   EXPECT_EQ("34", ConvertIdentifierNameToWords("_34_"));
0082   EXPECT_EQ("34 56", ConvertIdentifierNameToWords("_34_56"));
0083 }
0084 
0085 TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsCamelCaseWords) {
0086   EXPECT_EQ("a big word", ConvertIdentifierNameToWords("ABigWord"));
0087   EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("FooBar"));
0088   EXPECT_EQ("foo", ConvertIdentifierNameToWords("Foo_"));
0089   EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_Foo_Bar_"));
0090   EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_Foo__And_Bar"));
0091 }
0092 
0093 TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContains_SeparatedWords) {
0094   EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("foo_bar"));
0095   EXPECT_EQ("foo", ConvertIdentifierNameToWords("_foo_"));
0096   EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_foo_bar_"));
0097   EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_foo__and_bar"));
0098 }
0099 
0100 TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameIsMixture) {
0101   EXPECT_EQ("foo bar 123", ConvertIdentifierNameToWords("Foo_bar123"));
0102   EXPECT_EQ("chapter 11 section 1",
0103             ConvertIdentifierNameToWords("_Chapter11Section_1_"));
0104 }
0105 
0106 TEST(PointeeOfTest, WorksForSmartPointers) {
0107   CompileAssertTypesEqual<const char,
0108       PointeeOf<internal::linked_ptr<const char> >::type>();
0109 #if GTEST_HAS_STD_UNIQUE_PTR_
0110   CompileAssertTypesEqual<int, PointeeOf<std::unique_ptr<int> >::type>();
0111 #endif  // GTEST_HAS_STD_UNIQUE_PTR_
0112 #if GTEST_HAS_STD_SHARED_PTR_
0113   CompileAssertTypesEqual<std::string,
0114                           PointeeOf<std::shared_ptr<std::string> >::type>();
0115 #endif  // GTEST_HAS_STD_SHARED_PTR_
0116 }
0117 
0118 TEST(PointeeOfTest, WorksForRawPointers) {
0119   CompileAssertTypesEqual<int, PointeeOf<int*>::type>();
0120   CompileAssertTypesEqual<const char, PointeeOf<const char*>::type>();
0121   CompileAssertTypesEqual<void, PointeeOf<void*>::type>();
0122 }
0123 
0124 TEST(GetRawPointerTest, WorksForSmartPointers) {
0125 #if GTEST_HAS_STD_UNIQUE_PTR_
0126   const char* const raw_p1 = new const char('a');  // NOLINT
0127   const std::unique_ptr<const char> p1(raw_p1);
0128   EXPECT_EQ(raw_p1, GetRawPointer(p1));
0129 #endif  // GTEST_HAS_STD_UNIQUE_PTR_
0130 #if GTEST_HAS_STD_SHARED_PTR_
0131   double* const raw_p2 = new double(2.5);  // NOLINT
0132   const std::shared_ptr<double> p2(raw_p2);
0133   EXPECT_EQ(raw_p2, GetRawPointer(p2));
0134 #endif  // GTEST_HAS_STD_SHARED_PTR_
0135 
0136   const char* const raw_p4 = new const char('a');  // NOLINT
0137   const internal::linked_ptr<const char> p4(raw_p4);
0138   EXPECT_EQ(raw_p4, GetRawPointer(p4));
0139 }
0140 
0141 TEST(GetRawPointerTest, WorksForRawPointers) {
0142   int* p = NULL;
0143   // Don't use EXPECT_EQ as no NULL-testing magic on Symbian.
0144   EXPECT_TRUE(NULL == GetRawPointer(p));
0145   int n = 1;
0146   EXPECT_EQ(&n, GetRawPointer(&n));
0147 }
0148 
0149 // Tests KindOf<T>.
0150 
0151 class Base {};
0152 class Derived : public Base {};
0153 
0154 TEST(KindOfTest, Bool) {
0155   EXPECT_EQ(kBool, GMOCK_KIND_OF_(bool));  // NOLINT
0156 }
0157 
0158 TEST(KindOfTest, Integer) {
0159   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(char));  // NOLINT
0160   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(signed char));  // NOLINT
0161   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned char));  // NOLINT
0162   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(short));  // NOLINT
0163   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned short));  // NOLINT
0164   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(int));  // NOLINT
0165   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned int));  // NOLINT
0166   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long));  // NOLINT
0167   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long));  // NOLINT
0168   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(wchar_t));  // NOLINT
0169   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(Int64));  // NOLINT
0170   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(UInt64));  // NOLINT
0171   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(size_t));  // NOLINT
0172 #if GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN
0173   // ssize_t is not defined on Windows and possibly some other OSes.
0174   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(ssize_t));  // NOLINT
0175 #endif
0176 }
0177 
0178 TEST(KindOfTest, FloatingPoint) {
0179   EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(float));  // NOLINT
0180   EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(double));  // NOLINT
0181   EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(long double));  // NOLINT
0182 }
0183 
0184 TEST(KindOfTest, Other) {
0185   EXPECT_EQ(kOther, GMOCK_KIND_OF_(void*));  // NOLINT
0186   EXPECT_EQ(kOther, GMOCK_KIND_OF_(char**));  // NOLINT
0187   EXPECT_EQ(kOther, GMOCK_KIND_OF_(Base));  // NOLINT
0188 }
0189 
0190 // Tests LosslessArithmeticConvertible<T, U>.
0191 
0192 TEST(LosslessArithmeticConvertibleTest, BoolToBool) {
0193   EXPECT_TRUE((LosslessArithmeticConvertible<bool, bool>::value));
0194 }
0195 
0196 TEST(LosslessArithmeticConvertibleTest, BoolToInteger) {
0197   EXPECT_TRUE((LosslessArithmeticConvertible<bool, char>::value));
0198   EXPECT_TRUE((LosslessArithmeticConvertible<bool, int>::value));
0199   EXPECT_TRUE(
0200       (LosslessArithmeticConvertible<bool, unsigned long>::value));  // NOLINT
0201 }
0202 
0203 TEST(LosslessArithmeticConvertibleTest, BoolToFloatingPoint) {
0204   EXPECT_TRUE((LosslessArithmeticConvertible<bool, float>::value));
0205   EXPECT_TRUE((LosslessArithmeticConvertible<bool, double>::value));
0206 }
0207 
0208 TEST(LosslessArithmeticConvertibleTest, IntegerToBool) {
0209   EXPECT_FALSE((LosslessArithmeticConvertible<unsigned char, bool>::value));
0210   EXPECT_FALSE((LosslessArithmeticConvertible<int, bool>::value));
0211 }
0212 
0213 TEST(LosslessArithmeticConvertibleTest, IntegerToInteger) {
0214   // Unsigned => larger signed is fine.
0215   EXPECT_TRUE((LosslessArithmeticConvertible<unsigned char, int>::value));
0216 
0217   // Unsigned => larger unsigned is fine.
0218   EXPECT_TRUE(
0219       (LosslessArithmeticConvertible<unsigned short, UInt64>::value)); // NOLINT
0220 
0221   // Signed => unsigned is not fine.
0222   EXPECT_FALSE((LosslessArithmeticConvertible<short, UInt64>::value)); // NOLINT
0223   EXPECT_FALSE((LosslessArithmeticConvertible<
0224       signed char, unsigned int>::value));  // NOLINT
0225 
0226   // Same size and same signedness: fine too.
0227   EXPECT_TRUE((LosslessArithmeticConvertible<
0228                unsigned char, unsigned char>::value));
0229   EXPECT_TRUE((LosslessArithmeticConvertible<int, int>::value));
0230   EXPECT_TRUE((LosslessArithmeticConvertible<wchar_t, wchar_t>::value));
0231   EXPECT_TRUE((LosslessArithmeticConvertible<
0232                unsigned long, unsigned long>::value));  // NOLINT
0233 
0234   // Same size, different signedness: not fine.
0235   EXPECT_FALSE((LosslessArithmeticConvertible<
0236                 unsigned char, signed char>::value));
0237   EXPECT_FALSE((LosslessArithmeticConvertible<int, unsigned int>::value));
0238   EXPECT_FALSE((LosslessArithmeticConvertible<UInt64, Int64>::value));
0239 
0240   // Larger size => smaller size is not fine.
0241   EXPECT_FALSE((LosslessArithmeticConvertible<long, char>::value));  // NOLINT
0242   EXPECT_FALSE((LosslessArithmeticConvertible<int, signed char>::value));
0243   EXPECT_FALSE((LosslessArithmeticConvertible<Int64, unsigned int>::value));
0244 }
0245 
0246 TEST(LosslessArithmeticConvertibleTest, IntegerToFloatingPoint) {
0247   // Integers cannot be losslessly converted to floating-points, as
0248   // the format of the latter is implementation-defined.
0249   EXPECT_FALSE((LosslessArithmeticConvertible<char, float>::value));
0250   EXPECT_FALSE((LosslessArithmeticConvertible<int, double>::value));
0251   EXPECT_FALSE((LosslessArithmeticConvertible<
0252                 short, long double>::value));  // NOLINT
0253 }
0254 
0255 TEST(LosslessArithmeticConvertibleTest, FloatingPointToBool) {
0256   EXPECT_FALSE((LosslessArithmeticConvertible<float, bool>::value));
0257   EXPECT_FALSE((LosslessArithmeticConvertible<double, bool>::value));
0258 }
0259 
0260 TEST(LosslessArithmeticConvertibleTest, FloatingPointToInteger) {
0261   EXPECT_FALSE((LosslessArithmeticConvertible<float, long>::value));  // NOLINT
0262   EXPECT_FALSE((LosslessArithmeticConvertible<double, Int64>::value));
0263   EXPECT_FALSE((LosslessArithmeticConvertible<long double, int>::value));
0264 }
0265 
0266 TEST(LosslessArithmeticConvertibleTest, FloatingPointToFloatingPoint) {
0267   // Smaller size => larger size is fine.
0268   EXPECT_TRUE((LosslessArithmeticConvertible<float, double>::value));
0269   EXPECT_TRUE((LosslessArithmeticConvertible<float, long double>::value));
0270   EXPECT_TRUE((LosslessArithmeticConvertible<double, long double>::value));
0271 
0272   // Same size: fine.
0273   EXPECT_TRUE((LosslessArithmeticConvertible<float, float>::value));
0274   EXPECT_TRUE((LosslessArithmeticConvertible<double, double>::value));
0275 
0276   // Larger size => smaller size is not fine.
0277   EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value));
0278   GTEST_INTENTIONAL_CONST_COND_PUSH_()
0279   if (sizeof(double) == sizeof(long double)) {  // NOLINT
0280   GTEST_INTENTIONAL_CONST_COND_POP_()
0281     // In some implementations (e.g. MSVC), double and long double
0282     // have the same size.
0283     EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value));
0284   } else {
0285     EXPECT_FALSE((LosslessArithmeticConvertible<long double, double>::value));
0286   }
0287 }
0288 
0289 // Tests the TupleMatches() template function.
0290 
0291 TEST(TupleMatchesTest, WorksForSize0) {
0292   tuple<> matchers;
0293   tuple<> values;
0294 
0295   EXPECT_TRUE(TupleMatches(matchers, values));
0296 }
0297 
0298 TEST(TupleMatchesTest, WorksForSize1) {
0299   tuple<Matcher<int> > matchers(Eq(1));
0300   tuple<int> values1(1),
0301       values2(2);
0302 
0303   EXPECT_TRUE(TupleMatches(matchers, values1));
0304   EXPECT_FALSE(TupleMatches(matchers, values2));
0305 }
0306 
0307 TEST(TupleMatchesTest, WorksForSize2) {
0308   tuple<Matcher<int>, Matcher<char> > matchers(Eq(1), Eq('a'));
0309   tuple<int, char> values1(1, 'a'),
0310       values2(1, 'b'),
0311       values3(2, 'a'),
0312       values4(2, 'b');
0313 
0314   EXPECT_TRUE(TupleMatches(matchers, values1));
0315   EXPECT_FALSE(TupleMatches(matchers, values2));
0316   EXPECT_FALSE(TupleMatches(matchers, values3));
0317   EXPECT_FALSE(TupleMatches(matchers, values4));
0318 }
0319 
0320 TEST(TupleMatchesTest, WorksForSize5) {
0321   tuple<Matcher<int>, Matcher<char>, Matcher<bool>, Matcher<long>,  // NOLINT
0322       Matcher<string> >
0323       matchers(Eq(1), Eq('a'), Eq(true), Eq(2L), Eq("hi"));
0324   tuple<int, char, bool, long, string>  // NOLINT
0325       values1(1, 'a', true, 2L, "hi"),
0326       values2(1, 'a', true, 2L, "hello"),
0327       values3(2, 'a', true, 2L, "hi");
0328 
0329   EXPECT_TRUE(TupleMatches(matchers, values1));
0330   EXPECT_FALSE(TupleMatches(matchers, values2));
0331   EXPECT_FALSE(TupleMatches(matchers, values3));
0332 }
0333 
0334 // Tests that Assert(true, ...) succeeds.
0335 TEST(AssertTest, SucceedsOnTrue) {
0336   Assert(true, __FILE__, __LINE__, "This should succeed.");
0337   Assert(true, __FILE__, __LINE__);  // This should succeed too.
0338 }
0339 
0340 // Tests that Assert(false, ...) generates a fatal failure.
0341 TEST(AssertTest, FailsFatallyOnFalse) {
0342   EXPECT_DEATH_IF_SUPPORTED({
0343     Assert(false, __FILE__, __LINE__, "This should fail.");
0344   }, "");
0345 
0346   EXPECT_DEATH_IF_SUPPORTED({
0347     Assert(false, __FILE__, __LINE__);
0348   }, "");
0349 }
0350 
0351 // Tests that Expect(true, ...) succeeds.
0352 TEST(ExpectTest, SucceedsOnTrue) {
0353   Expect(true, __FILE__, __LINE__, "This should succeed.");
0354   Expect(true, __FILE__, __LINE__);  // This should succeed too.
0355 }
0356 
0357 // Tests that Expect(false, ...) generates a non-fatal failure.
0358 TEST(ExpectTest, FailsNonfatallyOnFalse) {
0359   EXPECT_NONFATAL_FAILURE({  // NOLINT
0360     Expect(false, __FILE__, __LINE__, "This should fail.");
0361   }, "This should fail");
0362 
0363   EXPECT_NONFATAL_FAILURE({  // NOLINT
0364     Expect(false, __FILE__, __LINE__);
0365   }, "Expectation failed");
0366 }
0367 
0368 // Tests LogIsVisible().
0369 
0370 class LogIsVisibleTest : public ::testing::Test {
0371  protected:
0372   virtual void SetUp() {
0373     original_verbose_ = GMOCK_FLAG(verbose);
0374   }
0375 
0376   virtual void TearDown() { GMOCK_FLAG(verbose) = original_verbose_; }
0377 
0378   string original_verbose_;
0379 };
0380 
0381 TEST_F(LogIsVisibleTest, AlwaysReturnsTrueIfVerbosityIsInfo) {
0382   GMOCK_FLAG(verbose) = kInfoVerbosity;
0383   EXPECT_TRUE(LogIsVisible(kInfo));
0384   EXPECT_TRUE(LogIsVisible(kWarning));
0385 }
0386 
0387 TEST_F(LogIsVisibleTest, AlwaysReturnsFalseIfVerbosityIsError) {
0388   GMOCK_FLAG(verbose) = kErrorVerbosity;
0389   EXPECT_FALSE(LogIsVisible(kInfo));
0390   EXPECT_FALSE(LogIsVisible(kWarning));
0391 }
0392 
0393 TEST_F(LogIsVisibleTest, WorksWhenVerbosityIsWarning) {
0394   GMOCK_FLAG(verbose) = kWarningVerbosity;
0395   EXPECT_FALSE(LogIsVisible(kInfo));
0396   EXPECT_TRUE(LogIsVisible(kWarning));
0397 }
0398 
0399 #if GTEST_HAS_STREAM_REDIRECTION
0400 
0401 // Tests the Log() function.
0402 
0403 // Verifies that Log() behaves correctly for the given verbosity level
0404 // and log severity.
0405 void TestLogWithSeverity(const string& verbosity, LogSeverity severity,
0406                          bool should_print) {
0407   const string old_flag = GMOCK_FLAG(verbose);
0408   GMOCK_FLAG(verbose) = verbosity;
0409   CaptureStdout();
0410   Log(severity, "Test log.\n", 0);
0411   if (should_print) {
0412     EXPECT_THAT(GetCapturedStdout().c_str(),
0413                 ContainsRegex(
0414                     severity == kWarning ?
0415                     "^\nGMOCK WARNING:\nTest log\\.\nStack trace:\n" :
0416                     "^\nTest log\\.\nStack trace:\n"));
0417   } else {
0418     EXPECT_STREQ("", GetCapturedStdout().c_str());
0419   }
0420   GMOCK_FLAG(verbose) = old_flag;
0421 }
0422 
0423 // Tests that when the stack_frames_to_skip parameter is negative,
0424 // Log() doesn't include the stack trace in the output.
0425 TEST(LogTest, NoStackTraceWhenStackFramesToSkipIsNegative) {
0426   const string saved_flag = GMOCK_FLAG(verbose);
0427   GMOCK_FLAG(verbose) = kInfoVerbosity;
0428   CaptureStdout();
0429   Log(kInfo, "Test log.\n", -1);
0430   EXPECT_STREQ("\nTest log.\n", GetCapturedStdout().c_str());
0431   GMOCK_FLAG(verbose) = saved_flag;
0432 }
0433 
0434 struct MockStackTraceGetter : testing::internal::OsStackTraceGetterInterface {
0435   virtual string CurrentStackTrace(int max_depth, int skip_count) {
0436     return (testing::Message() << max_depth << "::" << skip_count << "\n")
0437         .GetString();
0438   }
0439   virtual void UponLeavingGTest() {}
0440 };
0441 
0442 // Tests that in opt mode, a positive stack_frames_to_skip argument is
0443 // treated as 0.
0444 TEST(LogTest, NoSkippingStackFrameInOptMode) {
0445   MockStackTraceGetter* mock_os_stack_trace_getter = new MockStackTraceGetter;
0446   GetUnitTestImpl()->set_os_stack_trace_getter(mock_os_stack_trace_getter);
0447 
0448   CaptureStdout();
0449   Log(kWarning, "Test log.\n", 100);
0450   const string log = GetCapturedStdout();
0451 
0452   string expected_trace =
0453       (testing::Message() << GTEST_FLAG(stack_trace_depth) << "::").GetString();
0454   string expected_message =
0455       "\nGMOCK WARNING:\n"
0456       "Test log.\n"
0457       "Stack trace:\n" +
0458       expected_trace;
0459   EXPECT_THAT(log, HasSubstr(expected_message));
0460   int skip_count = atoi(log.substr(expected_message.size()).c_str());
0461 
0462 # if defined(NDEBUG)
0463   // In opt mode, no stack frame should be skipped.
0464   const int expected_skip_count = 0;
0465 # else
0466   // In dbg mode, the stack frames should be skipped.
0467   const int expected_skip_count = 100;
0468 # endif
0469 
0470   // Note that each inner implementation layer will +1 the number to remove
0471   // itself from the trace. This means that the value is a little higher than
0472   // expected, but close enough.
0473   EXPECT_THAT(skip_count,
0474               AllOf(Ge(expected_skip_count), Le(expected_skip_count + 10)));
0475 
0476   // Restores the default OS stack trace getter.
0477   GetUnitTestImpl()->set_os_stack_trace_getter(NULL);
0478 }
0479 
0480 // Tests that all logs are printed when the value of the
0481 // --gmock_verbose flag is "info".
0482 TEST(LogTest, AllLogsArePrintedWhenVerbosityIsInfo) {
0483   TestLogWithSeverity(kInfoVerbosity, kInfo, true);
0484   TestLogWithSeverity(kInfoVerbosity, kWarning, true);
0485 }
0486 
0487 // Tests that only warnings are printed when the value of the
0488 // --gmock_verbose flag is "warning".
0489 TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsWarning) {
0490   TestLogWithSeverity(kWarningVerbosity, kInfo, false);
0491   TestLogWithSeverity(kWarningVerbosity, kWarning, true);
0492 }
0493 
0494 // Tests that no logs are printed when the value of the
0495 // --gmock_verbose flag is "error".
0496 TEST(LogTest, NoLogsArePrintedWhenVerbosityIsError) {
0497   TestLogWithSeverity(kErrorVerbosity, kInfo, false);
0498   TestLogWithSeverity(kErrorVerbosity, kWarning, false);
0499 }
0500 
0501 // Tests that only warnings are printed when the value of the
0502 // --gmock_verbose flag is invalid.
0503 TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsInvalid) {
0504   TestLogWithSeverity("invalid", kInfo, false);
0505   TestLogWithSeverity("invalid", kWarning, true);
0506 }
0507 
0508 #endif  // GTEST_HAS_STREAM_REDIRECTION
0509 
0510 TEST(TypeTraitsTest, true_type) {
0511   EXPECT_TRUE(true_type::value);
0512 }
0513 
0514 TEST(TypeTraitsTest, false_type) {
0515   EXPECT_FALSE(false_type::value);
0516 }
0517 
0518 TEST(TypeTraitsTest, is_reference) {
0519   EXPECT_FALSE(is_reference<int>::value);
0520   EXPECT_FALSE(is_reference<char*>::value);
0521   EXPECT_TRUE(is_reference<const int&>::value);
0522 }
0523 
0524 TEST(TypeTraitsTest, is_pointer) {
0525   EXPECT_FALSE(is_pointer<int>::value);
0526   EXPECT_FALSE(is_pointer<char&>::value);
0527   EXPECT_TRUE(is_pointer<const int*>::value);
0528 }
0529 
0530 TEST(TypeTraitsTest, type_equals) {
0531   EXPECT_FALSE((type_equals<int, const int>::value));
0532   EXPECT_FALSE((type_equals<int, int&>::value));
0533   EXPECT_FALSE((type_equals<int, double>::value));
0534   EXPECT_TRUE((type_equals<char, char>::value));
0535 }
0536 
0537 TEST(TypeTraitsTest, remove_reference) {
0538   EXPECT_TRUE((type_equals<char, remove_reference<char&>::type>::value));
0539   EXPECT_TRUE((type_equals<const int,
0540                remove_reference<const int&>::type>::value));
0541   EXPECT_TRUE((type_equals<int, remove_reference<int>::type>::value));
0542   EXPECT_TRUE((type_equals<double*, remove_reference<double*>::type>::value));
0543 }
0544 
0545 #if GTEST_HAS_STREAM_REDIRECTION
0546 
0547 // Verifies that Log() behaves correctly for the given verbosity level
0548 // and log severity.
0549 std::string GrabOutput(void(*logger)(), const char* verbosity) {
0550   const string saved_flag = GMOCK_FLAG(verbose);
0551   GMOCK_FLAG(verbose) = verbosity;
0552   CaptureStdout();
0553   logger();
0554   GMOCK_FLAG(verbose) = saved_flag;
0555   return GetCapturedStdout();
0556 }
0557 
0558 class DummyMock {
0559  public:
0560   MOCK_METHOD0(TestMethod, void());
0561   MOCK_METHOD1(TestMethodArg, void(int dummy));
0562 };
0563 
0564 void ExpectCallLogger() {
0565   DummyMock mock;
0566   EXPECT_CALL(mock, TestMethod());
0567   mock.TestMethod();
0568 };
0569 
0570 // Verifies that EXPECT_CALL logs if the --gmock_verbose flag is set to "info".
0571 TEST(ExpectCallTest, LogsWhenVerbosityIsInfo) {
0572   EXPECT_THAT(std::string(GrabOutput(ExpectCallLogger, kInfoVerbosity)),
0573               HasSubstr("EXPECT_CALL(mock, TestMethod())"));
0574 }
0575 
0576 // Verifies that EXPECT_CALL doesn't log
0577 // if the --gmock_verbose flag is set to "warning".
0578 TEST(ExpectCallTest, DoesNotLogWhenVerbosityIsWarning) {
0579   EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kWarningVerbosity).c_str());
0580 }
0581 
0582 // Verifies that EXPECT_CALL doesn't log
0583 // if the --gmock_verbose flag is set to "error".
0584 TEST(ExpectCallTest,  DoesNotLogWhenVerbosityIsError) {
0585   EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kErrorVerbosity).c_str());
0586 }
0587 
0588 void OnCallLogger() {
0589   DummyMock mock;
0590   ON_CALL(mock, TestMethod());
0591 };
0592 
0593 // Verifies that ON_CALL logs if the --gmock_verbose flag is set to "info".
0594 TEST(OnCallTest, LogsWhenVerbosityIsInfo) {
0595   EXPECT_THAT(std::string(GrabOutput(OnCallLogger, kInfoVerbosity)),
0596               HasSubstr("ON_CALL(mock, TestMethod())"));
0597 }
0598 
0599 // Verifies that ON_CALL doesn't log
0600 // if the --gmock_verbose flag is set to "warning".
0601 TEST(OnCallTest, DoesNotLogWhenVerbosityIsWarning) {
0602   EXPECT_STREQ("", GrabOutput(OnCallLogger, kWarningVerbosity).c_str());
0603 }
0604 
0605 // Verifies that ON_CALL doesn't log if
0606 // the --gmock_verbose flag is set to "error".
0607 TEST(OnCallTest, DoesNotLogWhenVerbosityIsError) {
0608   EXPECT_STREQ("", GrabOutput(OnCallLogger, kErrorVerbosity).c_str());
0609 }
0610 
0611 void OnCallAnyArgumentLogger() {
0612   DummyMock mock;
0613   ON_CALL(mock, TestMethodArg(_));
0614 }
0615 
0616 // Verifies that ON_CALL prints provided _ argument.
0617 TEST(OnCallTest, LogsAnythingArgument) {
0618   EXPECT_THAT(std::string(GrabOutput(OnCallAnyArgumentLogger, kInfoVerbosity)),
0619               HasSubstr("ON_CALL(mock, TestMethodArg(_)"));
0620 }
0621 
0622 #endif  // GTEST_HAS_STREAM_REDIRECTION
0623 
0624 // Tests StlContainerView.
0625 
0626 TEST(StlContainerViewTest, WorksForStlContainer) {
0627   StaticAssertTypeEq<std::vector<int>,
0628       StlContainerView<std::vector<int> >::type>();
0629   StaticAssertTypeEq<const std::vector<double>&,
0630       StlContainerView<std::vector<double> >::const_reference>();
0631 
0632   typedef std::vector<char> Chars;
0633   Chars v1;
0634   const Chars& v2(StlContainerView<Chars>::ConstReference(v1));
0635   EXPECT_EQ(&v1, &v2);
0636 
0637   v1.push_back('a');
0638   Chars v3 = StlContainerView<Chars>::Copy(v1);
0639   EXPECT_THAT(v3, Eq(v3));
0640 }
0641 
0642 TEST(StlContainerViewTest, WorksForStaticNativeArray) {
0643   StaticAssertTypeEq<NativeArray<int>,
0644       StlContainerView<int[3]>::type>();
0645   StaticAssertTypeEq<NativeArray<double>,
0646       StlContainerView<const double[4]>::type>();
0647   StaticAssertTypeEq<NativeArray<char[3]>,
0648       StlContainerView<const char[2][3]>::type>();
0649 
0650   StaticAssertTypeEq<const NativeArray<int>,
0651       StlContainerView<int[2]>::const_reference>();
0652 
0653   int a1[3] = { 0, 1, 2 };
0654   NativeArray<int> a2 = StlContainerView<int[3]>::ConstReference(a1);
0655   EXPECT_EQ(3U, a2.size());
0656   EXPECT_EQ(a1, a2.begin());
0657 
0658   const NativeArray<int> a3 = StlContainerView<int[3]>::Copy(a1);
0659   ASSERT_EQ(3U, a3.size());
0660   EXPECT_EQ(0, a3.begin()[0]);
0661   EXPECT_EQ(1, a3.begin()[1]);
0662   EXPECT_EQ(2, a3.begin()[2]);
0663 
0664   // Makes sure a1 and a3 aren't aliases.
0665   a1[0] = 3;
0666   EXPECT_EQ(0, a3.begin()[0]);
0667 }
0668 
0669 TEST(StlContainerViewTest, WorksForDynamicNativeArray) {
0670   StaticAssertTypeEq<NativeArray<int>,
0671       StlContainerView<tuple<const int*, size_t> >::type>();
0672   StaticAssertTypeEq<NativeArray<double>,
0673       StlContainerView<tuple<linked_ptr<double>, int> >::type>();
0674 
0675   StaticAssertTypeEq<const NativeArray<int>,
0676       StlContainerView<tuple<const int*, int> >::const_reference>();
0677 
0678   int a1[3] = { 0, 1, 2 };
0679   const int* const p1 = a1;
0680   NativeArray<int> a2 = StlContainerView<tuple<const int*, int> >::
0681       ConstReference(make_tuple(p1, 3));
0682   EXPECT_EQ(3U, a2.size());
0683   EXPECT_EQ(a1, a2.begin());
0684 
0685   const NativeArray<int> a3 = StlContainerView<tuple<int*, size_t> >::
0686       Copy(make_tuple(static_cast<int*>(a1), 3));
0687   ASSERT_EQ(3U, a3.size());
0688   EXPECT_EQ(0, a3.begin()[0]);
0689   EXPECT_EQ(1, a3.begin()[1]);
0690   EXPECT_EQ(2, a3.begin()[2]);
0691 
0692   // Makes sure a1 and a3 aren't aliases.
0693   a1[0] = 3;
0694   EXPECT_EQ(0, a3.begin()[0]);
0695 }
0696 
0697 }  // namespace
0698 }  // namespace internal
0699 }  // namespace testing