gmock-internal-utils_test.cc 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. // Copyright 2007, Google Inc.
  2. // All rights reserved.
  3. //
  4. // Redistribution and use in source and binary forms, with or without
  5. // modification, are permitted provided that the following conditions are
  6. // met:
  7. //
  8. // * Redistributions of source code must retain the above copyright
  9. // notice, this list of conditions and the following disclaimer.
  10. // * Redistributions in binary form must reproduce the above
  11. // copyright notice, this list of conditions and the following disclaimer
  12. // in the documentation and/or other materials provided with the
  13. // distribution.
  14. // * Neither the name of Google Inc. nor the names of its
  15. // contributors may be used to endorse or promote products derived from
  16. // this software without specific prior written permission.
  17. //
  18. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  19. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  20. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  21. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  22. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  23. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  24. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  28. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. //
  30. // Author: wan@google.com (Zhanyong Wan)
  31. // Google Mock - a framework for writing C++ mock classes.
  32. //
  33. // This file tests the internal utilities.
  34. #include "gmock/internal/gmock-internal-utils.h"
  35. #include <stdlib.h>
  36. #include <map>
  37. #include <memory>
  38. #include <string>
  39. #include <sstream>
  40. #include <vector>
  41. #include "gmock/gmock.h"
  42. #include "gmock/internal/gmock-port.h"
  43. #include "gtest/gtest.h"
  44. #include "gtest/gtest-spi.h"
  45. // Indicates that this translation unit is part of Google Test's
  46. // implementation. It must come before gtest-internal-inl.h is
  47. // included, or there will be a compiler error. This trick is to
  48. // prevent a user from accidentally including gtest-internal-inl.h in
  49. // his code.
  50. #define GTEST_IMPLEMENTATION_ 1
  51. #include "src/gtest-internal-inl.h"
  52. #undef GTEST_IMPLEMENTATION_
  53. #if GTEST_OS_CYGWIN
  54. # include <sys/types.h> // For ssize_t. NOLINT
  55. #endif
  56. class ProtocolMessage;
  57. namespace proto2 {
  58. class Message;
  59. } // namespace proto2
  60. namespace testing {
  61. namespace internal {
  62. namespace {
  63. TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsNoWord) {
  64. EXPECT_EQ("", ConvertIdentifierNameToWords(""));
  65. EXPECT_EQ("", ConvertIdentifierNameToWords("_"));
  66. EXPECT_EQ("", ConvertIdentifierNameToWords("__"));
  67. }
  68. TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsDigits) {
  69. EXPECT_EQ("1", ConvertIdentifierNameToWords("_1"));
  70. EXPECT_EQ("2", ConvertIdentifierNameToWords("2_"));
  71. EXPECT_EQ("34", ConvertIdentifierNameToWords("_34_"));
  72. EXPECT_EQ("34 56", ConvertIdentifierNameToWords("_34_56"));
  73. }
  74. TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsCamelCaseWords) {
  75. EXPECT_EQ("a big word", ConvertIdentifierNameToWords("ABigWord"));
  76. EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("FooBar"));
  77. EXPECT_EQ("foo", ConvertIdentifierNameToWords("Foo_"));
  78. EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_Foo_Bar_"));
  79. EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_Foo__And_Bar"));
  80. }
  81. TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContains_SeparatedWords) {
  82. EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("foo_bar"));
  83. EXPECT_EQ("foo", ConvertIdentifierNameToWords("_foo_"));
  84. EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_foo_bar_"));
  85. EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_foo__and_bar"));
  86. }
  87. TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameIsMixture) {
  88. EXPECT_EQ("foo bar 123", ConvertIdentifierNameToWords("Foo_bar123"));
  89. EXPECT_EQ("chapter 11 section 1",
  90. ConvertIdentifierNameToWords("_Chapter11Section_1_"));
  91. }
  92. TEST(PointeeOfTest, WorksForSmartPointers) {
  93. CompileAssertTypesEqual<const char,
  94. PointeeOf<internal::linked_ptr<const char> >::type>();
  95. #if GTEST_HAS_STD_UNIQUE_PTR_
  96. CompileAssertTypesEqual<int, PointeeOf<std::unique_ptr<int> >::type>();
  97. #endif // GTEST_HAS_STD_UNIQUE_PTR_
  98. #if GTEST_HAS_STD_SHARED_PTR_
  99. CompileAssertTypesEqual<std::string,
  100. PointeeOf<std::shared_ptr<std::string> >::type>();
  101. #endif // GTEST_HAS_STD_SHARED_PTR_
  102. }
  103. TEST(PointeeOfTest, WorksForRawPointers) {
  104. CompileAssertTypesEqual<int, PointeeOf<int*>::type>();
  105. CompileAssertTypesEqual<const char, PointeeOf<const char*>::type>();
  106. CompileAssertTypesEqual<void, PointeeOf<void*>::type>();
  107. }
  108. TEST(GetRawPointerTest, WorksForSmartPointers) {
  109. #if GTEST_HAS_STD_UNIQUE_PTR_
  110. const char* const raw_p1 = new const char('a'); // NOLINT
  111. const std::unique_ptr<const char> p1(raw_p1);
  112. EXPECT_EQ(raw_p1, GetRawPointer(p1));
  113. #endif // GTEST_HAS_STD_UNIQUE_PTR_
  114. #if GTEST_HAS_STD_SHARED_PTR_
  115. double* const raw_p2 = new double(2.5); // NOLINT
  116. const std::shared_ptr<double> p2(raw_p2);
  117. EXPECT_EQ(raw_p2, GetRawPointer(p2));
  118. #endif // GTEST_HAS_STD_SHARED_PTR_
  119. const char* const raw_p4 = new const char('a'); // NOLINT
  120. const internal::linked_ptr<const char> p4(raw_p4);
  121. EXPECT_EQ(raw_p4, GetRawPointer(p4));
  122. }
  123. TEST(GetRawPointerTest, WorksForRawPointers) {
  124. int* p = NULL;
  125. // Don't use EXPECT_EQ as no NULL-testing magic on Symbian.
  126. EXPECT_TRUE(NULL == GetRawPointer(p));
  127. int n = 1;
  128. EXPECT_EQ(&n, GetRawPointer(&n));
  129. }
  130. // Tests KindOf<T>.
  131. class Base {};
  132. class Derived : public Base {};
  133. TEST(KindOfTest, Bool) {
  134. EXPECT_EQ(kBool, GMOCK_KIND_OF_(bool)); // NOLINT
  135. }
  136. TEST(KindOfTest, Integer) {
  137. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(char)); // NOLINT
  138. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(signed char)); // NOLINT
  139. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned char)); // NOLINT
  140. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(short)); // NOLINT
  141. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned short)); // NOLINT
  142. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(int)); // NOLINT
  143. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned int)); // NOLINT
  144. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long)); // NOLINT
  145. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long)); // NOLINT
  146. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(wchar_t)); // NOLINT
  147. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(Int64)); // NOLINT
  148. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(UInt64)); // NOLINT
  149. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(size_t)); // NOLINT
  150. #if GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN
  151. // ssize_t is not defined on Windows and possibly some other OSes.
  152. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(ssize_t)); // NOLINT
  153. #endif
  154. }
  155. TEST(KindOfTest, FloatingPoint) {
  156. EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(float)); // NOLINT
  157. EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(double)); // NOLINT
  158. EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(long double)); // NOLINT
  159. }
  160. TEST(KindOfTest, Other) {
  161. EXPECT_EQ(kOther, GMOCK_KIND_OF_(void*)); // NOLINT
  162. EXPECT_EQ(kOther, GMOCK_KIND_OF_(char**)); // NOLINT
  163. EXPECT_EQ(kOther, GMOCK_KIND_OF_(Base)); // NOLINT
  164. }
  165. // Tests LosslessArithmeticConvertible<T, U>.
  166. TEST(LosslessArithmeticConvertibleTest, BoolToBool) {
  167. EXPECT_TRUE((LosslessArithmeticConvertible<bool, bool>::value));
  168. }
  169. TEST(LosslessArithmeticConvertibleTest, BoolToInteger) {
  170. EXPECT_TRUE((LosslessArithmeticConvertible<bool, char>::value));
  171. EXPECT_TRUE((LosslessArithmeticConvertible<bool, int>::value));
  172. EXPECT_TRUE(
  173. (LosslessArithmeticConvertible<bool, unsigned long>::value)); // NOLINT
  174. }
  175. TEST(LosslessArithmeticConvertibleTest, BoolToFloatingPoint) {
  176. EXPECT_TRUE((LosslessArithmeticConvertible<bool, float>::value));
  177. EXPECT_TRUE((LosslessArithmeticConvertible<bool, double>::value));
  178. }
  179. TEST(LosslessArithmeticConvertibleTest, IntegerToBool) {
  180. EXPECT_FALSE((LosslessArithmeticConvertible<unsigned char, bool>::value));
  181. EXPECT_FALSE((LosslessArithmeticConvertible<int, bool>::value));
  182. }
  183. TEST(LosslessArithmeticConvertibleTest, IntegerToInteger) {
  184. // Unsigned => larger signed is fine.
  185. EXPECT_TRUE((LosslessArithmeticConvertible<unsigned char, int>::value));
  186. // Unsigned => larger unsigned is fine.
  187. EXPECT_TRUE(
  188. (LosslessArithmeticConvertible<unsigned short, UInt64>::value)); // NOLINT
  189. // Signed => unsigned is not fine.
  190. EXPECT_FALSE((LosslessArithmeticConvertible<short, UInt64>::value)); // NOLINT
  191. EXPECT_FALSE((LosslessArithmeticConvertible<
  192. signed char, unsigned int>::value)); // NOLINT
  193. // Same size and same signedness: fine too.
  194. EXPECT_TRUE((LosslessArithmeticConvertible<
  195. unsigned char, unsigned char>::value));
  196. EXPECT_TRUE((LosslessArithmeticConvertible<int, int>::value));
  197. EXPECT_TRUE((LosslessArithmeticConvertible<wchar_t, wchar_t>::value));
  198. EXPECT_TRUE((LosslessArithmeticConvertible<
  199. unsigned long, unsigned long>::value)); // NOLINT
  200. // Same size, different signedness: not fine.
  201. EXPECT_FALSE((LosslessArithmeticConvertible<
  202. unsigned char, signed char>::value));
  203. EXPECT_FALSE((LosslessArithmeticConvertible<int, unsigned int>::value));
  204. EXPECT_FALSE((LosslessArithmeticConvertible<UInt64, Int64>::value));
  205. // Larger size => smaller size is not fine.
  206. EXPECT_FALSE((LosslessArithmeticConvertible<long, char>::value)); // NOLINT
  207. EXPECT_FALSE((LosslessArithmeticConvertible<int, signed char>::value));
  208. EXPECT_FALSE((LosslessArithmeticConvertible<Int64, unsigned int>::value));
  209. }
  210. TEST(LosslessArithmeticConvertibleTest, IntegerToFloatingPoint) {
  211. // Integers cannot be losslessly converted to floating-points, as
  212. // the format of the latter is implementation-defined.
  213. EXPECT_FALSE((LosslessArithmeticConvertible<char, float>::value));
  214. EXPECT_FALSE((LosslessArithmeticConvertible<int, double>::value));
  215. EXPECT_FALSE((LosslessArithmeticConvertible<
  216. short, long double>::value)); // NOLINT
  217. }
  218. TEST(LosslessArithmeticConvertibleTest, FloatingPointToBool) {
  219. EXPECT_FALSE((LosslessArithmeticConvertible<float, bool>::value));
  220. EXPECT_FALSE((LosslessArithmeticConvertible<double, bool>::value));
  221. }
  222. TEST(LosslessArithmeticConvertibleTest, FloatingPointToInteger) {
  223. EXPECT_FALSE((LosslessArithmeticConvertible<float, long>::value)); // NOLINT
  224. EXPECT_FALSE((LosslessArithmeticConvertible<double, Int64>::value));
  225. EXPECT_FALSE((LosslessArithmeticConvertible<long double, int>::value));
  226. }
  227. TEST(LosslessArithmeticConvertibleTest, FloatingPointToFloatingPoint) {
  228. // Smaller size => larger size is fine.
  229. EXPECT_TRUE((LosslessArithmeticConvertible<float, double>::value));
  230. EXPECT_TRUE((LosslessArithmeticConvertible<float, long double>::value));
  231. EXPECT_TRUE((LosslessArithmeticConvertible<double, long double>::value));
  232. // Same size: fine.
  233. EXPECT_TRUE((LosslessArithmeticConvertible<float, float>::value));
  234. EXPECT_TRUE((LosslessArithmeticConvertible<double, double>::value));
  235. // Larger size => smaller size is not fine.
  236. EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value));
  237. GTEST_INTENTIONAL_CONST_COND_PUSH_()
  238. if (sizeof(double) == sizeof(long double)) { // NOLINT
  239. GTEST_INTENTIONAL_CONST_COND_POP_()
  240. // In some implementations (e.g. MSVC), double and long double
  241. // have the same size.
  242. EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value));
  243. } else {
  244. EXPECT_FALSE((LosslessArithmeticConvertible<long double, double>::value));
  245. }
  246. }
  247. // Tests the TupleMatches() template function.
  248. TEST(TupleMatchesTest, WorksForSize0) {
  249. tuple<> matchers;
  250. tuple<> values;
  251. EXPECT_TRUE(TupleMatches(matchers, values));
  252. }
  253. TEST(TupleMatchesTest, WorksForSize1) {
  254. tuple<Matcher<int> > matchers(Eq(1));
  255. tuple<int> values1(1),
  256. values2(2);
  257. EXPECT_TRUE(TupleMatches(matchers, values1));
  258. EXPECT_FALSE(TupleMatches(matchers, values2));
  259. }
  260. TEST(TupleMatchesTest, WorksForSize2) {
  261. tuple<Matcher<int>, Matcher<char> > matchers(Eq(1), Eq('a'));
  262. tuple<int, char> values1(1, 'a'),
  263. values2(1, 'b'),
  264. values3(2, 'a'),
  265. values4(2, 'b');
  266. EXPECT_TRUE(TupleMatches(matchers, values1));
  267. EXPECT_FALSE(TupleMatches(matchers, values2));
  268. EXPECT_FALSE(TupleMatches(matchers, values3));
  269. EXPECT_FALSE(TupleMatches(matchers, values4));
  270. }
  271. TEST(TupleMatchesTest, WorksForSize5) {
  272. tuple<Matcher<int>, Matcher<char>, Matcher<bool>, Matcher<long>, // NOLINT
  273. Matcher<string> >
  274. matchers(Eq(1), Eq('a'), Eq(true), Eq(2L), Eq("hi"));
  275. tuple<int, char, bool, long, string> // NOLINT
  276. values1(1, 'a', true, 2L, "hi"),
  277. values2(1, 'a', true, 2L, "hello"),
  278. values3(2, 'a', true, 2L, "hi");
  279. EXPECT_TRUE(TupleMatches(matchers, values1));
  280. EXPECT_FALSE(TupleMatches(matchers, values2));
  281. EXPECT_FALSE(TupleMatches(matchers, values3));
  282. }
  283. // Tests that Assert(true, ...) succeeds.
  284. TEST(AssertTest, SucceedsOnTrue) {
  285. Assert(true, __FILE__, __LINE__, "This should succeed.");
  286. Assert(true, __FILE__, __LINE__); // This should succeed too.
  287. }
  288. // Tests that Assert(false, ...) generates a fatal failure.
  289. TEST(AssertTest, FailsFatallyOnFalse) {
  290. EXPECT_DEATH_IF_SUPPORTED({
  291. Assert(false, __FILE__, __LINE__, "This should fail.");
  292. }, "");
  293. EXPECT_DEATH_IF_SUPPORTED({
  294. Assert(false, __FILE__, __LINE__);
  295. }, "");
  296. }
  297. // Tests that Expect(true, ...) succeeds.
  298. TEST(ExpectTest, SucceedsOnTrue) {
  299. Expect(true, __FILE__, __LINE__, "This should succeed.");
  300. Expect(true, __FILE__, __LINE__); // This should succeed too.
  301. }
  302. // Tests that Expect(false, ...) generates a non-fatal failure.
  303. TEST(ExpectTest, FailsNonfatallyOnFalse) {
  304. EXPECT_NONFATAL_FAILURE({ // NOLINT
  305. Expect(false, __FILE__, __LINE__, "This should fail.");
  306. }, "This should fail");
  307. EXPECT_NONFATAL_FAILURE({ // NOLINT
  308. Expect(false, __FILE__, __LINE__);
  309. }, "Expectation failed");
  310. }
  311. // Tests LogIsVisible().
  312. class LogIsVisibleTest : public ::testing::Test {
  313. protected:
  314. virtual void SetUp() {
  315. original_verbose_ = GMOCK_FLAG(verbose);
  316. }
  317. virtual void TearDown() { GMOCK_FLAG(verbose) = original_verbose_; }
  318. string original_verbose_;
  319. };
  320. TEST_F(LogIsVisibleTest, AlwaysReturnsTrueIfVerbosityIsInfo) {
  321. GMOCK_FLAG(verbose) = kInfoVerbosity;
  322. EXPECT_TRUE(LogIsVisible(kInfo));
  323. EXPECT_TRUE(LogIsVisible(kWarning));
  324. }
  325. TEST_F(LogIsVisibleTest, AlwaysReturnsFalseIfVerbosityIsError) {
  326. GMOCK_FLAG(verbose) = kErrorVerbosity;
  327. EXPECT_FALSE(LogIsVisible(kInfo));
  328. EXPECT_FALSE(LogIsVisible(kWarning));
  329. }
  330. TEST_F(LogIsVisibleTest, WorksWhenVerbosityIsWarning) {
  331. GMOCK_FLAG(verbose) = kWarningVerbosity;
  332. EXPECT_FALSE(LogIsVisible(kInfo));
  333. EXPECT_TRUE(LogIsVisible(kWarning));
  334. }
  335. #if GTEST_HAS_STREAM_REDIRECTION
  336. // Tests the Log() function.
  337. // Verifies that Log() behaves correctly for the given verbosity level
  338. // and log severity.
  339. void TestLogWithSeverity(const string& verbosity, LogSeverity severity,
  340. bool should_print) {
  341. const string old_flag = GMOCK_FLAG(verbose);
  342. GMOCK_FLAG(verbose) = verbosity;
  343. CaptureStdout();
  344. Log(severity, "Test log.\n", 0);
  345. if (should_print) {
  346. EXPECT_THAT(GetCapturedStdout().c_str(),
  347. ContainsRegex(
  348. severity == kWarning ?
  349. "^\nGMOCK WARNING:\nTest log\\.\nStack trace:\n" :
  350. "^\nTest log\\.\nStack trace:\n"));
  351. } else {
  352. EXPECT_STREQ("", GetCapturedStdout().c_str());
  353. }
  354. GMOCK_FLAG(verbose) = old_flag;
  355. }
  356. // Tests that when the stack_frames_to_skip parameter is negative,
  357. // Log() doesn't include the stack trace in the output.
  358. TEST(LogTest, NoStackTraceWhenStackFramesToSkipIsNegative) {
  359. const string saved_flag = GMOCK_FLAG(verbose);
  360. GMOCK_FLAG(verbose) = kInfoVerbosity;
  361. CaptureStdout();
  362. Log(kInfo, "Test log.\n", -1);
  363. EXPECT_STREQ("\nTest log.\n", GetCapturedStdout().c_str());
  364. GMOCK_FLAG(verbose) = saved_flag;
  365. }
  366. struct MockStackTraceGetter : testing::internal::OsStackTraceGetterInterface {
  367. virtual string CurrentStackTrace(int max_depth, int skip_count) {
  368. return (testing::Message() << max_depth << "::" << skip_count << "\n")
  369. .GetString();
  370. }
  371. virtual void UponLeavingGTest() {}
  372. };
  373. // Tests that in opt mode, a positive stack_frames_to_skip argument is
  374. // treated as 0.
  375. TEST(LogTest, NoSkippingStackFrameInOptMode) {
  376. MockStackTraceGetter* mock_os_stack_trace_getter = new MockStackTraceGetter;
  377. GetUnitTestImpl()->set_os_stack_trace_getter(mock_os_stack_trace_getter);
  378. CaptureStdout();
  379. Log(kWarning, "Test log.\n", 100);
  380. const string log = GetCapturedStdout();
  381. string expected_trace =
  382. (testing::Message() << GTEST_FLAG(stack_trace_depth) << "::").GetString();
  383. string expected_message =
  384. "\nGMOCK WARNING:\n"
  385. "Test log.\n"
  386. "Stack trace:\n" +
  387. expected_trace;
  388. EXPECT_THAT(log, HasSubstr(expected_message));
  389. int skip_count = atoi(log.substr(expected_message.size()).c_str());
  390. # if defined(NDEBUG)
  391. // In opt mode, no stack frame should be skipped.
  392. const int expected_skip_count = 0;
  393. # else
  394. // In dbg mode, the stack frames should be skipped.
  395. const int expected_skip_count = 100;
  396. # endif
  397. // Note that each inner implementation layer will +1 the number to remove
  398. // itself from the trace. This means that the value is a little higher than
  399. // expected, but close enough.
  400. EXPECT_THAT(skip_count,
  401. AllOf(Ge(expected_skip_count), Le(expected_skip_count + 10)));
  402. // Restores the default OS stack trace getter.
  403. GetUnitTestImpl()->set_os_stack_trace_getter(NULL);
  404. }
  405. // Tests that all logs are printed when the value of the
  406. // --gmock_verbose flag is "info".
  407. TEST(LogTest, AllLogsArePrintedWhenVerbosityIsInfo) {
  408. TestLogWithSeverity(kInfoVerbosity, kInfo, true);
  409. TestLogWithSeverity(kInfoVerbosity, kWarning, true);
  410. }
  411. // Tests that only warnings are printed when the value of the
  412. // --gmock_verbose flag is "warning".
  413. TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsWarning) {
  414. TestLogWithSeverity(kWarningVerbosity, kInfo, false);
  415. TestLogWithSeverity(kWarningVerbosity, kWarning, true);
  416. }
  417. // Tests that no logs are printed when the value of the
  418. // --gmock_verbose flag is "error".
  419. TEST(LogTest, NoLogsArePrintedWhenVerbosityIsError) {
  420. TestLogWithSeverity(kErrorVerbosity, kInfo, false);
  421. TestLogWithSeverity(kErrorVerbosity, kWarning, false);
  422. }
  423. // Tests that only warnings are printed when the value of the
  424. // --gmock_verbose flag is invalid.
  425. TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsInvalid) {
  426. TestLogWithSeverity("invalid", kInfo, false);
  427. TestLogWithSeverity("invalid", kWarning, true);
  428. }
  429. #endif // GTEST_HAS_STREAM_REDIRECTION
  430. TEST(TypeTraitsTest, true_type) {
  431. EXPECT_TRUE(true_type::value);
  432. }
  433. TEST(TypeTraitsTest, false_type) {
  434. EXPECT_FALSE(false_type::value);
  435. }
  436. TEST(TypeTraitsTest, is_reference) {
  437. EXPECT_FALSE(is_reference<int>::value);
  438. EXPECT_FALSE(is_reference<char*>::value);
  439. EXPECT_TRUE(is_reference<const int&>::value);
  440. }
  441. TEST(TypeTraitsTest, is_pointer) {
  442. EXPECT_FALSE(is_pointer<int>::value);
  443. EXPECT_FALSE(is_pointer<char&>::value);
  444. EXPECT_TRUE(is_pointer<const int*>::value);
  445. }
  446. TEST(TypeTraitsTest, type_equals) {
  447. EXPECT_FALSE((type_equals<int, const int>::value));
  448. EXPECT_FALSE((type_equals<int, int&>::value));
  449. EXPECT_FALSE((type_equals<int, double>::value));
  450. EXPECT_TRUE((type_equals<char, char>::value));
  451. }
  452. TEST(TypeTraitsTest, remove_reference) {
  453. EXPECT_TRUE((type_equals<char, remove_reference<char&>::type>::value));
  454. EXPECT_TRUE((type_equals<const int,
  455. remove_reference<const int&>::type>::value));
  456. EXPECT_TRUE((type_equals<int, remove_reference<int>::type>::value));
  457. EXPECT_TRUE((type_equals<double*, remove_reference<double*>::type>::value));
  458. }
  459. #if GTEST_HAS_STREAM_REDIRECTION
  460. // Verifies that Log() behaves correctly for the given verbosity level
  461. // and log severity.
  462. std::string GrabOutput(void(*logger)(), const char* verbosity) {
  463. const string saved_flag = GMOCK_FLAG(verbose);
  464. GMOCK_FLAG(verbose) = verbosity;
  465. CaptureStdout();
  466. logger();
  467. GMOCK_FLAG(verbose) = saved_flag;
  468. return GetCapturedStdout();
  469. }
  470. class DummyMock {
  471. public:
  472. MOCK_METHOD0(TestMethod, void());
  473. MOCK_METHOD1(TestMethodArg, void(int dummy));
  474. };
  475. void ExpectCallLogger() {
  476. DummyMock mock;
  477. EXPECT_CALL(mock, TestMethod());
  478. mock.TestMethod();
  479. };
  480. // Verifies that EXPECT_CALL logs if the --gmock_verbose flag is set to "info".
  481. TEST(ExpectCallTest, LogsWhenVerbosityIsInfo) {
  482. EXPECT_THAT(std::string(GrabOutput(ExpectCallLogger, kInfoVerbosity)),
  483. HasSubstr("EXPECT_CALL(mock, TestMethod())"));
  484. }
  485. // Verifies that EXPECT_CALL doesn't log
  486. // if the --gmock_verbose flag is set to "warning".
  487. TEST(ExpectCallTest, DoesNotLogWhenVerbosityIsWarning) {
  488. EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kWarningVerbosity).c_str());
  489. }
  490. // Verifies that EXPECT_CALL doesn't log
  491. // if the --gmock_verbose flag is set to "error".
  492. TEST(ExpectCallTest, DoesNotLogWhenVerbosityIsError) {
  493. EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kErrorVerbosity).c_str());
  494. }
  495. void OnCallLogger() {
  496. DummyMock mock;
  497. ON_CALL(mock, TestMethod());
  498. };
  499. // Verifies that ON_CALL logs if the --gmock_verbose flag is set to "info".
  500. TEST(OnCallTest, LogsWhenVerbosityIsInfo) {
  501. EXPECT_THAT(std::string(GrabOutput(OnCallLogger, kInfoVerbosity)),
  502. HasSubstr("ON_CALL(mock, TestMethod())"));
  503. }
  504. // Verifies that ON_CALL doesn't log
  505. // if the --gmock_verbose flag is set to "warning".
  506. TEST(OnCallTest, DoesNotLogWhenVerbosityIsWarning) {
  507. EXPECT_STREQ("", GrabOutput(OnCallLogger, kWarningVerbosity).c_str());
  508. }
  509. // Verifies that ON_CALL doesn't log if
  510. // the --gmock_verbose flag is set to "error".
  511. TEST(OnCallTest, DoesNotLogWhenVerbosityIsError) {
  512. EXPECT_STREQ("", GrabOutput(OnCallLogger, kErrorVerbosity).c_str());
  513. }
  514. void OnCallAnyArgumentLogger() {
  515. DummyMock mock;
  516. ON_CALL(mock, TestMethodArg(_));
  517. }
  518. // Verifies that ON_CALL prints provided _ argument.
  519. TEST(OnCallTest, LogsAnythingArgument) {
  520. EXPECT_THAT(std::string(GrabOutput(OnCallAnyArgumentLogger, kInfoVerbosity)),
  521. HasSubstr("ON_CALL(mock, TestMethodArg(_)"));
  522. }
  523. #endif // GTEST_HAS_STREAM_REDIRECTION
  524. // Tests StlContainerView.
  525. TEST(StlContainerViewTest, WorksForStlContainer) {
  526. StaticAssertTypeEq<std::vector<int>,
  527. StlContainerView<std::vector<int> >::type>();
  528. StaticAssertTypeEq<const std::vector<double>&,
  529. StlContainerView<std::vector<double> >::const_reference>();
  530. typedef std::vector<char> Chars;
  531. Chars v1;
  532. const Chars& v2(StlContainerView<Chars>::ConstReference(v1));
  533. EXPECT_EQ(&v1, &v2);
  534. v1.push_back('a');
  535. Chars v3 = StlContainerView<Chars>::Copy(v1);
  536. EXPECT_THAT(v3, Eq(v3));
  537. }
  538. TEST(StlContainerViewTest, WorksForStaticNativeArray) {
  539. StaticAssertTypeEq<NativeArray<int>,
  540. StlContainerView<int[3]>::type>();
  541. StaticAssertTypeEq<NativeArray<double>,
  542. StlContainerView<const double[4]>::type>();
  543. StaticAssertTypeEq<NativeArray<char[3]>,
  544. StlContainerView<const char[2][3]>::type>();
  545. StaticAssertTypeEq<const NativeArray<int>,
  546. StlContainerView<int[2]>::const_reference>();
  547. int a1[3] = { 0, 1, 2 };
  548. NativeArray<int> a2 = StlContainerView<int[3]>::ConstReference(a1);
  549. EXPECT_EQ(3U, a2.size());
  550. EXPECT_EQ(a1, a2.begin());
  551. const NativeArray<int> a3 = StlContainerView<int[3]>::Copy(a1);
  552. ASSERT_EQ(3U, a3.size());
  553. EXPECT_EQ(0, a3.begin()[0]);
  554. EXPECT_EQ(1, a3.begin()[1]);
  555. EXPECT_EQ(2, a3.begin()[2]);
  556. // Makes sure a1 and a3 aren't aliases.
  557. a1[0] = 3;
  558. EXPECT_EQ(0, a3.begin()[0]);
  559. }
  560. TEST(StlContainerViewTest, WorksForDynamicNativeArray) {
  561. StaticAssertTypeEq<NativeArray<int>,
  562. StlContainerView<tuple<const int*, size_t> >::type>();
  563. StaticAssertTypeEq<NativeArray<double>,
  564. StlContainerView<tuple<linked_ptr<double>, int> >::type>();
  565. StaticAssertTypeEq<const NativeArray<int>,
  566. StlContainerView<tuple<const int*, int> >::const_reference>();
  567. int a1[3] = { 0, 1, 2 };
  568. const int* const p1 = a1;
  569. NativeArray<int> a2 = StlContainerView<tuple<const int*, int> >::
  570. ConstReference(make_tuple(p1, 3));
  571. EXPECT_EQ(3U, a2.size());
  572. EXPECT_EQ(a1, a2.begin());
  573. const NativeArray<int> a3 = StlContainerView<tuple<int*, size_t> >::
  574. Copy(make_tuple(static_cast<int*>(a1), 3));
  575. ASSERT_EQ(3U, a3.size());
  576. EXPECT_EQ(0, a3.begin()[0]);
  577. EXPECT_EQ(1, a3.begin()[1]);
  578. EXPECT_EQ(2, a3.begin()[2]);
  579. // Makes sure a1 and a3 aren't aliases.
  580. a1[0] = 3;
  581. EXPECT_EQ(0, a3.begin()[0]);
  582. }
  583. } // namespace
  584. } // namespace internal
  585. } // namespace testing