diff options
Diffstat (limited to 'googletest/test/gtest_unittest.cc')
| -rw-r--r-- | googletest/test/gtest_unittest.cc | 7795 | 
1 files changed, 7795 insertions, 0 deletions
| diff --git a/googletest/test/gtest_unittest.cc b/googletest/test/gtest_unittest.cc new file mode 100644 index 0000000000000..f7213fbf3e5e8 --- /dev/null +++ b/googletest/test/gtest_unittest.cc @@ -0,0 +1,7795 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +//     * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +//     * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +//     * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// Tests for Google Test itself.  This verifies that the basic constructs of +// Google Test work. + +#include "gtest/gtest.h" + +// Verifies that the command line flag variables can be accessed in +// code once "gtest.h" has been #included. +// Do not move it after other gtest #includes. +TEST(CommandLineFlagsTest, CanBeAccessedInCodeOnceGTestHIsIncluded) { +  bool dummy = testing::GTEST_FLAG(also_run_disabled_tests) +      || testing::GTEST_FLAG(break_on_failure) +      || testing::GTEST_FLAG(catch_exceptions) +      || testing::GTEST_FLAG(color) != "unknown" +      || testing::GTEST_FLAG(filter) != "unknown" +      || testing::GTEST_FLAG(list_tests) +      || testing::GTEST_FLAG(output) != "unknown" +      || testing::GTEST_FLAG(print_time) +      || testing::GTEST_FLAG(random_seed) +      || testing::GTEST_FLAG(repeat) > 0 +      || testing::GTEST_FLAG(show_internal_stack_frames) +      || testing::GTEST_FLAG(shuffle) +      || testing::GTEST_FLAG(stack_trace_depth) > 0 +      || testing::GTEST_FLAG(stream_result_to) != "unknown" +      || testing::GTEST_FLAG(throw_on_failure); +  EXPECT_TRUE(dummy || !dummy);  // Suppresses warning that dummy is unused. +} + +#include <limits.h>  // For INT_MAX. +#include <stdlib.h> +#include <string.h> +#include <time.h> + +#include <map> +#include <vector> +#include <ostream> +#if GTEST_LANG_CXX11 +#include <unordered_set> +#endif  // GTEST_LANG_CXX11 + +#include "gtest/gtest-spi.h" +#include "src/gtest-internal-inl.h" + +namespace testing { +namespace internal { + +#if GTEST_CAN_STREAM_RESULTS_ + +class StreamingListenerTest : public Test { + public: +  class FakeSocketWriter : public StreamingListener::AbstractSocketWriter { +   public: +    // Sends a string to the socket. +    virtual void Send(const std::string& message) { output_ += message; } + +    std::string output_; +  }; + +  StreamingListenerTest() +      : fake_sock_writer_(new FakeSocketWriter), +        streamer_(fake_sock_writer_), +        test_info_obj_("FooTest", "Bar", NULL, NULL, +                       CodeLocation(__FILE__, __LINE__), 0, NULL) {} + + protected: +  std::string* output() { return &(fake_sock_writer_->output_); } + +  FakeSocketWriter* const fake_sock_writer_; +  StreamingListener streamer_; +  UnitTest unit_test_; +  TestInfo test_info_obj_;  // The name test_info_ was taken by testing::Test. +}; + +TEST_F(StreamingListenerTest, OnTestProgramEnd) { +  *output() = ""; +  streamer_.OnTestProgramEnd(unit_test_); +  EXPECT_EQ("event=TestProgramEnd&passed=1\n", *output()); +} + +TEST_F(StreamingListenerTest, OnTestIterationEnd) { +  *output() = ""; +  streamer_.OnTestIterationEnd(unit_test_, 42); +  EXPECT_EQ("event=TestIterationEnd&passed=1&elapsed_time=0ms\n", *output()); +} + +TEST_F(StreamingListenerTest, OnTestCaseStart) { +  *output() = ""; +  streamer_.OnTestCaseStart(TestCase("FooTest", "Bar", NULL, NULL)); +  EXPECT_EQ("event=TestCaseStart&name=FooTest\n", *output()); +} + +TEST_F(StreamingListenerTest, OnTestCaseEnd) { +  *output() = ""; +  streamer_.OnTestCaseEnd(TestCase("FooTest", "Bar", NULL, NULL)); +  EXPECT_EQ("event=TestCaseEnd&passed=1&elapsed_time=0ms\n", *output()); +} + +TEST_F(StreamingListenerTest, OnTestStart) { +  *output() = ""; +  streamer_.OnTestStart(test_info_obj_); +  EXPECT_EQ("event=TestStart&name=Bar\n", *output()); +} + +TEST_F(StreamingListenerTest, OnTestEnd) { +  *output() = ""; +  streamer_.OnTestEnd(test_info_obj_); +  EXPECT_EQ("event=TestEnd&passed=1&elapsed_time=0ms\n", *output()); +} + +TEST_F(StreamingListenerTest, OnTestPartResult) { +  *output() = ""; +  streamer_.OnTestPartResult(TestPartResult( +      TestPartResult::kFatalFailure, "foo.cc", 42, "failed=\n&%")); + +  // Meta characters in the failure message should be properly escaped. +  EXPECT_EQ( +      "event=TestPartResult&file=foo.cc&line=42&message=failed%3D%0A%26%25\n", +      *output()); +} + +#endif  // GTEST_CAN_STREAM_RESULTS_ + +// Provides access to otherwise private parts of the TestEventListeners class +// that are needed to test it. +class TestEventListenersAccessor { + public: +  static TestEventListener* GetRepeater(TestEventListeners* listeners) { +    return listeners->repeater(); +  } + +  static void SetDefaultResultPrinter(TestEventListeners* listeners, +                                      TestEventListener* listener) { +    listeners->SetDefaultResultPrinter(listener); +  } +  static void SetDefaultXmlGenerator(TestEventListeners* listeners, +                                     TestEventListener* listener) { +    listeners->SetDefaultXmlGenerator(listener); +  } + +  static bool EventForwardingEnabled(const TestEventListeners& listeners) { +    return listeners.EventForwardingEnabled(); +  } + +  static void SuppressEventForwarding(TestEventListeners* listeners) { +    listeners->SuppressEventForwarding(); +  } +}; + +class UnitTestRecordPropertyTestHelper : public Test { + protected: +  UnitTestRecordPropertyTestHelper() {} + +  // Forwards to UnitTest::RecordProperty() to bypass access controls. +  void UnitTestRecordProperty(const char* key, const std::string& value) { +    unit_test_.RecordProperty(key, value); +  } + +  UnitTest unit_test_; +}; + +}  // namespace internal +}  // namespace testing + +using testing::AssertionFailure; +using testing::AssertionResult; +using testing::AssertionSuccess; +using testing::DoubleLE; +using testing::EmptyTestEventListener; +using testing::Environment; +using testing::FloatLE; +using testing::GTEST_FLAG(also_run_disabled_tests); +using testing::GTEST_FLAG(break_on_failure); +using testing::GTEST_FLAG(catch_exceptions); +using testing::GTEST_FLAG(color); +using testing::GTEST_FLAG(death_test_use_fork); +using testing::GTEST_FLAG(filter); +using testing::GTEST_FLAG(list_tests); +using testing::GTEST_FLAG(output); +using testing::GTEST_FLAG(print_time); +using testing::GTEST_FLAG(random_seed); +using testing::GTEST_FLAG(repeat); +using testing::GTEST_FLAG(show_internal_stack_frames); +using testing::GTEST_FLAG(shuffle); +using testing::GTEST_FLAG(stack_trace_depth); +using testing::GTEST_FLAG(stream_result_to); +using testing::GTEST_FLAG(throw_on_failure); +using testing::IsNotSubstring; +using testing::IsSubstring; +using testing::Message; +using testing::ScopedFakeTestPartResultReporter; +using testing::StaticAssertTypeEq; +using testing::Test; +using testing::TestCase; +using testing::TestEventListeners; +using testing::TestInfo; +using testing::TestPartResult; +using testing::TestPartResultArray; +using testing::TestProperty; +using testing::TestResult; +using testing::TimeInMillis; +using testing::UnitTest; +using testing::internal::AddReference; +using testing::internal::AlwaysFalse; +using testing::internal::AlwaysTrue; +using testing::internal::AppendUserMessage; +using testing::internal::ArrayAwareFind; +using testing::internal::ArrayEq; +using testing::internal::CodePointToUtf8; +using testing::internal::CompileAssertTypesEqual; +using testing::internal::CopyArray; +using testing::internal::CountIf; +using testing::internal::EqFailure; +using testing::internal::FloatingPoint; +using testing::internal::ForEach; +using testing::internal::FormatEpochTimeInMillisAsIso8601; +using testing::internal::FormatTimeInMillisAsSeconds; +using testing::internal::GTestFlagSaver; +using testing::internal::GetCurrentOsStackTraceExceptTop; +using testing::internal::GetElementOr; +using testing::internal::GetNextRandomSeed; +using testing::internal::GetRandomSeedFromFlag; +using testing::internal::GetTestTypeId; +using testing::internal::GetTimeInMillis; +using testing::internal::GetTypeId; +using testing::internal::GetUnitTestImpl; +using testing::internal::ImplicitlyConvertible; +using testing::internal::Int32; +using testing::internal::Int32FromEnvOrDie; +using testing::internal::IsAProtocolMessage; +using testing::internal::IsContainer; +using testing::internal::IsContainerTest; +using testing::internal::IsNotContainer; +using testing::internal::NativeArray; +using testing::internal::OsStackTraceGetter; +using testing::internal::OsStackTraceGetterInterface; +using testing::internal::ParseInt32Flag; +using testing::internal::RelationToSourceCopy; +using testing::internal::RelationToSourceReference; +using testing::internal::RemoveConst; +using testing::internal::RemoveReference; +using testing::internal::ShouldRunTestOnShard; +using testing::internal::ShouldShard; +using testing::internal::ShouldUseColor; +using testing::internal::Shuffle; +using testing::internal::ShuffleRange; +using testing::internal::SkipPrefix; +using testing::internal::StreamableToString; +using testing::internal::String; +using testing::internal::TestEventListenersAccessor; +using testing::internal::TestResultAccessor; +using testing::internal::UInt32; +using testing::internal::UnitTestImpl; +using testing::internal::WideStringToUtf8; +using testing::internal::edit_distance::CalculateOptimalEdits; +using testing::internal::edit_distance::CreateUnifiedDiff; +using testing::internal::edit_distance::EditType; +using testing::internal::kMaxRandomSeed; +using testing::internal::kTestTypeIdInGoogleTest; +using testing::kMaxStackTraceDepth; + +#if GTEST_HAS_STREAM_REDIRECTION +using testing::internal::CaptureStdout; +using testing::internal::GetCapturedStdout; +#endif + +#if GTEST_IS_THREADSAFE +using testing::internal::ThreadWithParam; +#endif + +class TestingVector : public std::vector<int> { +}; + +::std::ostream& operator<<(::std::ostream& os, +                           const TestingVector& vector) { +  os << "{ "; +  for (size_t i = 0; i < vector.size(); i++) { +    os << vector[i] << " "; +  } +  os << "}"; +  return os; +} + +// This line tests that we can define tests in an unnamed namespace. +namespace { + +TEST(GetRandomSeedFromFlagTest, HandlesZero) { +  const int seed = GetRandomSeedFromFlag(0); +  EXPECT_LE(1, seed); +  EXPECT_LE(seed, static_cast<int>(kMaxRandomSeed)); +} + +TEST(GetRandomSeedFromFlagTest, PreservesValidSeed) { +  EXPECT_EQ(1, GetRandomSeedFromFlag(1)); +  EXPECT_EQ(2, GetRandomSeedFromFlag(2)); +  EXPECT_EQ(kMaxRandomSeed - 1, GetRandomSeedFromFlag(kMaxRandomSeed - 1)); +  EXPECT_EQ(static_cast<int>(kMaxRandomSeed), +            GetRandomSeedFromFlag(kMaxRandomSeed)); +} + +TEST(GetRandomSeedFromFlagTest, NormalizesInvalidSeed) { +  const int seed1 = GetRandomSeedFromFlag(-1); +  EXPECT_LE(1, seed1); +  EXPECT_LE(seed1, static_cast<int>(kMaxRandomSeed)); + +  const int seed2 = GetRandomSeedFromFlag(kMaxRandomSeed + 1); +  EXPECT_LE(1, seed2); +  EXPECT_LE(seed2, static_cast<int>(kMaxRandomSeed)); +} + +TEST(GetNextRandomSeedTest, WorksForValidInput) { +  EXPECT_EQ(2, GetNextRandomSeed(1)); +  EXPECT_EQ(3, GetNextRandomSeed(2)); +  EXPECT_EQ(static_cast<int>(kMaxRandomSeed), +            GetNextRandomSeed(kMaxRandomSeed - 1)); +  EXPECT_EQ(1, GetNextRandomSeed(kMaxRandomSeed)); + +  // We deliberately don't test GetNextRandomSeed() with invalid +  // inputs, as that requires death tests, which are expensive.  This +  // is fine as GetNextRandomSeed() is internal and has a +  // straightforward definition. +} + +static void ClearCurrentTestPartResults() { +  TestResultAccessor::ClearTestPartResults( +      GetUnitTestImpl()->current_test_result()); +} + +// Tests GetTypeId. + +TEST(GetTypeIdTest, ReturnsSameValueForSameType) { +  EXPECT_EQ(GetTypeId<int>(), GetTypeId<int>()); +  EXPECT_EQ(GetTypeId<Test>(), GetTypeId<Test>()); +} + +class SubClassOfTest : public Test {}; +class AnotherSubClassOfTest : public Test {}; + +TEST(GetTypeIdTest, ReturnsDifferentValuesForDifferentTypes) { +  EXPECT_NE(GetTypeId<int>(), GetTypeId<const int>()); +  EXPECT_NE(GetTypeId<int>(), GetTypeId<char>()); +  EXPECT_NE(GetTypeId<int>(), GetTestTypeId()); +  EXPECT_NE(GetTypeId<SubClassOfTest>(), GetTestTypeId()); +  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTestTypeId()); +  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTypeId<SubClassOfTest>()); +} + +// Verifies that GetTestTypeId() returns the same value, no matter it +// is called from inside Google Test or outside of it. +TEST(GetTestTypeIdTest, ReturnsTheSameValueInsideOrOutsideOfGoogleTest) { +  EXPECT_EQ(kTestTypeIdInGoogleTest, GetTestTypeId()); +} + +// Tests CanonicalizeForStdLibVersioning. + +using ::testing::internal::CanonicalizeForStdLibVersioning; + +TEST(CanonicalizeForStdLibVersioning, LeavesUnversionedNamesUnchanged) { +  EXPECT_EQ("std::bind", CanonicalizeForStdLibVersioning("std::bind")); +  EXPECT_EQ("std::_", CanonicalizeForStdLibVersioning("std::_")); +  EXPECT_EQ("std::__foo", CanonicalizeForStdLibVersioning("std::__foo")); +  EXPECT_EQ("gtl::__1::x", CanonicalizeForStdLibVersioning("gtl::__1::x")); +  EXPECT_EQ("__1::x", CanonicalizeForStdLibVersioning("__1::x")); +  EXPECT_EQ("::__1::x", CanonicalizeForStdLibVersioning("::__1::x")); +} + +TEST(CanonicalizeForStdLibVersioning, ElidesDoubleUnderNames) { +  EXPECT_EQ("std::bind", CanonicalizeForStdLibVersioning("std::__1::bind")); +  EXPECT_EQ("std::_", CanonicalizeForStdLibVersioning("std::__1::_")); + +  EXPECT_EQ("std::bind", CanonicalizeForStdLibVersioning("std::__g::bind")); +  EXPECT_EQ("std::_", CanonicalizeForStdLibVersioning("std::__g::_")); + +  EXPECT_EQ("std::bind", +            CanonicalizeForStdLibVersioning("std::__google::bind")); +  EXPECT_EQ("std::_", CanonicalizeForStdLibVersioning("std::__google::_")); +} + +// Tests FormatTimeInMillisAsSeconds(). + +TEST(FormatTimeInMillisAsSecondsTest, FormatsZero) { +  EXPECT_EQ("0", FormatTimeInMillisAsSeconds(0)); +} + +TEST(FormatTimeInMillisAsSecondsTest, FormatsPositiveNumber) { +  EXPECT_EQ("0.003", FormatTimeInMillisAsSeconds(3)); +  EXPECT_EQ("0.01", FormatTimeInMillisAsSeconds(10)); +  EXPECT_EQ("0.2", FormatTimeInMillisAsSeconds(200)); +  EXPECT_EQ("1.2", FormatTimeInMillisAsSeconds(1200)); +  EXPECT_EQ("3", FormatTimeInMillisAsSeconds(3000)); +} + +TEST(FormatTimeInMillisAsSecondsTest, FormatsNegativeNumber) { +  EXPECT_EQ("-0.003", FormatTimeInMillisAsSeconds(-3)); +  EXPECT_EQ("-0.01", FormatTimeInMillisAsSeconds(-10)); +  EXPECT_EQ("-0.2", FormatTimeInMillisAsSeconds(-200)); +  EXPECT_EQ("-1.2", FormatTimeInMillisAsSeconds(-1200)); +  EXPECT_EQ("-3", FormatTimeInMillisAsSeconds(-3000)); +} + +// Tests FormatEpochTimeInMillisAsIso8601().  The correctness of conversion +// for particular dates below was verified in Python using +// datetime.datetime.fromutctimestamp(<timetamp>/1000). + +// FormatEpochTimeInMillisAsIso8601 depends on the current timezone, so we +// have to set up a particular timezone to obtain predictable results. +class FormatEpochTimeInMillisAsIso8601Test : public Test { + public: +  // On Cygwin, GCC doesn't allow unqualified integer literals to exceed +  // 32 bits, even when 64-bit integer types are available.  We have to +  // force the constants to have a 64-bit type here. +  static const TimeInMillis kMillisPerSec = 1000; + + private: +  virtual void SetUp() { +    saved_tz_ = NULL; + +    GTEST_DISABLE_MSC_DEPRECATED_PUSH_(/* getenv, strdup: deprecated */) +    if (getenv("TZ")) +      saved_tz_ = strdup(getenv("TZ")); +    GTEST_DISABLE_MSC_DEPRECATED_POP_() + +    // Set up the time zone for FormatEpochTimeInMillisAsIso8601 to use.  We +    // cannot use the local time zone because the function's output depends +    // on the time zone. +    SetTimeZone("UTC+00"); +  } + +  virtual void TearDown() { +    SetTimeZone(saved_tz_); +    free(const_cast<char*>(saved_tz_)); +    saved_tz_ = NULL; +  } + +  static void SetTimeZone(const char* time_zone) { +    // tzset() distinguishes between the TZ variable being present and empty +    // and not being present, so we have to consider the case of time_zone +    // being NULL. +#if _MSC_VER || GTEST_OS_WINDOWS_MINGW +    // ...Unless it's MSVC, whose standard library's _putenv doesn't +    // distinguish between an empty and a missing variable. +    const std::string env_var = +        std::string("TZ=") + (time_zone ? time_zone : ""); +    _putenv(env_var.c_str()); +    GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996 /* deprecated function */) +    tzset(); +    GTEST_DISABLE_MSC_WARNINGS_POP_() +#else +    if (time_zone) { +      setenv(("TZ"), time_zone, 1); +    } else { +      unsetenv("TZ"); +    } +    tzset(); +#endif +  } + +  const char* saved_tz_; +}; + +const TimeInMillis FormatEpochTimeInMillisAsIso8601Test::kMillisPerSec; + +TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsTwoDigitSegments) { +  EXPECT_EQ("2011-10-31T18:52:42", +            FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec)); +} + +TEST_F(FormatEpochTimeInMillisAsIso8601Test, MillisecondsDoNotAffectResult) { +  EXPECT_EQ( +      "2011-10-31T18:52:42", +      FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec + 234)); +} + +TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsLeadingZeroes) { +  EXPECT_EQ("2011-09-03T05:07:02", +            FormatEpochTimeInMillisAsIso8601(1315026422 * kMillisPerSec)); +} + +TEST_F(FormatEpochTimeInMillisAsIso8601Test, Prints24HourTime) { +  EXPECT_EQ("2011-09-28T17:08:22", +            FormatEpochTimeInMillisAsIso8601(1317229702 * kMillisPerSec)); +} + +TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsEpochStart) { +  EXPECT_EQ("1970-01-01T00:00:00", FormatEpochTimeInMillisAsIso8601(0)); +} + +#if GTEST_CAN_COMPARE_NULL + +# ifdef __BORLANDC__ +// Silences warnings: "Condition is always true", "Unreachable code" +#  pragma option push -w-ccc -w-rch +# endif + +// Tests that GTEST_IS_NULL_LITERAL_(x) is true when x is a null +// pointer literal. +TEST(NullLiteralTest, IsTrueForNullLiterals) { +  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(NULL)); +  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0)); +  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0U)); +  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0L)); +} + +// Tests that GTEST_IS_NULL_LITERAL_(x) is false when x is not a null +// pointer literal. +TEST(NullLiteralTest, IsFalseForNonNullLiterals) { +  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(1)); +  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(0.0)); +  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_('a')); +  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(static_cast<void*>(NULL))); +} + +# ifdef __BORLANDC__ +// Restores warnings after previous "#pragma option push" suppressed them. +#  pragma option pop +# endif + +#endif  // GTEST_CAN_COMPARE_NULL +// +// Tests CodePointToUtf8(). + +// Tests that the NUL character L'\0' is encoded correctly. +TEST(CodePointToUtf8Test, CanEncodeNul) { +  EXPECT_EQ("", CodePointToUtf8(L'\0')); +} + +// Tests that ASCII characters are encoded correctly. +TEST(CodePointToUtf8Test, CanEncodeAscii) { +  EXPECT_EQ("a", CodePointToUtf8(L'a')); +  EXPECT_EQ("Z", CodePointToUtf8(L'Z')); +  EXPECT_EQ("&", CodePointToUtf8(L'&')); +  EXPECT_EQ("\x7F", CodePointToUtf8(L'\x7F')); +} + +// Tests that Unicode code-points that have 8 to 11 bits are encoded +// as 110xxxxx 10xxxxxx. +TEST(CodePointToUtf8Test, CanEncode8To11Bits) { +  // 000 1101 0011 => 110-00011 10-010011 +  EXPECT_EQ("\xC3\x93", CodePointToUtf8(L'\xD3')); + +  // 101 0111 0110 => 110-10101 10-110110 +  // Some compilers (e.g., GCC on MinGW) cannot handle non-ASCII codepoints +  // in wide strings and wide chars. In order to accommodate them, we have to +  // introduce such character constants as integers. +  EXPECT_EQ("\xD5\xB6", +            CodePointToUtf8(static_cast<wchar_t>(0x576))); +} + +// Tests that Unicode code-points that have 12 to 16 bits are encoded +// as 1110xxxx 10xxxxxx 10xxxxxx. +TEST(CodePointToUtf8Test, CanEncode12To16Bits) { +  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011 +  EXPECT_EQ("\xE0\xA3\x93", +            CodePointToUtf8(static_cast<wchar_t>(0x8D3))); + +  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101 +  EXPECT_EQ("\xEC\x9D\x8D", +            CodePointToUtf8(static_cast<wchar_t>(0xC74D))); +} + +#if !GTEST_WIDE_STRING_USES_UTF16_ +// Tests in this group require a wchar_t to hold > 16 bits, and thus +// are skipped on Windows, Cygwin, and Symbian, where a wchar_t is +// 16-bit wide. This code may not compile on those systems. + +// Tests that Unicode code-points that have 17 to 21 bits are encoded +// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. +TEST(CodePointToUtf8Test, CanEncode17To21Bits) { +  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011 +  EXPECT_EQ("\xF0\x90\xA3\x93", CodePointToUtf8(L'\x108D3')); + +  // 0 0001 0000 0100 0000 0000 => 11110-000 10-010000 10-010000 10-000000 +  EXPECT_EQ("\xF0\x90\x90\x80", CodePointToUtf8(L'\x10400')); + +  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100 +  EXPECT_EQ("\xF4\x88\x98\xB4", CodePointToUtf8(L'\x108634')); +} + +// Tests that encoding an invalid code-point generates the expected result. +TEST(CodePointToUtf8Test, CanEncodeInvalidCodePoint) { +  EXPECT_EQ("(Invalid Unicode 0x1234ABCD)", CodePointToUtf8(L'\x1234ABCD')); +} + +#endif  // !GTEST_WIDE_STRING_USES_UTF16_ + +// Tests WideStringToUtf8(). + +// Tests that the NUL character L'\0' is encoded correctly. +TEST(WideStringToUtf8Test, CanEncodeNul) { +  EXPECT_STREQ("", WideStringToUtf8(L"", 0).c_str()); +  EXPECT_STREQ("", WideStringToUtf8(L"", -1).c_str()); +} + +// Tests that ASCII strings are encoded correctly. +TEST(WideStringToUtf8Test, CanEncodeAscii) { +  EXPECT_STREQ("a", WideStringToUtf8(L"a", 1).c_str()); +  EXPECT_STREQ("ab", WideStringToUtf8(L"ab", 2).c_str()); +  EXPECT_STREQ("a", WideStringToUtf8(L"a", -1).c_str()); +  EXPECT_STREQ("ab", WideStringToUtf8(L"ab", -1).c_str()); +} + +// Tests that Unicode code-points that have 8 to 11 bits are encoded +// as 110xxxxx 10xxxxxx. +TEST(WideStringToUtf8Test, CanEncode8To11Bits) { +  // 000 1101 0011 => 110-00011 10-010011 +  EXPECT_STREQ("\xC3\x93", WideStringToUtf8(L"\xD3", 1).c_str()); +  EXPECT_STREQ("\xC3\x93", WideStringToUtf8(L"\xD3", -1).c_str()); + +  // 101 0111 0110 => 110-10101 10-110110 +  const wchar_t s[] = { 0x576, '\0' }; +  EXPECT_STREQ("\xD5\xB6", WideStringToUtf8(s, 1).c_str()); +  EXPECT_STREQ("\xD5\xB6", WideStringToUtf8(s, -1).c_str()); +} + +// Tests that Unicode code-points that have 12 to 16 bits are encoded +// as 1110xxxx 10xxxxxx 10xxxxxx. +TEST(WideStringToUtf8Test, CanEncode12To16Bits) { +  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011 +  const wchar_t s1[] = { 0x8D3, '\0' }; +  EXPECT_STREQ("\xE0\xA3\x93", WideStringToUtf8(s1, 1).c_str()); +  EXPECT_STREQ("\xE0\xA3\x93", WideStringToUtf8(s1, -1).c_str()); + +  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101 +  const wchar_t s2[] = { 0xC74D, '\0' }; +  EXPECT_STREQ("\xEC\x9D\x8D", WideStringToUtf8(s2, 1).c_str()); +  EXPECT_STREQ("\xEC\x9D\x8D", WideStringToUtf8(s2, -1).c_str()); +} + +// Tests that the conversion stops when the function encounters \0 character. +TEST(WideStringToUtf8Test, StopsOnNulCharacter) { +  EXPECT_STREQ("ABC", WideStringToUtf8(L"ABC\0XYZ", 100).c_str()); +} + +// Tests that the conversion stops when the function reaches the limit +// specified by the 'length' parameter. +TEST(WideStringToUtf8Test, StopsWhenLengthLimitReached) { +  EXPECT_STREQ("ABC", WideStringToUtf8(L"ABCDEF", 3).c_str()); +} + +#if !GTEST_WIDE_STRING_USES_UTF16_ +// Tests that Unicode code-points that have 17 to 21 bits are encoded +// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. This code may not compile +// on the systems using UTF-16 encoding. +TEST(WideStringToUtf8Test, CanEncode17To21Bits) { +  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011 +  EXPECT_STREQ("\xF0\x90\xA3\x93", WideStringToUtf8(L"\x108D3", 1).c_str()); +  EXPECT_STREQ("\xF0\x90\xA3\x93", WideStringToUtf8(L"\x108D3", -1).c_str()); + +  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100 +  EXPECT_STREQ("\xF4\x88\x98\xB4", WideStringToUtf8(L"\x108634", 1).c_str()); +  EXPECT_STREQ("\xF4\x88\x98\xB4", WideStringToUtf8(L"\x108634", -1).c_str()); +} + +// Tests that encoding an invalid code-point generates the expected result. +TEST(WideStringToUtf8Test, CanEncodeInvalidCodePoint) { +  EXPECT_STREQ("(Invalid Unicode 0xABCDFF)", +               WideStringToUtf8(L"\xABCDFF", -1).c_str()); +} +#else  // !GTEST_WIDE_STRING_USES_UTF16_ +// Tests that surrogate pairs are encoded correctly on the systems using +// UTF-16 encoding in the wide strings. +TEST(WideStringToUtf8Test, CanEncodeValidUtf16SUrrogatePairs) { +  const wchar_t s[] = { 0xD801, 0xDC00, '\0' }; +  EXPECT_STREQ("\xF0\x90\x90\x80", WideStringToUtf8(s, -1).c_str()); +} + +// Tests that encoding an invalid UTF-16 surrogate pair +// generates the expected result. +TEST(WideStringToUtf8Test, CanEncodeInvalidUtf16SurrogatePair) { +  // Leading surrogate is at the end of the string. +  const wchar_t s1[] = { 0xD800, '\0' }; +  EXPECT_STREQ("\xED\xA0\x80", WideStringToUtf8(s1, -1).c_str()); +  // Leading surrogate is not followed by the trailing surrogate. +  const wchar_t s2[] = { 0xD800, 'M', '\0' }; +  EXPECT_STREQ("\xED\xA0\x80M", WideStringToUtf8(s2, -1).c_str()); +  // Trailing surrogate appearas without a leading surrogate. +  const wchar_t s3[] = { 0xDC00, 'P', 'Q', 'R', '\0' }; +  EXPECT_STREQ("\xED\xB0\x80PQR", WideStringToUtf8(s3, -1).c_str()); +} +#endif  // !GTEST_WIDE_STRING_USES_UTF16_ + +// Tests that codepoint concatenation works correctly. +#if !GTEST_WIDE_STRING_USES_UTF16_ +TEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) { +  const wchar_t s[] = { 0x108634, 0xC74D, '\n', 0x576, 0x8D3, 0x108634, '\0'}; +  EXPECT_STREQ( +      "\xF4\x88\x98\xB4" +          "\xEC\x9D\x8D" +          "\n" +          "\xD5\xB6" +          "\xE0\xA3\x93" +          "\xF4\x88\x98\xB4", +      WideStringToUtf8(s, -1).c_str()); +} +#else +TEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) { +  const wchar_t s[] = { 0xC74D, '\n', 0x576, 0x8D3, '\0'}; +  EXPECT_STREQ( +      "\xEC\x9D\x8D" "\n" "\xD5\xB6" "\xE0\xA3\x93", +      WideStringToUtf8(s, -1).c_str()); +} +#endif  // !GTEST_WIDE_STRING_USES_UTF16_ + +// Tests the Random class. + +TEST(RandomDeathTest, GeneratesCrashesOnInvalidRange) { +  testing::internal::Random random(42); +  EXPECT_DEATH_IF_SUPPORTED( +      random.Generate(0), +      "Cannot generate a number in the range \\[0, 0\\)"); +  EXPECT_DEATH_IF_SUPPORTED( +      random.Generate(testing::internal::Random::kMaxRange + 1), +      "Generation of a number in \\[0, 2147483649\\) was requested, " +      "but this can only generate numbers in \\[0, 2147483648\\)"); +} + +TEST(RandomTest, GeneratesNumbersWithinRange) { +  const UInt32 kRange = 10000; +  testing::internal::Random random(12345); +  for (int i = 0; i < 10; i++) { +    EXPECT_LT(random.Generate(kRange), kRange) << " for iteration " << i; +  } + +  testing::internal::Random random2(testing::internal::Random::kMaxRange); +  for (int i = 0; i < 10; i++) { +    EXPECT_LT(random2.Generate(kRange), kRange) << " for iteration " << i; +  } +} + +TEST(RandomTest, RepeatsWhenReseeded) { +  const int kSeed = 123; +  const int kArraySize = 10; +  const UInt32 kRange = 10000; +  UInt32 values[kArraySize]; + +  testing::internal::Random random(kSeed); +  for (int i = 0; i < kArraySize; i++) { +    values[i] = random.Generate(kRange); +  } + +  random.Reseed(kSeed); +  for (int i = 0; i < kArraySize; i++) { +    EXPECT_EQ(values[i], random.Generate(kRange)) << " for iteration " << i; +  } +} + +// Tests STL container utilities. + +// Tests CountIf(). + +static bool IsPositive(int n) { return n > 0; } + +TEST(ContainerUtilityTest, CountIf) { +  std::vector<int> v; +  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works for an empty container. + +  v.push_back(-1); +  v.push_back(0); +  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works when no value satisfies. + +  v.push_back(2); +  v.push_back(-10); +  v.push_back(10); +  EXPECT_EQ(2, CountIf(v, IsPositive)); +} + +// Tests ForEach(). + +static int g_sum = 0; +static void Accumulate(int n) { g_sum += n; } + +TEST(ContainerUtilityTest, ForEach) { +  std::vector<int> v; +  g_sum = 0; +  ForEach(v, Accumulate); +  EXPECT_EQ(0, g_sum);  // Works for an empty container; + +  g_sum = 0; +  v.push_back(1); +  ForEach(v, Accumulate); +  EXPECT_EQ(1, g_sum);  // Works for a container with one element. + +  g_sum = 0; +  v.push_back(20); +  v.push_back(300); +  ForEach(v, Accumulate); +  EXPECT_EQ(321, g_sum); +} + +// Tests GetElementOr(). +TEST(ContainerUtilityTest, GetElementOr) { +  std::vector<char> a; +  EXPECT_EQ('x', GetElementOr(a, 0, 'x')); + +  a.push_back('a'); +  a.push_back('b'); +  EXPECT_EQ('a', GetElementOr(a, 0, 'x')); +  EXPECT_EQ('b', GetElementOr(a, 1, 'x')); +  EXPECT_EQ('x', GetElementOr(a, -2, 'x')); +  EXPECT_EQ('x', GetElementOr(a, 2, 'x')); +} + +TEST(ContainerUtilityDeathTest, ShuffleRange) { +  std::vector<int> a; +  a.push_back(0); +  a.push_back(1); +  a.push_back(2); +  testing::internal::Random random(1); + +  EXPECT_DEATH_IF_SUPPORTED( +      ShuffleRange(&random, -1, 1, &a), +      "Invalid shuffle range start -1: must be in range \\[0, 3\\]"); +  EXPECT_DEATH_IF_SUPPORTED( +      ShuffleRange(&random, 4, 4, &a), +      "Invalid shuffle range start 4: must be in range \\[0, 3\\]"); +  EXPECT_DEATH_IF_SUPPORTED( +      ShuffleRange(&random, 3, 2, &a), +      "Invalid shuffle range finish 2: must be in range \\[3, 3\\]"); +  EXPECT_DEATH_IF_SUPPORTED( +      ShuffleRange(&random, 3, 4, &a), +      "Invalid shuffle range finish 4: must be in range \\[3, 3\\]"); +} + +class VectorShuffleTest : public Test { + protected: +  static const int kVectorSize = 20; + +  VectorShuffleTest() : random_(1) { +    for (int i = 0; i < kVectorSize; i++) { +      vector_.push_back(i); +    } +  } + +  static bool VectorIsCorrupt(const TestingVector& vector) { +    if (kVectorSize != static_cast<int>(vector.size())) { +      return true; +    } + +    bool found_in_vector[kVectorSize] = { false }; +    for (size_t i = 0; i < vector.size(); i++) { +      const int e = vector[i]; +      if (e < 0 || e >= kVectorSize || found_in_vector[e]) { +        return true; +      } +      found_in_vector[e] = true; +    } + +    // Vector size is correct, elements' range is correct, no +    // duplicate elements.  Therefore no corruption has occurred. +    return false; +  } + +  static bool VectorIsNotCorrupt(const TestingVector& vector) { +    return !VectorIsCorrupt(vector); +  } + +  static bool RangeIsShuffled(const TestingVector& vector, int begin, int end) { +    for (int i = begin; i < end; i++) { +      if (i != vector[i]) { +        return true; +      } +    } +    return false; +  } + +  static bool RangeIsUnshuffled( +      const TestingVector& vector, int begin, int end) { +    return !RangeIsShuffled(vector, begin, end); +  } + +  static bool VectorIsShuffled(const TestingVector& vector) { +    return RangeIsShuffled(vector, 0, static_cast<int>(vector.size())); +  } + +  static bool VectorIsUnshuffled(const TestingVector& vector) { +    return !VectorIsShuffled(vector); +  } + +  testing::internal::Random random_; +  TestingVector vector_; +};  // class VectorShuffleTest + +const int VectorShuffleTest::kVectorSize; + +TEST_F(VectorShuffleTest, HandlesEmptyRange) { +  // Tests an empty range at the beginning... +  ShuffleRange(&random_, 0, 0, &vector_); +  ASSERT_PRED1(VectorIsNotCorrupt, vector_); +  ASSERT_PRED1(VectorIsUnshuffled, vector_); + +  // ...in the middle... +  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2, &vector_); +  ASSERT_PRED1(VectorIsNotCorrupt, vector_); +  ASSERT_PRED1(VectorIsUnshuffled, vector_); + +  // ...at the end... +  ShuffleRange(&random_, kVectorSize - 1, kVectorSize - 1, &vector_); +  ASSERT_PRED1(VectorIsNotCorrupt, vector_); +  ASSERT_PRED1(VectorIsUnshuffled, vector_); + +  // ...and past the end. +  ShuffleRange(&random_, kVectorSize, kVectorSize, &vector_); +  ASSERT_PRED1(VectorIsNotCorrupt, vector_); +  ASSERT_PRED1(VectorIsUnshuffled, vector_); +} + +TEST_F(VectorShuffleTest, HandlesRangeOfSizeOne) { +  // Tests a size one range at the beginning... +  ShuffleRange(&random_, 0, 1, &vector_); +  ASSERT_PRED1(VectorIsNotCorrupt, vector_); +  ASSERT_PRED1(VectorIsUnshuffled, vector_); + +  // ...in the middle... +  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2 + 1, &vector_); +  ASSERT_PRED1(VectorIsNotCorrupt, vector_); +  ASSERT_PRED1(VectorIsUnshuffled, vector_); + +  // ...and at the end. +  ShuffleRange(&random_, kVectorSize - 1, kVectorSize, &vector_); +  ASSERT_PRED1(VectorIsNotCorrupt, vector_); +  ASSERT_PRED1(VectorIsUnshuffled, vector_); +} + +// Because we use our own random number generator and a fixed seed, +// we can guarantee that the following "random" tests will succeed. + +TEST_F(VectorShuffleTest, ShufflesEntireVector) { +  Shuffle(&random_, &vector_); +  ASSERT_PRED1(VectorIsNotCorrupt, vector_); +  EXPECT_FALSE(VectorIsUnshuffled(vector_)) << vector_; + +  // Tests the first and last elements in particular to ensure that +  // there are no off-by-one problems in our shuffle algorithm. +  EXPECT_NE(0, vector_[0]); +  EXPECT_NE(kVectorSize - 1, vector_[kVectorSize - 1]); +} + +TEST_F(VectorShuffleTest, ShufflesStartOfVector) { +  const int kRangeSize = kVectorSize/2; + +  ShuffleRange(&random_, 0, kRangeSize, &vector_); + +  ASSERT_PRED1(VectorIsNotCorrupt, vector_); +  EXPECT_PRED3(RangeIsShuffled, vector_, 0, kRangeSize); +  EXPECT_PRED3(RangeIsUnshuffled, vector_, kRangeSize, kVectorSize); +} + +TEST_F(VectorShuffleTest, ShufflesEndOfVector) { +  const int kRangeSize = kVectorSize / 2; +  ShuffleRange(&random_, kRangeSize, kVectorSize, &vector_); + +  ASSERT_PRED1(VectorIsNotCorrupt, vector_); +  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize); +  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, kVectorSize); +} + +TEST_F(VectorShuffleTest, ShufflesMiddleOfVector) { +  int kRangeSize = kVectorSize/3; +  ShuffleRange(&random_, kRangeSize, 2*kRangeSize, &vector_); + +  ASSERT_PRED1(VectorIsNotCorrupt, vector_); +  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize); +  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, 2*kRangeSize); +  EXPECT_PRED3(RangeIsUnshuffled, vector_, 2*kRangeSize, kVectorSize); +} + +TEST_F(VectorShuffleTest, ShufflesRepeatably) { +  TestingVector vector2; +  for (int i = 0; i < kVectorSize; i++) { +    vector2.push_back(i); +  } + +  random_.Reseed(1234); +  Shuffle(&random_, &vector_); +  random_.Reseed(1234); +  Shuffle(&random_, &vector2); + +  ASSERT_PRED1(VectorIsNotCorrupt, vector_); +  ASSERT_PRED1(VectorIsNotCorrupt, vector2); + +  for (int i = 0; i < kVectorSize; i++) { +    EXPECT_EQ(vector_[i], vector2[i]) << " where i is " << i; +  } +} + +// Tests the size of the AssertHelper class. + +TEST(AssertHelperTest, AssertHelperIsSmall) { +  // To avoid breaking clients that use lots of assertions in one +  // function, we cannot grow the size of AssertHelper. +  EXPECT_LE(sizeof(testing::internal::AssertHelper), sizeof(void*)); +} + +// Tests String::EndsWithCaseInsensitive(). +TEST(StringTest, EndsWithCaseInsensitive) { +  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobar", "BAR")); +  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobaR", "bar")); +  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobar", "")); +  EXPECT_TRUE(String::EndsWithCaseInsensitive("", "")); + +  EXPECT_FALSE(String::EndsWithCaseInsensitive("Foobar", "foo")); +  EXPECT_FALSE(String::EndsWithCaseInsensitive("foobar", "Foo")); +  EXPECT_FALSE(String::EndsWithCaseInsensitive("", "foo")); +} + +// C++Builder's preprocessor is buggy; it fails to expand macros that +// appear in macro parameters after wide char literals.  Provide an alias +// for NULL as a workaround. +static const wchar_t* const kNull = NULL; + +// Tests String::CaseInsensitiveWideCStringEquals +TEST(StringTest, CaseInsensitiveWideCStringEquals) { +  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(NULL, NULL)); +  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L"")); +  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L"", kNull)); +  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L"foobar")); +  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L"foobar", kNull)); +  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"foobar", L"foobar")); +  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"foobar", L"FOOBAR")); +  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"FOOBAR", L"foobar")); +} + +#if GTEST_OS_WINDOWS + +// Tests String::ShowWideCString(). +TEST(StringTest, ShowWideCString) { +  EXPECT_STREQ("(null)", +               String::ShowWideCString(NULL).c_str()); +  EXPECT_STREQ("", String::ShowWideCString(L"").c_str()); +  EXPECT_STREQ("foo", String::ShowWideCString(L"foo").c_str()); +} + +# if GTEST_OS_WINDOWS_MOBILE +TEST(StringTest, AnsiAndUtf16Null) { +  EXPECT_EQ(NULL, String::AnsiToUtf16(NULL)); +  EXPECT_EQ(NULL, String::Utf16ToAnsi(NULL)); +} + +TEST(StringTest, AnsiAndUtf16ConvertBasic) { +  const char* ansi = String::Utf16ToAnsi(L"str"); +  EXPECT_STREQ("str", ansi); +  delete [] ansi; +  const WCHAR* utf16 = String::AnsiToUtf16("str"); +  EXPECT_EQ(0, wcsncmp(L"str", utf16, 3)); +  delete [] utf16; +} + +TEST(StringTest, AnsiAndUtf16ConvertPathChars) { +  const char* ansi = String::Utf16ToAnsi(L".:\\ \"*?"); +  EXPECT_STREQ(".:\\ \"*?", ansi); +  delete [] ansi; +  const WCHAR* utf16 = String::AnsiToUtf16(".:\\ \"*?"); +  EXPECT_EQ(0, wcsncmp(L".:\\ \"*?", utf16, 3)); +  delete [] utf16; +} +# endif  // GTEST_OS_WINDOWS_MOBILE + +#endif  // GTEST_OS_WINDOWS + +// Tests TestProperty construction. +TEST(TestPropertyTest, StringValue) { +  TestProperty property("key", "1"); +  EXPECT_STREQ("key", property.key()); +  EXPECT_STREQ("1", property.value()); +} + +// Tests TestProperty replacing a value. +TEST(TestPropertyTest, ReplaceStringValue) { +  TestProperty property("key", "1"); +  EXPECT_STREQ("1", property.value()); +  property.SetValue("2"); +  EXPECT_STREQ("2", property.value()); +} + +// AddFatalFailure() and AddNonfatalFailure() must be stand-alone +// functions (i.e. their definitions cannot be inlined at the call +// sites), or C++Builder won't compile the code. +static void AddFatalFailure() { +  FAIL() << "Expected fatal failure."; +} + +static void AddNonfatalFailure() { +  ADD_FAILURE() << "Expected non-fatal failure."; +} + +class ScopedFakeTestPartResultReporterTest : public Test { + public:  // Must be public and not protected due to a bug in g++ 3.4.2. +  enum FailureMode { +    FATAL_FAILURE, +    NONFATAL_FAILURE +  }; +  static void AddFailure(FailureMode failure) { +    if (failure == FATAL_FAILURE) { +      AddFatalFailure(); +    } else { +      AddNonfatalFailure(); +    } +  } +}; + +// Tests that ScopedFakeTestPartResultReporter intercepts test +// failures. +TEST_F(ScopedFakeTestPartResultReporterTest, InterceptsTestFailures) { +  TestPartResultArray results; +  { +    ScopedFakeTestPartResultReporter reporter( +        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD, +        &results); +    AddFailure(NONFATAL_FAILURE); +    AddFailure(FATAL_FAILURE); +  } + +  EXPECT_EQ(2, results.size()); +  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed()); +  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed()); +} + +TEST_F(ScopedFakeTestPartResultReporterTest, DeprecatedConstructor) { +  TestPartResultArray results; +  { +    // Tests, that the deprecated constructor still works. +    ScopedFakeTestPartResultReporter reporter(&results); +    AddFailure(NONFATAL_FAILURE); +  } +  EXPECT_EQ(1, results.size()); +} + +#if GTEST_IS_THREADSAFE + +class ScopedFakeTestPartResultReporterWithThreadsTest +  : public ScopedFakeTestPartResultReporterTest { + protected: +  static void AddFailureInOtherThread(FailureMode failure) { +    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL); +    thread.Join(); +  } +}; + +TEST_F(ScopedFakeTestPartResultReporterWithThreadsTest, +       InterceptsTestFailuresInAllThreads) { +  TestPartResultArray results; +  { +    ScopedFakeTestPartResultReporter reporter( +        ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, &results); +    AddFailure(NONFATAL_FAILURE); +    AddFailure(FATAL_FAILURE); +    AddFailureInOtherThread(NONFATAL_FAILURE); +    AddFailureInOtherThread(FATAL_FAILURE); +  } + +  EXPECT_EQ(4, results.size()); +  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed()); +  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed()); +  EXPECT_TRUE(results.GetTestPartResult(2).nonfatally_failed()); +  EXPECT_TRUE(results.GetTestPartResult(3).fatally_failed()); +} + +#endif  // GTEST_IS_THREADSAFE + +// Tests EXPECT_FATAL_FAILURE{,ON_ALL_THREADS}.  Makes sure that they +// work even if the failure is generated in a called function rather than +// the current context. + +typedef ScopedFakeTestPartResultReporterTest ExpectFatalFailureTest; + +TEST_F(ExpectFatalFailureTest, CatchesFatalFaliure) { +  EXPECT_FATAL_FAILURE(AddFatalFailure(), "Expected fatal failure."); +} + +#if GTEST_HAS_GLOBAL_STRING +TEST_F(ExpectFatalFailureTest, AcceptsStringObject) { +  EXPECT_FATAL_FAILURE(AddFatalFailure(), ::string("Expected fatal failure.")); +} +#endif + +TEST_F(ExpectFatalFailureTest, AcceptsStdStringObject) { +  EXPECT_FATAL_FAILURE(AddFatalFailure(), +                       ::std::string("Expected fatal failure.")); +} + +TEST_F(ExpectFatalFailureTest, CatchesFatalFailureOnAllThreads) { +  // We have another test below to verify that the macro catches fatal +  // failures generated on another thread. +  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFatalFailure(), +                                      "Expected fatal failure."); +} + +#ifdef __BORLANDC__ +// Silences warnings: "Condition is always true" +# pragma option push -w-ccc +#endif + +// Tests that EXPECT_FATAL_FAILURE() can be used in a non-void +// function even when the statement in it contains ASSERT_*. + +int NonVoidFunction() { +  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), ""); +  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), ""); +  return 0; +} + +TEST_F(ExpectFatalFailureTest, CanBeUsedInNonVoidFunction) { +  NonVoidFunction(); +} + +// Tests that EXPECT_FATAL_FAILURE(statement, ...) doesn't abort the +// current function even though 'statement' generates a fatal failure. + +void DoesNotAbortHelper(bool* aborted) { +  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), ""); +  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), ""); + +  *aborted = false; +} + +#ifdef __BORLANDC__ +// Restores warnings after previous "#pragma option push" suppressed them. +# pragma option pop +#endif + +TEST_F(ExpectFatalFailureTest, DoesNotAbort) { +  bool aborted = true; +  DoesNotAbortHelper(&aborted); +  EXPECT_FALSE(aborted); +} + +// Tests that the EXPECT_FATAL_FAILURE{,_ON_ALL_THREADS} accepts a +// statement that contains a macro which expands to code containing an +// unprotected comma. + +static int global_var = 0; +#define GTEST_USE_UNPROTECTED_COMMA_ global_var++, global_var++ + +TEST_F(ExpectFatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) { +#ifndef __BORLANDC__ +  // ICE's in C++Builder. +  EXPECT_FATAL_FAILURE({ +    GTEST_USE_UNPROTECTED_COMMA_; +    AddFatalFailure(); +  }, ""); +#endif + +  EXPECT_FATAL_FAILURE_ON_ALL_THREADS({ +    GTEST_USE_UNPROTECTED_COMMA_; +    AddFatalFailure(); +  }, ""); +} + +// Tests EXPECT_NONFATAL_FAILURE{,ON_ALL_THREADS}. + +typedef ScopedFakeTestPartResultReporterTest ExpectNonfatalFailureTest; + +TEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailure) { +  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(), +                          "Expected non-fatal failure."); +} + +#if GTEST_HAS_GLOBAL_STRING +TEST_F(ExpectNonfatalFailureTest, AcceptsStringObject) { +  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(), +                          ::string("Expected non-fatal failure.")); +} +#endif + +TEST_F(ExpectNonfatalFailureTest, AcceptsStdStringObject) { +  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(), +                          ::std::string("Expected non-fatal failure.")); +} + +TEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailureOnAllThreads) { +  // We have another test below to verify that the macro catches +  // non-fatal failures generated on another thread. +  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddNonfatalFailure(), +                                         "Expected non-fatal failure."); +} + +// Tests that the EXPECT_NONFATAL_FAILURE{,_ON_ALL_THREADS} accepts a +// statement that contains a macro which expands to code containing an +// unprotected comma. +TEST_F(ExpectNonfatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) { +  EXPECT_NONFATAL_FAILURE({ +    GTEST_USE_UNPROTECTED_COMMA_; +    AddNonfatalFailure(); +  }, ""); + +  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS({ +    GTEST_USE_UNPROTECTED_COMMA_; +    AddNonfatalFailure(); +  }, ""); +} + +#if GTEST_IS_THREADSAFE + +typedef ScopedFakeTestPartResultReporterWithThreadsTest +    ExpectFailureWithThreadsTest; + +TEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailureOnAllThreads) { +  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailureInOtherThread(FATAL_FAILURE), +                                      "Expected fatal failure."); +} + +TEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailureOnAllThreads) { +  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS( +      AddFailureInOtherThread(NONFATAL_FAILURE), "Expected non-fatal failure."); +} + +#endif  // GTEST_IS_THREADSAFE + +// Tests the TestProperty class. + +TEST(TestPropertyTest, ConstructorWorks) { +  const TestProperty property("key", "value"); +  EXPECT_STREQ("key", property.key()); +  EXPECT_STREQ("value", property.value()); +} + +TEST(TestPropertyTest, SetValue) { +  TestProperty property("key", "value_1"); +  EXPECT_STREQ("key", property.key()); +  property.SetValue("value_2"); +  EXPECT_STREQ("key", property.key()); +  EXPECT_STREQ("value_2", property.value()); +} + +// Tests the TestResult class + +// The test fixture for testing TestResult. +class TestResultTest : public Test { + protected: +  typedef std::vector<TestPartResult> TPRVector; + +  // We make use of 2 TestPartResult objects, +  TestPartResult * pr1, * pr2; + +  // ... and 3 TestResult objects. +  TestResult * r0, * r1, * r2; + +  virtual void SetUp() { +    // pr1 is for success. +    pr1 = new TestPartResult(TestPartResult::kSuccess, +                             "foo/bar.cc", +                             10, +                             "Success!"); + +    // pr2 is for fatal failure. +    pr2 = new TestPartResult(TestPartResult::kFatalFailure, +                             "foo/bar.cc", +                             -1,  // This line number means "unknown" +                             "Failure!"); + +    // Creates the TestResult objects. +    r0 = new TestResult(); +    r1 = new TestResult(); +    r2 = new TestResult(); + +    // In order to test TestResult, we need to modify its internal +    // state, in particular the TestPartResult vector it holds. +    // test_part_results() returns a const reference to this vector. +    // We cast it to a non-const object s.t. it can be modified +    TPRVector* results1 = const_cast<TPRVector*>( +        &TestResultAccessor::test_part_results(*r1)); +    TPRVector* results2 = const_cast<TPRVector*>( +        &TestResultAccessor::test_part_results(*r2)); + +    // r0 is an empty TestResult. + +    // r1 contains a single SUCCESS TestPartResult. +    results1->push_back(*pr1); + +    // r2 contains a SUCCESS, and a FAILURE. +    results2->push_back(*pr1); +    results2->push_back(*pr2); +  } + +  virtual void TearDown() { +    delete pr1; +    delete pr2; + +    delete r0; +    delete r1; +    delete r2; +  } + +  // Helper that compares two TestPartResults. +  static void CompareTestPartResult(const TestPartResult& expected, +                                    const TestPartResult& actual) { +    EXPECT_EQ(expected.type(), actual.type()); +    EXPECT_STREQ(expected.file_name(), actual.file_name()); +    EXPECT_EQ(expected.line_number(), actual.line_number()); +    EXPECT_STREQ(expected.summary(), actual.summary()); +    EXPECT_STREQ(expected.message(), actual.message()); +    EXPECT_EQ(expected.passed(), actual.passed()); +    EXPECT_EQ(expected.failed(), actual.failed()); +    EXPECT_EQ(expected.nonfatally_failed(), actual.nonfatally_failed()); +    EXPECT_EQ(expected.fatally_failed(), actual.fatally_failed()); +  } +}; + +// Tests TestResult::total_part_count(). +TEST_F(TestResultTest, total_part_count) { +  ASSERT_EQ(0, r0->total_part_count()); +  ASSERT_EQ(1, r1->total_part_count()); +  ASSERT_EQ(2, r2->total_part_count()); +} + +// Tests TestResult::Passed(). +TEST_F(TestResultTest, Passed) { +  ASSERT_TRUE(r0->Passed()); +  ASSERT_TRUE(r1->Passed()); +  ASSERT_FALSE(r2->Passed()); +} + +// Tests TestResult::Failed(). +TEST_F(TestResultTest, Failed) { +  ASSERT_FALSE(r0->Failed()); +  ASSERT_FALSE(r1->Failed()); +  ASSERT_TRUE(r2->Failed()); +} + +// Tests TestResult::GetTestPartResult(). + +typedef TestResultTest TestResultDeathTest; + +TEST_F(TestResultDeathTest, GetTestPartResult) { +  CompareTestPartResult(*pr1, r2->GetTestPartResult(0)); +  CompareTestPartResult(*pr2, r2->GetTestPartResult(1)); +  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(2), ""); +  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(-1), ""); +} + +// Tests TestResult has no properties when none are added. +TEST(TestResultPropertyTest, NoPropertiesFoundWhenNoneAreAdded) { +  TestResult test_result; +  ASSERT_EQ(0, test_result.test_property_count()); +} + +// Tests TestResult has the expected property when added. +TEST(TestResultPropertyTest, OnePropertyFoundWhenAdded) { +  TestResult test_result; +  TestProperty property("key_1", "1"); +  TestResultAccessor::RecordProperty(&test_result, "testcase", property); +  ASSERT_EQ(1, test_result.test_property_count()); +  const TestProperty& actual_property = test_result.GetTestProperty(0); +  EXPECT_STREQ("key_1", actual_property.key()); +  EXPECT_STREQ("1", actual_property.value()); +} + +// Tests TestResult has multiple properties when added. +TEST(TestResultPropertyTest, MultiplePropertiesFoundWhenAdded) { +  TestResult test_result; +  TestProperty property_1("key_1", "1"); +  TestProperty property_2("key_2", "2"); +  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1); +  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2); +  ASSERT_EQ(2, test_result.test_property_count()); +  const TestProperty& actual_property_1 = test_result.GetTestProperty(0); +  EXPECT_STREQ("key_1", actual_property_1.key()); +  EXPECT_STREQ("1", actual_property_1.value()); + +  const TestProperty& actual_property_2 = test_result.GetTestProperty(1); +  EXPECT_STREQ("key_2", actual_property_2.key()); +  EXPECT_STREQ("2", actual_property_2.value()); +} + +// Tests TestResult::RecordProperty() overrides values for duplicate keys. +TEST(TestResultPropertyTest, OverridesValuesForDuplicateKeys) { +  TestResult test_result; +  TestProperty property_1_1("key_1", "1"); +  TestProperty property_2_1("key_2", "2"); +  TestProperty property_1_2("key_1", "12"); +  TestProperty property_2_2("key_2", "22"); +  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1_1); +  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2_1); +  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1_2); +  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2_2); + +  ASSERT_EQ(2, test_result.test_property_count()); +  const TestProperty& actual_property_1 = test_result.GetTestProperty(0); +  EXPECT_STREQ("key_1", actual_property_1.key()); +  EXPECT_STREQ("12", actual_property_1.value()); + +  const TestProperty& actual_property_2 = test_result.GetTestProperty(1); +  EXPECT_STREQ("key_2", actual_property_2.key()); +  EXPECT_STREQ("22", actual_property_2.value()); +} + +// Tests TestResult::GetTestProperty(). +TEST(TestResultPropertyTest, GetTestProperty) { +  TestResult test_result; +  TestProperty property_1("key_1", "1"); +  TestProperty property_2("key_2", "2"); +  TestProperty property_3("key_3", "3"); +  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1); +  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2); +  TestResultAccessor::RecordProperty(&test_result, "testcase", property_3); + +  const TestProperty& fetched_property_1 = test_result.GetTestProperty(0); +  const TestProperty& fetched_property_2 = test_result.GetTestProperty(1); +  const TestProperty& fetched_property_3 = test_result.GetTestProperty(2); + +  EXPECT_STREQ("key_1", fetched_property_1.key()); +  EXPECT_STREQ("1", fetched_property_1.value()); + +  EXPECT_STREQ("key_2", fetched_property_2.key()); +  EXPECT_STREQ("2", fetched_property_2.value()); + +  EXPECT_STREQ("key_3", fetched_property_3.key()); +  EXPECT_STREQ("3", fetched_property_3.value()); + +  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(3), ""); +  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(-1), ""); +} + +// Tests the Test class. +// +// It's difficult to test every public method of this class (we are +// already stretching the limit of Google Test by using it to test itself!). +// Fortunately, we don't have to do that, as we are already testing +// the functionalities of the Test class extensively by using Google Test +// alone. +// +// Therefore, this section only contains one test. + +// Tests that GTestFlagSaver works on Windows and Mac. + +class GTestFlagSaverTest : public Test { + protected: +  // Saves the Google Test flags such that we can restore them later, and +  // then sets them to their default values.  This will be called +  // before the first test in this test case is run. +  static void SetUpTestCase() { +    saver_ = new GTestFlagSaver; + +    GTEST_FLAG(also_run_disabled_tests) = false; +    GTEST_FLAG(break_on_failure) = false; +    GTEST_FLAG(catch_exceptions) = false; +    GTEST_FLAG(death_test_use_fork) = false; +    GTEST_FLAG(color) = "auto"; +    GTEST_FLAG(filter) = ""; +    GTEST_FLAG(list_tests) = false; +    GTEST_FLAG(output) = ""; +    GTEST_FLAG(print_time) = true; +    GTEST_FLAG(random_seed) = 0; +    GTEST_FLAG(repeat) = 1; +    GTEST_FLAG(shuffle) = false; +    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth; +    GTEST_FLAG(stream_result_to) = ""; +    GTEST_FLAG(throw_on_failure) = false; +  } + +  // Restores the Google Test flags that the tests have modified.  This will +  // be called after the last test in this test case is run. +  static void TearDownTestCase() { +    delete saver_; +    saver_ = NULL; +  } + +  // Verifies that the Google Test flags have their default values, and then +  // modifies each of them. +  void VerifyAndModifyFlags() { +    EXPECT_FALSE(GTEST_FLAG(also_run_disabled_tests)); +    EXPECT_FALSE(GTEST_FLAG(break_on_failure)); +    EXPECT_FALSE(GTEST_FLAG(catch_exceptions)); +    EXPECT_STREQ("auto", GTEST_FLAG(color).c_str()); +    EXPECT_FALSE(GTEST_FLAG(death_test_use_fork)); +    EXPECT_STREQ("", GTEST_FLAG(filter).c_str()); +    EXPECT_FALSE(GTEST_FLAG(list_tests)); +    EXPECT_STREQ("", GTEST_FLAG(output).c_str()); +    EXPECT_TRUE(GTEST_FLAG(print_time)); +    EXPECT_EQ(0, GTEST_FLAG(random_seed)); +    EXPECT_EQ(1, GTEST_FLAG(repeat)); +    EXPECT_FALSE(GTEST_FLAG(shuffle)); +    EXPECT_EQ(kMaxStackTraceDepth, GTEST_FLAG(stack_trace_depth)); +    EXPECT_STREQ("", GTEST_FLAG(stream_result_to).c_str()); +    EXPECT_FALSE(GTEST_FLAG(throw_on_failure)); + +    GTEST_FLAG(also_run_disabled_tests) = true; +    GTEST_FLAG(break_on_failure) = true; +    GTEST_FLAG(catch_exceptions) = true; +    GTEST_FLAG(color) = "no"; +    GTEST_FLAG(death_test_use_fork) = true; +    GTEST_FLAG(filter) = "abc"; +    GTEST_FLAG(list_tests) = true; +    GTEST_FLAG(output) = "xml:foo.xml"; +    GTEST_FLAG(print_time) = false; +    GTEST_FLAG(random_seed) = 1; +    GTEST_FLAG(repeat) = 100; +    GTEST_FLAG(shuffle) = true; +    GTEST_FLAG(stack_trace_depth) = 1; +    GTEST_FLAG(stream_result_to) = "localhost:1234"; +    GTEST_FLAG(throw_on_failure) = true; +  } + + private: +  // For saving Google Test flags during this test case. +  static GTestFlagSaver* saver_; +}; + +GTestFlagSaver* GTestFlagSaverTest::saver_ = NULL; + +// Google Test doesn't guarantee the order of tests.  The following two +// tests are designed to work regardless of their order. + +// Modifies the Google Test flags in the test body. +TEST_F(GTestFlagSaverTest, ModifyGTestFlags) { +  VerifyAndModifyFlags(); +} + +// Verifies that the Google Test flags in the body of the previous test were +// restored to their original values. +TEST_F(GTestFlagSaverTest, VerifyGTestFlags) { +  VerifyAndModifyFlags(); +} + +// Sets an environment variable with the given name to the given +// value.  If the value argument is "", unsets the environment +// variable.  The caller must ensure that both arguments are not NULL. +static void SetEnv(const char* name, const char* value) { +#if GTEST_OS_WINDOWS_MOBILE +  // Environment variables are not supported on Windows CE. +  return; +#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) +  // C++Builder's putenv only stores a pointer to its parameter; we have to +  // ensure that the string remains valid as long as it might be needed. +  // We use an std::map to do so. +  static std::map<std::string, std::string*> added_env; + +  // Because putenv stores a pointer to the string buffer, we can't delete the +  // previous string (if present) until after it's replaced. +  std::string *prev_env = NULL; +  if (added_env.find(name) != added_env.end()) { +    prev_env = added_env[name]; +  } +  added_env[name] = new std::string( +      (Message() << name << "=" << value).GetString()); + +  // The standard signature of putenv accepts a 'char*' argument. Other +  // implementations, like C++Builder's, accept a 'const char*'. +  // We cast away the 'const' since that would work for both variants. +  putenv(const_cast<char*>(added_env[name]->c_str())); +  delete prev_env; +#elif GTEST_OS_WINDOWS  // If we are on Windows proper. +  _putenv((Message() << name << "=" << value).GetString().c_str()); +#else +  if (*value == '\0') { +    unsetenv(name); +  } else { +    setenv(name, value, 1); +  } +#endif  // GTEST_OS_WINDOWS_MOBILE +} + +#if !GTEST_OS_WINDOWS_MOBILE +// Environment variables are not supported on Windows CE. + +using testing::internal::Int32FromGTestEnv; + +// Tests Int32FromGTestEnv(). + +// Tests that Int32FromGTestEnv() returns the default value when the +// environment variable is not set. +TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenVariableIsNotSet) { +  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", ""); +  EXPECT_EQ(10, Int32FromGTestEnv("temp", 10)); +} + +# if !defined(GTEST_GET_INT32_FROM_ENV_) + +// Tests that Int32FromGTestEnv() returns the default value when the +// environment variable overflows as an Int32. +TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueOverflows) { +  printf("(expecting 2 warnings)\n"); + +  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "12345678987654321"); +  EXPECT_EQ(20, Int32FromGTestEnv("temp", 20)); + +  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "-12345678987654321"); +  EXPECT_EQ(30, Int32FromGTestEnv("temp", 30)); +} + +// Tests that Int32FromGTestEnv() returns the default value when the +// environment variable does not represent a valid decimal integer. +TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueIsInvalid) { +  printf("(expecting 2 warnings)\n"); + +  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "A1"); +  EXPECT_EQ(40, Int32FromGTestEnv("temp", 40)); + +  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "12X"); +  EXPECT_EQ(50, Int32FromGTestEnv("temp", 50)); +} + +# endif  // !defined(GTEST_GET_INT32_FROM_ENV_) + +// Tests that Int32FromGTestEnv() parses and returns the value of the +// environment variable when it represents a valid decimal integer in +// the range of an Int32. +TEST(Int32FromGTestEnvTest, ParsesAndReturnsValidValue) { +  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "123"); +  EXPECT_EQ(123, Int32FromGTestEnv("temp", 0)); + +  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "-321"); +  EXPECT_EQ(-321, Int32FromGTestEnv("temp", 0)); +} +#endif  // !GTEST_OS_WINDOWS_MOBILE + +// Tests ParseInt32Flag(). + +// Tests that ParseInt32Flag() returns false and doesn't change the +// output value when the flag has wrong format +TEST(ParseInt32FlagTest, ReturnsFalseForInvalidFlag) { +  Int32 value = 123; +  EXPECT_FALSE(ParseInt32Flag("--a=100", "b", &value)); +  EXPECT_EQ(123, value); + +  EXPECT_FALSE(ParseInt32Flag("a=100", "a", &value)); +  EXPECT_EQ(123, value); +} + +// Tests that ParseInt32Flag() returns false and doesn't change the +// output value when the flag overflows as an Int32. +TEST(ParseInt32FlagTest, ReturnsDefaultWhenValueOverflows) { +  printf("(expecting 2 warnings)\n"); + +  Int32 value = 123; +  EXPECT_FALSE(ParseInt32Flag("--abc=12345678987654321", "abc", &value)); +  EXPECT_EQ(123, value); + +  EXPECT_FALSE(ParseInt32Flag("--abc=-12345678987654321", "abc", &value)); +  EXPECT_EQ(123, value); +} + +// Tests that ParseInt32Flag() returns false and doesn't change the +// output value when the flag does not represent a valid decimal +// integer. +TEST(ParseInt32FlagTest, ReturnsDefaultWhenValueIsInvalid) { +  printf("(expecting 2 warnings)\n"); + +  Int32 value = 123; +  EXPECT_FALSE(ParseInt32Flag("--abc=A1", "abc", &value)); +  EXPECT_EQ(123, value); + +  EXPECT_FALSE(ParseInt32Flag("--abc=12X", "abc", &value)); +  EXPECT_EQ(123, value); +} + +// Tests that ParseInt32Flag() parses the value of the flag and +// returns true when the flag represents a valid decimal integer in +// the range of an Int32. +TEST(ParseInt32FlagTest, ParsesAndReturnsValidValue) { +  Int32 value = 123; +  EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX_ "abc=456", "abc", &value)); +  EXPECT_EQ(456, value); + +  EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX_ "abc=-789", +                             "abc", &value)); +  EXPECT_EQ(-789, value); +} + +// Tests that Int32FromEnvOrDie() parses the value of the var or +// returns the correct default. +// Environment variables are not supported on Windows CE. +#if !GTEST_OS_WINDOWS_MOBILE +TEST(Int32FromEnvOrDieTest, ParsesAndReturnsValidValue) { +  EXPECT_EQ(333, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333)); +  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", "123"); +  EXPECT_EQ(123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333)); +  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", "-123"); +  EXPECT_EQ(-123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333)); +} +#endif  // !GTEST_OS_WINDOWS_MOBILE + +// Tests that Int32FromEnvOrDie() aborts with an error message +// if the variable is not an Int32. +TEST(Int32FromEnvOrDieDeathTest, AbortsOnFailure) { +  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "VAR", "xxx"); +  EXPECT_DEATH_IF_SUPPORTED( +      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "VAR", 123), +      ".*"); +} + +// Tests that Int32FromEnvOrDie() aborts with an error message +// if the variable cannot be represented by an Int32. +TEST(Int32FromEnvOrDieDeathTest, AbortsOnInt32Overflow) { +  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "VAR", "1234567891234567891234"); +  EXPECT_DEATH_IF_SUPPORTED( +      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "VAR", 123), +      ".*"); +} + +// Tests that ShouldRunTestOnShard() selects all tests +// where there is 1 shard. +TEST(ShouldRunTestOnShardTest, IsPartitionWhenThereIsOneShard) { +  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 0)); +  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 1)); +  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 2)); +  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 3)); +  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 4)); +} + +class ShouldShardTest : public testing::Test { + protected: +  virtual void SetUp() { +    index_var_ = GTEST_FLAG_PREFIX_UPPER_ "INDEX"; +    total_var_ = GTEST_FLAG_PREFIX_UPPER_ "TOTAL"; +  } + +  virtual void TearDown() { +    SetEnv(index_var_, ""); +    SetEnv(total_var_, ""); +  } + +  const char* index_var_; +  const char* total_var_; +}; + +// Tests that sharding is disabled if neither of the environment variables +// are set. +TEST_F(ShouldShardTest, ReturnsFalseWhenNeitherEnvVarIsSet) { +  SetEnv(index_var_, ""); +  SetEnv(total_var_, ""); + +  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false)); +  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true)); +} + +// Tests that sharding is not enabled if total_shards  == 1. +TEST_F(ShouldShardTest, ReturnsFalseWhenTotalShardIsOne) { +  SetEnv(index_var_, "0"); +  SetEnv(total_var_, "1"); +  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false)); +  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true)); +} + +// Tests that sharding is enabled if total_shards > 1 and +// we are not in a death test subprocess. +// Environment variables are not supported on Windows CE. +#if !GTEST_OS_WINDOWS_MOBILE +TEST_F(ShouldShardTest, WorksWhenShardEnvVarsAreValid) { +  SetEnv(index_var_, "4"); +  SetEnv(total_var_, "22"); +  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false)); +  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true)); + +  SetEnv(index_var_, "8"); +  SetEnv(total_var_, "9"); +  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false)); +  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true)); + +  SetEnv(index_var_, "0"); +  SetEnv(total_var_, "9"); +  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false)); +  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true)); +} +#endif  // !GTEST_OS_WINDOWS_MOBILE + +// Tests that we exit in error if the sharding values are not valid. + +typedef ShouldShardTest ShouldShardDeathTest; + +TEST_F(ShouldShardDeathTest, AbortsWhenShardingEnvVarsAreInvalid) { +  SetEnv(index_var_, "4"); +  SetEnv(total_var_, "4"); +  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*"); + +  SetEnv(index_var_, "4"); +  SetEnv(total_var_, "-2"); +  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*"); + +  SetEnv(index_var_, "5"); +  SetEnv(total_var_, ""); +  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*"); + +  SetEnv(index_var_, ""); +  SetEnv(total_var_, "5"); +  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*"); +} + +// Tests that ShouldRunTestOnShard is a partition when 5 +// shards are used. +TEST(ShouldRunTestOnShardTest, IsPartitionWhenThereAreFiveShards) { +  // Choose an arbitrary number of tests and shards. +  const int num_tests = 17; +  const int num_shards = 5; + +  // Check partitioning: each test should be on exactly 1 shard. +  for (int test_id = 0; test_id < num_tests; test_id++) { +    int prev_selected_shard_index = -1; +    for (int shard_index = 0; shard_index < num_shards; shard_index++) { +      if (ShouldRunTestOnShard(num_shards, shard_index, test_id)) { +        if (prev_selected_shard_index < 0) { +          prev_selected_shard_index = shard_index; +        } else { +          ADD_FAILURE() << "Shard " << prev_selected_shard_index << " and " +            << shard_index << " are both selected to run test " << test_id; +        } +      } +    } +  } + +  // Check balance: This is not required by the sharding protocol, but is a +  // desirable property for performance. +  for (int shard_index = 0; shard_index < num_shards; shard_index++) { +    int num_tests_on_shard = 0; +    for (int test_id = 0; test_id < num_tests; test_id++) { +      num_tests_on_shard += +        ShouldRunTestOnShard(num_shards, shard_index, test_id); +    } +    EXPECT_GE(num_tests_on_shard, num_tests / num_shards); +  } +} + +// For the same reason we are not explicitly testing everything in the +// Test class, there are no separate tests for the following classes +// (except for some trivial cases): +// +//   TestCase, UnitTest, UnitTestResultPrinter. +// +// Similarly, there are no separate tests for the following macros: +// +//   TEST, TEST_F, RUN_ALL_TESTS + +TEST(UnitTestTest, CanGetOriginalWorkingDir) { +  ASSERT_TRUE(UnitTest::GetInstance()->original_working_dir() != NULL); +  EXPECT_STRNE(UnitTest::GetInstance()->original_working_dir(), ""); +} + +TEST(UnitTestTest, ReturnsPlausibleTimestamp) { +  EXPECT_LT(0, UnitTest::GetInstance()->start_timestamp()); +  EXPECT_LE(UnitTest::GetInstance()->start_timestamp(), GetTimeInMillis()); +} + +// When a property using a reserved key is supplied to this function, it +// tests that a non-fatal failure is added, a fatal failure is not added, +// and that the property is not recorded. +void ExpectNonFatalFailureRecordingPropertyWithReservedKey( +    const TestResult& test_result, const char* key) { +  EXPECT_NONFATAL_FAILURE(Test::RecordProperty(key, "1"), "Reserved key"); +  ASSERT_EQ(0, test_result.test_property_count()) << "Property for key '" << key +                                                  << "' recorded unexpectedly."; +} + +void ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest( +    const char* key) { +  const TestInfo* test_info = UnitTest::GetInstance()->current_test_info(); +  ASSERT_TRUE(test_info != NULL); +  ExpectNonFatalFailureRecordingPropertyWithReservedKey(*test_info->result(), +                                                        key); +} + +void ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase( +    const char* key) { +  const TestCase* test_case = UnitTest::GetInstance()->current_test_case(); +  ASSERT_TRUE(test_case != NULL); +  ExpectNonFatalFailureRecordingPropertyWithReservedKey( +      test_case->ad_hoc_test_result(), key); +} + +void ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase( +    const char* key) { +  ExpectNonFatalFailureRecordingPropertyWithReservedKey( +      UnitTest::GetInstance()->ad_hoc_test_result(), key); +} + +// Tests that property recording functions in UnitTest outside of tests +// functions correcly.  Creating a separate instance of UnitTest ensures it +// is in a state similar to the UnitTest's singleton's between tests. +class UnitTestRecordPropertyTest : +    public testing::internal::UnitTestRecordPropertyTestHelper { + public: +  static void SetUpTestCase() { +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase( +        "disabled"); +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase( +        "errors"); +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase( +        "failures"); +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase( +        "name"); +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase( +        "tests"); +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase( +        "time"); + +    Test::RecordProperty("test_case_key_1", "1"); +    const TestCase* test_case = UnitTest::GetInstance()->current_test_case(); +    ASSERT_TRUE(test_case != NULL); + +    ASSERT_EQ(1, test_case->ad_hoc_test_result().test_property_count()); +    EXPECT_STREQ("test_case_key_1", +                 test_case->ad_hoc_test_result().GetTestProperty(0).key()); +    EXPECT_STREQ("1", +                 test_case->ad_hoc_test_result().GetTestProperty(0).value()); +  } +}; + +// Tests TestResult has the expected property when added. +TEST_F(UnitTestRecordPropertyTest, OnePropertyFoundWhenAdded) { +  UnitTestRecordProperty("key_1", "1"); + +  ASSERT_EQ(1, unit_test_.ad_hoc_test_result().test_property_count()); + +  EXPECT_STREQ("key_1", +               unit_test_.ad_hoc_test_result().GetTestProperty(0).key()); +  EXPECT_STREQ("1", +               unit_test_.ad_hoc_test_result().GetTestProperty(0).value()); +} + +// Tests TestResult has multiple properties when added. +TEST_F(UnitTestRecordPropertyTest, MultiplePropertiesFoundWhenAdded) { +  UnitTestRecordProperty("key_1", "1"); +  UnitTestRecordProperty("key_2", "2"); + +  ASSERT_EQ(2, unit_test_.ad_hoc_test_result().test_property_count()); + +  EXPECT_STREQ("key_1", +               unit_test_.ad_hoc_test_result().GetTestProperty(0).key()); +  EXPECT_STREQ("1", unit_test_.ad_hoc_test_result().GetTestProperty(0).value()); + +  EXPECT_STREQ("key_2", +               unit_test_.ad_hoc_test_result().GetTestProperty(1).key()); +  EXPECT_STREQ("2", unit_test_.ad_hoc_test_result().GetTestProperty(1).value()); +} + +// Tests TestResult::RecordProperty() overrides values for duplicate keys. +TEST_F(UnitTestRecordPropertyTest, OverridesValuesForDuplicateKeys) { +  UnitTestRecordProperty("key_1", "1"); +  UnitTestRecordProperty("key_2", "2"); +  UnitTestRecordProperty("key_1", "12"); +  UnitTestRecordProperty("key_2", "22"); + +  ASSERT_EQ(2, unit_test_.ad_hoc_test_result().test_property_count()); + +  EXPECT_STREQ("key_1", +               unit_test_.ad_hoc_test_result().GetTestProperty(0).key()); +  EXPECT_STREQ("12", +               unit_test_.ad_hoc_test_result().GetTestProperty(0).value()); + +  EXPECT_STREQ("key_2", +               unit_test_.ad_hoc_test_result().GetTestProperty(1).key()); +  EXPECT_STREQ("22", +               unit_test_.ad_hoc_test_result().GetTestProperty(1).value()); +} + +TEST_F(UnitTestRecordPropertyTest, +       AddFailureInsideTestsWhenUsingTestCaseReservedKeys) { +  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest( +      "name"); +  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest( +      "value_param"); +  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest( +      "type_param"); +  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest( +      "status"); +  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest( +      "time"); +  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest( +      "classname"); +} + +TEST_F(UnitTestRecordPropertyTest, +       AddRecordWithReservedKeysGeneratesCorrectPropertyList) { +  EXPECT_NONFATAL_FAILURE( +      Test::RecordProperty("name", "1"), +      "'classname', 'name', 'status', 'time', 'type_param', 'value_param'," +      " 'file', and 'line' are reserved"); +} + +class UnitTestRecordPropertyTestEnvironment : public Environment { + public: +  virtual void TearDown() { +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase( +        "tests"); +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase( +        "failures"); +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase( +        "disabled"); +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase( +        "errors"); +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase( +        "name"); +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase( +        "timestamp"); +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase( +        "time"); +    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase( +        "random_seed"); +  } +}; + +// This will test property recording outside of any test or test case. +static Environment* record_property_env = +    AddGlobalTestEnvironment(new UnitTestRecordPropertyTestEnvironment); + +// This group of tests is for predicate assertions (ASSERT_PRED*, etc) +// of various arities.  They do not attempt to be exhaustive.  Rather, +// view them as smoke tests that can be easily reviewed and verified. +// A more complete set of tests for predicate assertions can be found +// in gtest_pred_impl_unittest.cc. + +// First, some predicates and predicate-formatters needed by the tests. + +// Returns true iff the argument is an even number. +bool IsEven(int n) { +  return (n % 2) == 0; +} + +// A functor that returns true iff the argument is an even number. +struct IsEvenFunctor { +  bool operator()(int n) { return IsEven(n); } +}; + +// A predicate-formatter function that asserts the argument is an even +// number. +AssertionResult AssertIsEven(const char* expr, int n) { +  if (IsEven(n)) { +    return AssertionSuccess(); +  } + +  Message msg; +  msg << expr << " evaluates to " << n << ", which is not even."; +  return AssertionFailure(msg); +} + +// A predicate function that returns AssertionResult for use in +// EXPECT/ASSERT_TRUE/FALSE. +AssertionResult ResultIsEven(int n) { +  if (IsEven(n)) +    return AssertionSuccess() << n << " is even"; +  else +    return AssertionFailure() << n << " is odd"; +} + +// A predicate function that returns AssertionResult but gives no +// explanation why it succeeds. Needed for testing that +// EXPECT/ASSERT_FALSE handles such functions correctly. +AssertionResult ResultIsEvenNoExplanation(int n) { +  if (IsEven(n)) +    return AssertionSuccess(); +  else +    return AssertionFailure() << n << " is odd"; +} + +// A predicate-formatter functor that asserts the argument is an even +// number. +struct AssertIsEvenFunctor { +  AssertionResult operator()(const char* expr, int n) { +    return AssertIsEven(expr, n); +  } +}; + +// Returns true iff the sum of the arguments is an even number. +bool SumIsEven2(int n1, int n2) { +  return IsEven(n1 + n2); +} + +// A functor that returns true iff the sum of the arguments is an even +// number. +struct SumIsEven3Functor { +  bool operator()(int n1, int n2, int n3) { +    return IsEven(n1 + n2 + n3); +  } +}; + +// A predicate-formatter function that asserts the sum of the +// arguments is an even number. +AssertionResult AssertSumIsEven4( +    const char* e1, const char* e2, const char* e3, const char* e4, +    int n1, int n2, int n3, int n4) { +  const int sum = n1 + n2 + n3 + n4; +  if (IsEven(sum)) { +    return AssertionSuccess(); +  } + +  Message msg; +  msg << e1 << " + " << e2 << " + " << e3 << " + " << e4 +      << " (" << n1 << " + " << n2 << " + " << n3 << " + " << n4 +      << ") evaluates to " << sum << ", which is not even."; +  return AssertionFailure(msg); +} + +// A predicate-formatter functor that asserts the sum of the arguments +// is an even number. +struct AssertSumIsEven5Functor { +  AssertionResult operator()( +      const char* e1, const char* e2, const char* e3, const char* e4, +      const char* e5, int n1, int n2, int n3, int n4, int n5) { +    const int sum = n1 + n2 + n3 + n4 + n5; +    if (IsEven(sum)) { +      return AssertionSuccess(); +    } + +    Message msg; +    msg << e1 << " + " << e2 << " + " << e3 << " + " << e4 << " + " << e5 +        << " (" +        << n1 << " + " << n2 << " + " << n3 << " + " << n4 << " + " << n5 +        << ") evaluates to " << sum << ", which is not even."; +    return AssertionFailure(msg); +  } +}; + + +// Tests unary predicate assertions. + +// Tests unary predicate assertions that don't use a custom formatter. +TEST(Pred1Test, WithoutFormat) { +  // Success cases. +  EXPECT_PRED1(IsEvenFunctor(), 2) << "This failure is UNEXPECTED!"; +  ASSERT_PRED1(IsEven, 4); + +  // Failure cases. +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_PRED1(IsEven, 5) << "This failure is expected."; +  }, "This failure is expected."); +  EXPECT_FATAL_FAILURE(ASSERT_PRED1(IsEvenFunctor(), 5), +                       "evaluates to false"); +} + +// Tests unary predicate assertions that use a custom formatter. +TEST(Pred1Test, WithFormat) { +  // Success cases. +  EXPECT_PRED_FORMAT1(AssertIsEven, 2); +  ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), 4) +    << "This failure is UNEXPECTED!"; + +  // Failure cases. +  const int n = 5; +  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT1(AssertIsEvenFunctor(), n), +                          "n evaluates to 5, which is not even."); +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_PRED_FORMAT1(AssertIsEven, 5) << "This failure is expected."; +  }, "This failure is expected."); +} + +// Tests that unary predicate assertions evaluates their arguments +// exactly once. +TEST(Pred1Test, SingleEvaluationOnFailure) { +  // A success case. +  static int n = 0; +  EXPECT_PRED1(IsEven, n++); +  EXPECT_EQ(1, n) << "The argument is not evaluated exactly once."; + +  // A failure case. +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), n++) +        << "This failure is expected."; +  }, "This failure is expected."); +  EXPECT_EQ(2, n) << "The argument is not evaluated exactly once."; +} + + +// Tests predicate assertions whose arity is >= 2. + +// Tests predicate assertions that don't use a custom formatter. +TEST(PredTest, WithoutFormat) { +  // Success cases. +  ASSERT_PRED2(SumIsEven2, 2, 4) << "This failure is UNEXPECTED!"; +  EXPECT_PRED3(SumIsEven3Functor(), 4, 6, 8); + +  // Failure cases. +  const int n1 = 1; +  const int n2 = 2; +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_PRED2(SumIsEven2, n1, n2) << "This failure is expected."; +  }, "This failure is expected."); +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_PRED3(SumIsEven3Functor(), 1, 2, 4); +  }, "evaluates to false"); +} + +// Tests predicate assertions that use a custom formatter. +TEST(PredTest, WithFormat) { +  // Success cases. +  ASSERT_PRED_FORMAT4(AssertSumIsEven4, 4, 6, 8, 10) << +    "This failure is UNEXPECTED!"; +  EXPECT_PRED_FORMAT5(AssertSumIsEven5Functor(), 2, 4, 6, 8, 10); + +  // Failure cases. +  const int n1 = 1; +  const int n2 = 2; +  const int n3 = 4; +  const int n4 = 6; +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_PRED_FORMAT4(AssertSumIsEven4, n1, n2, n3, n4); +  }, "evaluates to 13, which is not even."); +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(), 1, 2, 4, 6, 8) +        << "This failure is expected."; +  }, "This failure is expected."); +} + +// Tests that predicate assertions evaluates their arguments +// exactly once. +TEST(PredTest, SingleEvaluationOnFailure) { +  // A success case. +  int n1 = 0; +  int n2 = 0; +  EXPECT_PRED2(SumIsEven2, n1++, n2++); +  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once."; +  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once."; + +  // Another success case. +  n1 = n2 = 0; +  int n3 = 0; +  int n4 = 0; +  int n5 = 0; +  ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(), +                      n1++, n2++, n3++, n4++, n5++) +                        << "This failure is UNEXPECTED!"; +  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once."; +  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once."; +  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once."; +  EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once."; +  EXPECT_EQ(1, n5) << "Argument 5 is not evaluated exactly once."; + +  // A failure case. +  n1 = n2 = n3 = 0; +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_PRED3(SumIsEven3Functor(), ++n1, n2++, n3++) +        << "This failure is expected."; +  }, "This failure is expected."); +  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once."; +  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once."; +  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once."; + +  // Another failure case. +  n1 = n2 = n3 = n4 = 0; +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_PRED_FORMAT4(AssertSumIsEven4, ++n1, n2++, n3++, n4++); +  }, "evaluates to 1, which is not even."); +  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once."; +  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once."; +  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once."; +  EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once."; +} + + +// Some helper functions for testing using overloaded/template +// functions with ASSERT_PREDn and EXPECT_PREDn. + +bool IsPositive(double x) { +  return x > 0; +} + +template <typename T> +bool IsNegative(T x) { +  return x < 0; +} + +template <typename T1, typename T2> +bool GreaterThan(T1 x1, T2 x2) { +  return x1 > x2; +} + +// Tests that overloaded functions can be used in *_PRED* as long as +// their types are explicitly specified. +TEST(PredicateAssertionTest, AcceptsOverloadedFunction) { +  // C++Builder requires C-style casts rather than static_cast. +  EXPECT_PRED1((bool (*)(int))(IsPositive), 5);  // NOLINT +  ASSERT_PRED1((bool (*)(double))(IsPositive), 6.0);  // NOLINT +} + +// Tests that template functions can be used in *_PRED* as long as +// their types are explicitly specified. +TEST(PredicateAssertionTest, AcceptsTemplateFunction) { +  EXPECT_PRED1(IsNegative<int>, -5); +  // Makes sure that we can handle templates with more than one +  // parameter. +  ASSERT_PRED2((GreaterThan<int, int>), 5, 0); +} + + +// Some helper functions for testing using overloaded/template +// functions with ASSERT_PRED_FORMATn and EXPECT_PRED_FORMATn. + +AssertionResult IsPositiveFormat(const char* /* expr */, int n) { +  return n > 0 ? AssertionSuccess() : +      AssertionFailure(Message() << "Failure"); +} + +AssertionResult IsPositiveFormat(const char* /* expr */, double x) { +  return x > 0 ? AssertionSuccess() : +      AssertionFailure(Message() << "Failure"); +} + +template <typename T> +AssertionResult IsNegativeFormat(const char* /* expr */, T x) { +  return x < 0 ? AssertionSuccess() : +      AssertionFailure(Message() << "Failure"); +} + +template <typename T1, typename T2> +AssertionResult EqualsFormat(const char* /* expr1 */, const char* /* expr2 */, +                             const T1& x1, const T2& x2) { +  return x1 == x2 ? AssertionSuccess() : +      AssertionFailure(Message() << "Failure"); +} + +// Tests that overloaded functions can be used in *_PRED_FORMAT* +// without explicitly specifying their types. +TEST(PredicateFormatAssertionTest, AcceptsOverloadedFunction) { +  EXPECT_PRED_FORMAT1(IsPositiveFormat, 5); +  ASSERT_PRED_FORMAT1(IsPositiveFormat, 6.0); +} + +// Tests that template functions can be used in *_PRED_FORMAT* without +// explicitly specifying their types. +TEST(PredicateFormatAssertionTest, AcceptsTemplateFunction) { +  EXPECT_PRED_FORMAT1(IsNegativeFormat, -5); +  ASSERT_PRED_FORMAT2(EqualsFormat, 3, 3); +} + + +// Tests string assertions. + +// Tests ASSERT_STREQ with non-NULL arguments. +TEST(StringAssertionTest, ASSERT_STREQ) { +  const char * const p1 = "good"; +  ASSERT_STREQ(p1, p1); + +  // Let p2 have the same content as p1, but be at a different address. +  const char p2[] = "good"; +  ASSERT_STREQ(p1, p2); + +  EXPECT_FATAL_FAILURE(ASSERT_STREQ("bad", "good"), +                       "  \"bad\"\n  \"good\""); +} + +// Tests ASSERT_STREQ with NULL arguments. +TEST(StringAssertionTest, ASSERT_STREQ_Null) { +  ASSERT_STREQ(static_cast<const char *>(NULL), NULL); +  EXPECT_FATAL_FAILURE(ASSERT_STREQ(NULL, "non-null"), +                       "non-null"); +} + +// Tests ASSERT_STREQ with NULL arguments. +TEST(StringAssertionTest, ASSERT_STREQ_Null2) { +  EXPECT_FATAL_FAILURE(ASSERT_STREQ("non-null", NULL), +                       "non-null"); +} + +// Tests ASSERT_STRNE. +TEST(StringAssertionTest, ASSERT_STRNE) { +  ASSERT_STRNE("hi", "Hi"); +  ASSERT_STRNE("Hi", NULL); +  ASSERT_STRNE(NULL, "Hi"); +  ASSERT_STRNE("", NULL); +  ASSERT_STRNE(NULL, ""); +  ASSERT_STRNE("", "Hi"); +  ASSERT_STRNE("Hi", ""); +  EXPECT_FATAL_FAILURE(ASSERT_STRNE("Hi", "Hi"), +                       "\"Hi\" vs \"Hi\""); +} + +// Tests ASSERT_STRCASEEQ. +TEST(StringAssertionTest, ASSERT_STRCASEEQ) { +  ASSERT_STRCASEEQ("hi", "Hi"); +  ASSERT_STRCASEEQ(static_cast<const char *>(NULL), NULL); + +  ASSERT_STRCASEEQ("", ""); +  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("Hi", "hi2"), +                       "Ignoring case"); +} + +// Tests ASSERT_STRCASENE. +TEST(StringAssertionTest, ASSERT_STRCASENE) { +  ASSERT_STRCASENE("hi1", "Hi2"); +  ASSERT_STRCASENE("Hi", NULL); +  ASSERT_STRCASENE(NULL, "Hi"); +  ASSERT_STRCASENE("", NULL); +  ASSERT_STRCASENE(NULL, ""); +  ASSERT_STRCASENE("", "Hi"); +  ASSERT_STRCASENE("Hi", ""); +  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("Hi", "hi"), +                       "(ignoring case)"); +} + +// Tests *_STREQ on wide strings. +TEST(StringAssertionTest, STREQ_Wide) { +  // NULL strings. +  ASSERT_STREQ(static_cast<const wchar_t *>(NULL), NULL); + +  // Empty strings. +  ASSERT_STREQ(L"", L""); + +  // Non-null vs NULL. +  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"non-null", NULL), +                          "non-null"); + +  // Equal strings. +  EXPECT_STREQ(L"Hi", L"Hi"); + +  // Unequal strings. +  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc", L"Abc"), +                          "Abc"); + +  // Strings containing wide characters. +  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc\x8119", L"abc\x8120"), +                          "abc"); + +  // The streaming variation. +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_STREQ(L"abc\x8119", L"abc\x8121") << "Expected failure"; +  }, "Expected failure"); +} + +// Tests *_STRNE on wide strings. +TEST(StringAssertionTest, STRNE_Wide) { +  // NULL strings. +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_STRNE(static_cast<const wchar_t *>(NULL), NULL); +  }, ""); + +  // Empty strings. +  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"", L""), +                          "L\"\""); + +  // Non-null vs NULL. +  ASSERT_STRNE(L"non-null", NULL); + +  // Equal strings. +  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"Hi", L"Hi"), +                          "L\"Hi\""); + +  // Unequal strings. +  EXPECT_STRNE(L"abc", L"Abc"); + +  // Strings containing wide characters. +  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"abc\x8119", L"abc\x8119"), +                          "abc"); + +  // The streaming variation. +  ASSERT_STRNE(L"abc\x8119", L"abc\x8120") << "This shouldn't happen"; +} + +// Tests for ::testing::IsSubstring(). + +// Tests that IsSubstring() returns the correct result when the input +// argument type is const char*. +TEST(IsSubstringTest, ReturnsCorrectResultForCString) { +  EXPECT_FALSE(IsSubstring("", "", NULL, "a")); +  EXPECT_FALSE(IsSubstring("", "", "b", NULL)); +  EXPECT_FALSE(IsSubstring("", "", "needle", "haystack")); + +  EXPECT_TRUE(IsSubstring("", "", static_cast<const char*>(NULL), NULL)); +  EXPECT_TRUE(IsSubstring("", "", "needle", "two needles")); +} + +// Tests that IsSubstring() returns the correct result when the input +// argument type is const wchar_t*. +TEST(IsSubstringTest, ReturnsCorrectResultForWideCString) { +  EXPECT_FALSE(IsSubstring("", "", kNull, L"a")); +  EXPECT_FALSE(IsSubstring("", "", L"b", kNull)); +  EXPECT_FALSE(IsSubstring("", "", L"needle", L"haystack")); + +  EXPECT_TRUE(IsSubstring("", "", static_cast<const wchar_t*>(NULL), NULL)); +  EXPECT_TRUE(IsSubstring("", "", L"needle", L"two needles")); +} + +// Tests that IsSubstring() generates the correct message when the input +// argument type is const char*. +TEST(IsSubstringTest, GeneratesCorrectMessageForCString) { +  EXPECT_STREQ("Value of: needle_expr\n" +               "  Actual: \"needle\"\n" +               "Expected: a substring of haystack_expr\n" +               "Which is: \"haystack\"", +               IsSubstring("needle_expr", "haystack_expr", +                           "needle", "haystack").failure_message()); +} + +// Tests that IsSubstring returns the correct result when the input +// argument type is ::std::string. +TEST(IsSubstringTest, ReturnsCorrectResultsForStdString) { +  EXPECT_TRUE(IsSubstring("", "", std::string("hello"), "ahellob")); +  EXPECT_FALSE(IsSubstring("", "", "hello", std::string("world"))); +} + +#if GTEST_HAS_STD_WSTRING +// Tests that IsSubstring returns the correct result when the input +// argument type is ::std::wstring. +TEST(IsSubstringTest, ReturnsCorrectResultForStdWstring) { +  EXPECT_TRUE(IsSubstring("", "", ::std::wstring(L"needle"), L"two needles")); +  EXPECT_FALSE(IsSubstring("", "", L"needle", ::std::wstring(L"haystack"))); +} + +// Tests that IsSubstring() generates the correct message when the input +// argument type is ::std::wstring. +TEST(IsSubstringTest, GeneratesCorrectMessageForWstring) { +  EXPECT_STREQ("Value of: needle_expr\n" +               "  Actual: L\"needle\"\n" +               "Expected: a substring of haystack_expr\n" +               "Which is: L\"haystack\"", +               IsSubstring( +                   "needle_expr", "haystack_expr", +                   ::std::wstring(L"needle"), L"haystack").failure_message()); +} + +#endif  // GTEST_HAS_STD_WSTRING + +// Tests for ::testing::IsNotSubstring(). + +// Tests that IsNotSubstring() returns the correct result when the input +// argument type is const char*. +TEST(IsNotSubstringTest, ReturnsCorrectResultForCString) { +  EXPECT_TRUE(IsNotSubstring("", "", "needle", "haystack")); +  EXPECT_FALSE(IsNotSubstring("", "", "needle", "two needles")); +} + +// Tests that IsNotSubstring() returns the correct result when the input +// argument type is const wchar_t*. +TEST(IsNotSubstringTest, ReturnsCorrectResultForWideCString) { +  EXPECT_TRUE(IsNotSubstring("", "", L"needle", L"haystack")); +  EXPECT_FALSE(IsNotSubstring("", "", L"needle", L"two needles")); +} + +// Tests that IsNotSubstring() generates the correct message when the input +// argument type is const wchar_t*. +TEST(IsNotSubstringTest, GeneratesCorrectMessageForWideCString) { +  EXPECT_STREQ("Value of: needle_expr\n" +               "  Actual: L\"needle\"\n" +               "Expected: not a substring of haystack_expr\n" +               "Which is: L\"two needles\"", +               IsNotSubstring( +                   "needle_expr", "haystack_expr", +                   L"needle", L"two needles").failure_message()); +} + +// Tests that IsNotSubstring returns the correct result when the input +// argument type is ::std::string. +TEST(IsNotSubstringTest, ReturnsCorrectResultsForStdString) { +  EXPECT_FALSE(IsNotSubstring("", "", std::string("hello"), "ahellob")); +  EXPECT_TRUE(IsNotSubstring("", "", "hello", std::string("world"))); +} + +// Tests that IsNotSubstring() generates the correct message when the input +// argument type is ::std::string. +TEST(IsNotSubstringTest, GeneratesCorrectMessageForStdString) { +  EXPECT_STREQ("Value of: needle_expr\n" +               "  Actual: \"needle\"\n" +               "Expected: not a substring of haystack_expr\n" +               "Which is: \"two needles\"", +               IsNotSubstring( +                   "needle_expr", "haystack_expr", +                   ::std::string("needle"), "two needles").failure_message()); +} + +#if GTEST_HAS_STD_WSTRING + +// Tests that IsNotSubstring returns the correct result when the input +// argument type is ::std::wstring. +TEST(IsNotSubstringTest, ReturnsCorrectResultForStdWstring) { +  EXPECT_FALSE( +      IsNotSubstring("", "", ::std::wstring(L"needle"), L"two needles")); +  EXPECT_TRUE(IsNotSubstring("", "", L"needle", ::std::wstring(L"haystack"))); +} + +#endif  // GTEST_HAS_STD_WSTRING + +// Tests floating-point assertions. + +template <typename RawType> +class FloatingPointTest : public Test { + protected: +  // Pre-calculated numbers to be used by the tests. +  struct TestValues { +    RawType close_to_positive_zero; +    RawType close_to_negative_zero; +    RawType further_from_negative_zero; + +    RawType close_to_one; +    RawType further_from_one; + +    RawType infinity; +    RawType close_to_infinity; +    RawType further_from_infinity; + +    RawType nan1; +    RawType nan2; +  }; + +  typedef typename testing::internal::FloatingPoint<RawType> Floating; +  typedef typename Floating::Bits Bits; + +  virtual void SetUp() { +    const size_t max_ulps = Floating::kMaxUlps; + +    // The bits that represent 0.0. +    const Bits zero_bits = Floating(0).bits(); + +    // Makes some numbers close to 0.0. +    values_.close_to_positive_zero = Floating::ReinterpretBits( +        zero_bits + max_ulps/2); +    values_.close_to_negative_zero = -Floating::ReinterpretBits( +        zero_bits + max_ulps - max_ulps/2); +    values_.further_from_negative_zero = -Floating::ReinterpretBits( +        zero_bits + max_ulps + 1 - max_ulps/2); + +    // The bits that represent 1.0. +    const Bits one_bits = Floating(1).bits(); + +    // Makes some numbers close to 1.0. +    values_.close_to_one = Floating::ReinterpretBits(one_bits + max_ulps); +    values_.further_from_one = Floating::ReinterpretBits( +        one_bits + max_ulps + 1); + +    // +infinity. +    values_.infinity = Floating::Infinity(); + +    // The bits that represent +infinity. +    const Bits infinity_bits = Floating(values_.infinity).bits(); + +    // Makes some numbers close to infinity. +    values_.close_to_infinity = Floating::ReinterpretBits( +        infinity_bits - max_ulps); +    values_.further_from_infinity = Floating::ReinterpretBits( +        infinity_bits - max_ulps - 1); + +    // Makes some NAN's.  Sets the most significant bit of the fraction so that +    // our NaN's are quiet; trying to process a signaling NaN would raise an +    // exception if our environment enables floating point exceptions. +    values_.nan1 = Floating::ReinterpretBits(Floating::kExponentBitMask +        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 1); +    values_.nan2 = Floating::ReinterpretBits(Floating::kExponentBitMask +        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 200); +  } + +  void TestSize() { +    EXPECT_EQ(sizeof(RawType), sizeof(Bits)); +  } + +  static TestValues values_; +}; + +template <typename RawType> +typename FloatingPointTest<RawType>::TestValues +    FloatingPointTest<RawType>::values_; + +// Instantiates FloatingPointTest for testing *_FLOAT_EQ. +typedef FloatingPointTest<float> FloatTest; + +// Tests that the size of Float::Bits matches the size of float. +TEST_F(FloatTest, Size) { +  TestSize(); +} + +// Tests comparing with +0 and -0. +TEST_F(FloatTest, Zeros) { +  EXPECT_FLOAT_EQ(0.0, -0.0); +  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(-0.0, 1.0), +                          "1.0"); +  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.5), +                       "1.5"); +} + +// Tests comparing numbers close to 0. +// +// This ensures that *_FLOAT_EQ handles the sign correctly and no +// overflow occurs when comparing numbers whose absolute value is very +// small. +TEST_F(FloatTest, AlmostZeros) { +  // In C++Builder, names within local classes (such as used by +  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the +  // scoping class.  Use a static local alias as a workaround. +  // We use the assignment syntax since some compilers, like Sun Studio, +  // don't allow initializing references using construction syntax +  // (parentheses). +  static const FloatTest::TestValues& v = this->values_; + +  EXPECT_FLOAT_EQ(0.0, v.close_to_positive_zero); +  EXPECT_FLOAT_EQ(-0.0, v.close_to_negative_zero); +  EXPECT_FLOAT_EQ(v.close_to_positive_zero, v.close_to_negative_zero); + +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_FLOAT_EQ(v.close_to_positive_zero, +                    v.further_from_negative_zero); +  }, "v.further_from_negative_zero"); +} + +// Tests comparing numbers close to each other. +TEST_F(FloatTest, SmallDiff) { +  EXPECT_FLOAT_EQ(1.0, values_.close_to_one); +  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, values_.further_from_one), +                          "values_.further_from_one"); +} + +// Tests comparing numbers far apart. +TEST_F(FloatTest, LargeDiff) { +  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(2.5, 3.0), +                          "3.0"); +} + +// Tests comparing with infinity. +// +// This ensures that no overflow occurs when comparing numbers whose +// absolute value is very large. +TEST_F(FloatTest, Infinity) { +  EXPECT_FLOAT_EQ(values_.infinity, values_.close_to_infinity); +  EXPECT_FLOAT_EQ(-values_.infinity, -values_.close_to_infinity); +#if !GTEST_OS_SYMBIAN +  // Nokia's STLport crashes if we try to output infinity or NaN. +  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, -values_.infinity), +                          "-values_.infinity"); + +  // This is interesting as the representations of infinity and nan1 +  // are only 1 DLP apart. +  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, values_.nan1), +                          "values_.nan1"); +#endif  // !GTEST_OS_SYMBIAN +} + +// Tests that comparing with NAN always returns false. +TEST_F(FloatTest, NaN) { +#if !GTEST_OS_SYMBIAN +// Nokia's STLport crashes if we try to output infinity or NaN. + +  // In C++Builder, names within local classes (such as used by +  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the +  // scoping class.  Use a static local alias as a workaround. +  // We use the assignment syntax since some compilers, like Sun Studio, +  // don't allow initializing references using construction syntax +  // (parentheses). +  static const FloatTest::TestValues& v = this->values_; + +  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan1), +                          "v.nan1"); +  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan2), +                          "v.nan2"); +  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, v.nan1), +                          "v.nan1"); + +  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(v.nan1, v.infinity), +                       "v.infinity"); +#endif  // !GTEST_OS_SYMBIAN +} + +// Tests that *_FLOAT_EQ are reflexive. +TEST_F(FloatTest, Reflexive) { +  EXPECT_FLOAT_EQ(0.0, 0.0); +  EXPECT_FLOAT_EQ(1.0, 1.0); +  ASSERT_FLOAT_EQ(values_.infinity, values_.infinity); +} + +// Tests that *_FLOAT_EQ are commutative. +TEST_F(FloatTest, Commutative) { +  // We already tested EXPECT_FLOAT_EQ(1.0, values_.close_to_one). +  EXPECT_FLOAT_EQ(values_.close_to_one, 1.0); + +  // We already tested EXPECT_FLOAT_EQ(1.0, values_.further_from_one). +  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.further_from_one, 1.0), +                          "1.0"); +} + +// Tests EXPECT_NEAR. +TEST_F(FloatTest, EXPECT_NEAR) { +  EXPECT_NEAR(-1.0f, -1.1f, 0.2f); +  EXPECT_NEAR(2.0f, 3.0f, 1.0f); +  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT +                          "The difference between 1.0f and 1.5f is 0.5, " +                          "which exceeds 0.25f"); +  // To work around a bug in gcc 2.95.0, there is intentionally no +  // space after the first comma in the previous line. +} + +// Tests ASSERT_NEAR. +TEST_F(FloatTest, ASSERT_NEAR) { +  ASSERT_NEAR(-1.0f, -1.1f, 0.2f); +  ASSERT_NEAR(2.0f, 3.0f, 1.0f); +  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT +                       "The difference between 1.0f and 1.5f is 0.5, " +                       "which exceeds 0.25f"); +  // To work around a bug in gcc 2.95.0, there is intentionally no +  // space after the first comma in the previous line. +} + +// Tests the cases where FloatLE() should succeed. +TEST_F(FloatTest, FloatLESucceeds) { +  EXPECT_PRED_FORMAT2(FloatLE, 1.0f, 2.0f);  // When val1 < val2, +  ASSERT_PRED_FORMAT2(FloatLE, 1.0f, 1.0f);  // val1 == val2, + +  // or when val1 is greater than, but almost equals to, val2. +  EXPECT_PRED_FORMAT2(FloatLE, values_.close_to_positive_zero, 0.0f); +} + +// Tests the cases where FloatLE() should fail. +TEST_F(FloatTest, FloatLEFails) { +  // When val1 is greater than val2 by a large margin, +  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(FloatLE, 2.0f, 1.0f), +                          "(2.0f) <= (1.0f)"); + +  // or by a small yet non-negligible margin, +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_PRED_FORMAT2(FloatLE, values_.further_from_one, 1.0f); +  }, "(values_.further_from_one) <= (1.0f)"); + +#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__) +  // Nokia's STLport crashes if we try to output infinity or NaN. +  // C++Builder gives bad results for ordered comparisons involving NaNs +  // due to compiler bugs. +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_PRED_FORMAT2(FloatLE, values_.nan1, values_.infinity); +  }, "(values_.nan1) <= (values_.infinity)"); +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_PRED_FORMAT2(FloatLE, -values_.infinity, values_.nan1); +  }, "(-values_.infinity) <= (values_.nan1)"); +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_PRED_FORMAT2(FloatLE, values_.nan1, values_.nan1); +  }, "(values_.nan1) <= (values_.nan1)"); +#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__) +} + +// Instantiates FloatingPointTest for testing *_DOUBLE_EQ. +typedef FloatingPointTest<double> DoubleTest; + +// Tests that the size of Double::Bits matches the size of double. +TEST_F(DoubleTest, Size) { +  TestSize(); +} + +// Tests comparing with +0 and -0. +TEST_F(DoubleTest, Zeros) { +  EXPECT_DOUBLE_EQ(0.0, -0.0); +  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(-0.0, 1.0), +                          "1.0"); +  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(0.0, 1.0), +                       "1.0"); +} + +// Tests comparing numbers close to 0. +// +// This ensures that *_DOUBLE_EQ handles the sign correctly and no +// overflow occurs when comparing numbers whose absolute value is very +// small. +TEST_F(DoubleTest, AlmostZeros) { +  // In C++Builder, names within local classes (such as used by +  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the +  // scoping class.  Use a static local alias as a workaround. +  // We use the assignment syntax since some compilers, like Sun Studio, +  // don't allow initializing references using construction syntax +  // (parentheses). +  static const DoubleTest::TestValues& v = this->values_; + +  EXPECT_DOUBLE_EQ(0.0, v.close_to_positive_zero); +  EXPECT_DOUBLE_EQ(-0.0, v.close_to_negative_zero); +  EXPECT_DOUBLE_EQ(v.close_to_positive_zero, v.close_to_negative_zero); + +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_DOUBLE_EQ(v.close_to_positive_zero, +                     v.further_from_negative_zero); +  }, "v.further_from_negative_zero"); +} + +// Tests comparing numbers close to each other. +TEST_F(DoubleTest, SmallDiff) { +  EXPECT_DOUBLE_EQ(1.0, values_.close_to_one); +  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, values_.further_from_one), +                          "values_.further_from_one"); +} + +// Tests comparing numbers far apart. +TEST_F(DoubleTest, LargeDiff) { +  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(2.0, 3.0), +                          "3.0"); +} + +// Tests comparing with infinity. +// +// This ensures that no overflow occurs when comparing numbers whose +// absolute value is very large. +TEST_F(DoubleTest, Infinity) { +  EXPECT_DOUBLE_EQ(values_.infinity, values_.close_to_infinity); +  EXPECT_DOUBLE_EQ(-values_.infinity, -values_.close_to_infinity); +#if !GTEST_OS_SYMBIAN +  // Nokia's STLport crashes if we try to output infinity or NaN. +  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, -values_.infinity), +                          "-values_.infinity"); + +  // This is interesting as the representations of infinity_ and nan1_ +  // are only 1 DLP apart. +  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, values_.nan1), +                          "values_.nan1"); +#endif  // !GTEST_OS_SYMBIAN +} + +// Tests that comparing with NAN always returns false. +TEST_F(DoubleTest, NaN) { +#if !GTEST_OS_SYMBIAN +  // In C++Builder, names within local classes (such as used by +  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the +  // scoping class.  Use a static local alias as a workaround. +  // We use the assignment syntax since some compilers, like Sun Studio, +  // don't allow initializing references using construction syntax +  // (parentheses). +  static const DoubleTest::TestValues& v = this->values_; + +  // Nokia's STLport crashes if we try to output infinity or NaN. +  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan1), +                          "v.nan1"); +  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan2), "v.nan2"); +  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, v.nan1), "v.nan1"); +  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(v.nan1, v.infinity), +                       "v.infinity"); +#endif  // !GTEST_OS_SYMBIAN +} + +// Tests that *_DOUBLE_EQ are reflexive. +TEST_F(DoubleTest, Reflexive) { +  EXPECT_DOUBLE_EQ(0.0, 0.0); +  EXPECT_DOUBLE_EQ(1.0, 1.0); +#if !GTEST_OS_SYMBIAN +  // Nokia's STLport crashes if we try to output infinity or NaN. +  ASSERT_DOUBLE_EQ(values_.infinity, values_.infinity); +#endif  // !GTEST_OS_SYMBIAN +} + +// Tests that *_DOUBLE_EQ are commutative. +TEST_F(DoubleTest, Commutative) { +  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.close_to_one). +  EXPECT_DOUBLE_EQ(values_.close_to_one, 1.0); + +  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.further_from_one). +  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.further_from_one, 1.0), +                          "1.0"); +} + +// Tests EXPECT_NEAR. +TEST_F(DoubleTest, EXPECT_NEAR) { +  EXPECT_NEAR(-1.0, -1.1, 0.2); +  EXPECT_NEAR(2.0, 3.0, 1.0); +  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0, 1.5, 0.25),  // NOLINT +                          "The difference between 1.0 and 1.5 is 0.5, " +                          "which exceeds 0.25"); +  // To work around a bug in gcc 2.95.0, there is intentionally no +  // space after the first comma in the previous statement. +} + +// Tests ASSERT_NEAR. +TEST_F(DoubleTest, ASSERT_NEAR) { +  ASSERT_NEAR(-1.0, -1.1, 0.2); +  ASSERT_NEAR(2.0, 3.0, 1.0); +  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0, 1.5, 0.25),  // NOLINT +                       "The difference between 1.0 and 1.5 is 0.5, " +                       "which exceeds 0.25"); +  // To work around a bug in gcc 2.95.0, there is intentionally no +  // space after the first comma in the previous statement. +} + +// Tests the cases where DoubleLE() should succeed. +TEST_F(DoubleTest, DoubleLESucceeds) { +  EXPECT_PRED_FORMAT2(DoubleLE, 1.0, 2.0);  // When val1 < val2, +  ASSERT_PRED_FORMAT2(DoubleLE, 1.0, 1.0);  // val1 == val2, + +  // or when val1 is greater than, but almost equals to, val2. +  EXPECT_PRED_FORMAT2(DoubleLE, values_.close_to_positive_zero, 0.0); +} + +// Tests the cases where DoubleLE() should fail. +TEST_F(DoubleTest, DoubleLEFails) { +  // When val1 is greater than val2 by a large margin, +  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(DoubleLE, 2.0, 1.0), +                          "(2.0) <= (1.0)"); + +  // or by a small yet non-negligible margin, +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_PRED_FORMAT2(DoubleLE, values_.further_from_one, 1.0); +  }, "(values_.further_from_one) <= (1.0)"); + +#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__) +  // Nokia's STLport crashes if we try to output infinity or NaN. +  // C++Builder gives bad results for ordered comparisons involving NaNs +  // due to compiler bugs. +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.infinity); +  }, "(values_.nan1) <= (values_.infinity)"); +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_PRED_FORMAT2(DoubleLE, -values_.infinity, values_.nan1); +  }, " (-values_.infinity) <= (values_.nan1)"); +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.nan1); +  }, "(values_.nan1) <= (values_.nan1)"); +#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__) +} + + +// Verifies that a test or test case whose name starts with DISABLED_ is +// not run. + +// A test whose name starts with DISABLED_. +// Should not run. +TEST(DisabledTest, DISABLED_TestShouldNotRun) { +  FAIL() << "Unexpected failure: Disabled test should not be run."; +} + +// A test whose name does not start with DISABLED_. +// Should run. +TEST(DisabledTest, NotDISABLED_TestShouldRun) { +  EXPECT_EQ(1, 1); +} + +// A test case whose name starts with DISABLED_. +// Should not run. +TEST(DISABLED_TestCase, TestShouldNotRun) { +  FAIL() << "Unexpected failure: Test in disabled test case should not be run."; +} + +// A test case and test whose names start with DISABLED_. +// Should not run. +TEST(DISABLED_TestCase, DISABLED_TestShouldNotRun) { +  FAIL() << "Unexpected failure: Test in disabled test case should not be run."; +} + +// Check that when all tests in a test case are disabled, SetUpTestCase() and +// TearDownTestCase() are not called. +class DisabledTestsTest : public Test { + protected: +  static void SetUpTestCase() { +    FAIL() << "Unexpected failure: All tests disabled in test case. " +              "SetUpTestCase() should not be called."; +  } + +  static void TearDownTestCase() { +    FAIL() << "Unexpected failure: All tests disabled in test case. " +              "TearDownTestCase() should not be called."; +  } +}; + +TEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_1) { +  FAIL() << "Unexpected failure: Disabled test should not be run."; +} + +TEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_2) { +  FAIL() << "Unexpected failure: Disabled test should not be run."; +} + +// Tests that disabled typed tests aren't run. + +#if GTEST_HAS_TYPED_TEST + +template <typename T> +class TypedTest : public Test { +}; + +typedef testing::Types<int, double> NumericTypes; +TYPED_TEST_CASE(TypedTest, NumericTypes); + +TYPED_TEST(TypedTest, DISABLED_ShouldNotRun) { +  FAIL() << "Unexpected failure: Disabled typed test should not run."; +} + +template <typename T> +class DISABLED_TypedTest : public Test { +}; + +TYPED_TEST_CASE(DISABLED_TypedTest, NumericTypes); + +TYPED_TEST(DISABLED_TypedTest, ShouldNotRun) { +  FAIL() << "Unexpected failure: Disabled typed test should not run."; +} + +#endif  // GTEST_HAS_TYPED_TEST + +// Tests that disabled type-parameterized tests aren't run. + +#if GTEST_HAS_TYPED_TEST_P + +template <typename T> +class TypedTestP : public Test { +}; + +TYPED_TEST_CASE_P(TypedTestP); + +TYPED_TEST_P(TypedTestP, DISABLED_ShouldNotRun) { +  FAIL() << "Unexpected failure: " +         << "Disabled type-parameterized test should not run."; +} + +REGISTER_TYPED_TEST_CASE_P(TypedTestP, DISABLED_ShouldNotRun); + +INSTANTIATE_TYPED_TEST_CASE_P(My, TypedTestP, NumericTypes); + +template <typename T> +class DISABLED_TypedTestP : public Test { +}; + +TYPED_TEST_CASE_P(DISABLED_TypedTestP); + +TYPED_TEST_P(DISABLED_TypedTestP, ShouldNotRun) { +  FAIL() << "Unexpected failure: " +         << "Disabled type-parameterized test should not run."; +} + +REGISTER_TYPED_TEST_CASE_P(DISABLED_TypedTestP, ShouldNotRun); + +INSTANTIATE_TYPED_TEST_CASE_P(My, DISABLED_TypedTestP, NumericTypes); + +#endif  // GTEST_HAS_TYPED_TEST_P + +// Tests that assertion macros evaluate their arguments exactly once. + +class SingleEvaluationTest : public Test { + public:  // Must be public and not protected due to a bug in g++ 3.4.2. +  // This helper function is needed by the FailedASSERT_STREQ test +  // below.  It's public to work around C++Builder's bug with scoping local +  // classes. +  static void CompareAndIncrementCharPtrs() { +    ASSERT_STREQ(p1_++, p2_++); +  } + +  // This helper function is needed by the FailedASSERT_NE test below.  It's +  // public to work around C++Builder's bug with scoping local classes. +  static void CompareAndIncrementInts() { +    ASSERT_NE(a_++, b_++); +  } + + protected: +  SingleEvaluationTest() { +    p1_ = s1_; +    p2_ = s2_; +    a_ = 0; +    b_ = 0; +  } + +  static const char* const s1_; +  static const char* const s2_; +  static const char* p1_; +  static const char* p2_; + +  static int a_; +  static int b_; +}; + +const char* const SingleEvaluationTest::s1_ = "01234"; +const char* const SingleEvaluationTest::s2_ = "abcde"; +const char* SingleEvaluationTest::p1_; +const char* SingleEvaluationTest::p2_; +int SingleEvaluationTest::a_; +int SingleEvaluationTest::b_; + +// Tests that when ASSERT_STREQ fails, it evaluates its arguments +// exactly once. +TEST_F(SingleEvaluationTest, FailedASSERT_STREQ) { +  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementCharPtrs(), +                       "p2_++"); +  EXPECT_EQ(s1_ + 1, p1_); +  EXPECT_EQ(s2_ + 1, p2_); +} + +// Tests that string assertion arguments are evaluated exactly once. +TEST_F(SingleEvaluationTest, ASSERT_STR) { +  // successful EXPECT_STRNE +  EXPECT_STRNE(p1_++, p2_++); +  EXPECT_EQ(s1_ + 1, p1_); +  EXPECT_EQ(s2_ + 1, p2_); + +  // failed EXPECT_STRCASEEQ +  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ(p1_++, p2_++), +                          "Ignoring case"); +  EXPECT_EQ(s1_ + 2, p1_); +  EXPECT_EQ(s2_ + 2, p2_); +} + +// Tests that when ASSERT_NE fails, it evaluates its arguments exactly +// once. +TEST_F(SingleEvaluationTest, FailedASSERT_NE) { +  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementInts(), +                       "(a_++) != (b_++)"); +  EXPECT_EQ(1, a_); +  EXPECT_EQ(1, b_); +} + +// Tests that assertion arguments are evaluated exactly once. +TEST_F(SingleEvaluationTest, OtherCases) { +  // successful EXPECT_TRUE +  EXPECT_TRUE(0 == a_++);  // NOLINT +  EXPECT_EQ(1, a_); + +  // failed EXPECT_TRUE +  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(-1 == a_++), "-1 == a_++"); +  EXPECT_EQ(2, a_); + +  // successful EXPECT_GT +  EXPECT_GT(a_++, b_++); +  EXPECT_EQ(3, a_); +  EXPECT_EQ(1, b_); + +  // failed EXPECT_LT +  EXPECT_NONFATAL_FAILURE(EXPECT_LT(a_++, b_++), "(a_++) < (b_++)"); +  EXPECT_EQ(4, a_); +  EXPECT_EQ(2, b_); + +  // successful ASSERT_TRUE +  ASSERT_TRUE(0 < a_++);  // NOLINT +  EXPECT_EQ(5, a_); + +  // successful ASSERT_GT +  ASSERT_GT(a_++, b_++); +  EXPECT_EQ(6, a_); +  EXPECT_EQ(3, b_); +} + +#if GTEST_HAS_EXCEPTIONS + +void ThrowAnInteger() { +  throw 1; +} + +// Tests that assertion arguments are evaluated exactly once. +TEST_F(SingleEvaluationTest, ExceptionTests) { +  // successful EXPECT_THROW +  EXPECT_THROW({  // NOLINT +    a_++; +    ThrowAnInteger(); +  }, int); +  EXPECT_EQ(1, a_); + +  // failed EXPECT_THROW, throws different +  EXPECT_NONFATAL_FAILURE(EXPECT_THROW({  // NOLINT +    a_++; +    ThrowAnInteger(); +  }, bool), "throws a different type"); +  EXPECT_EQ(2, a_); + +  // failed EXPECT_THROW, throws nothing +  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(a_++, bool), "throws nothing"); +  EXPECT_EQ(3, a_); + +  // successful EXPECT_NO_THROW +  EXPECT_NO_THROW(a_++); +  EXPECT_EQ(4, a_); + +  // failed EXPECT_NO_THROW +  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW({  // NOLINT +    a_++; +    ThrowAnInteger(); +  }), "it throws"); +  EXPECT_EQ(5, a_); + +  // successful EXPECT_ANY_THROW +  EXPECT_ANY_THROW({  // NOLINT +    a_++; +    ThrowAnInteger(); +  }); +  EXPECT_EQ(6, a_); + +  // failed EXPECT_ANY_THROW +  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(a_++), "it doesn't"); +  EXPECT_EQ(7, a_); +} + +#endif  // GTEST_HAS_EXCEPTIONS + +// Tests {ASSERT|EXPECT}_NO_FATAL_FAILURE. +class NoFatalFailureTest : public Test { + protected: +  void Succeeds() {} +  void FailsNonFatal() { +    ADD_FAILURE() << "some non-fatal failure"; +  } +  void Fails() { +    FAIL() << "some fatal failure"; +  } + +  void DoAssertNoFatalFailureOnFails() { +    ASSERT_NO_FATAL_FAILURE(Fails()); +    ADD_FAILURE() << "should not reach here."; +  } + +  void DoExpectNoFatalFailureOnFails() { +    EXPECT_NO_FATAL_FAILURE(Fails()); +    ADD_FAILURE() << "other failure"; +  } +}; + +TEST_F(NoFatalFailureTest, NoFailure) { +  EXPECT_NO_FATAL_FAILURE(Succeeds()); +  ASSERT_NO_FATAL_FAILURE(Succeeds()); +} + +TEST_F(NoFatalFailureTest, NonFatalIsNoFailure) { +  EXPECT_NONFATAL_FAILURE( +      EXPECT_NO_FATAL_FAILURE(FailsNonFatal()), +      "some non-fatal failure"); +  EXPECT_NONFATAL_FAILURE( +      ASSERT_NO_FATAL_FAILURE(FailsNonFatal()), +      "some non-fatal failure"); +} + +TEST_F(NoFatalFailureTest, AssertNoFatalFailureOnFatalFailure) { +  TestPartResultArray gtest_failures; +  { +    ScopedFakeTestPartResultReporter gtest_reporter(>est_failures); +    DoAssertNoFatalFailureOnFails(); +  } +  ASSERT_EQ(2, gtest_failures.size()); +  EXPECT_EQ(TestPartResult::kFatalFailure, +            gtest_failures.GetTestPartResult(0).type()); +  EXPECT_EQ(TestPartResult::kFatalFailure, +            gtest_failures.GetTestPartResult(1).type()); +  EXPECT_PRED_FORMAT2(testing::IsSubstring, "some fatal failure", +                      gtest_failures.GetTestPartResult(0).message()); +  EXPECT_PRED_FORMAT2(testing::IsSubstring, "it does", +                      gtest_failures.GetTestPartResult(1).message()); +} + +TEST_F(NoFatalFailureTest, ExpectNoFatalFailureOnFatalFailure) { +  TestPartResultArray gtest_failures; +  { +    ScopedFakeTestPartResultReporter gtest_reporter(>est_failures); +    DoExpectNoFatalFailureOnFails(); +  } +  ASSERT_EQ(3, gtest_failures.size()); +  EXPECT_EQ(TestPartResult::kFatalFailure, +            gtest_failures.GetTestPartResult(0).type()); +  EXPECT_EQ(TestPartResult::kNonFatalFailure, +            gtest_failures.GetTestPartResult(1).type()); +  EXPECT_EQ(TestPartResult::kNonFatalFailure, +            gtest_failures.GetTestPartResult(2).type()); +  EXPECT_PRED_FORMAT2(testing::IsSubstring, "some fatal failure", +                      gtest_failures.GetTestPartResult(0).message()); +  EXPECT_PRED_FORMAT2(testing::IsSubstring, "it does", +                      gtest_failures.GetTestPartResult(1).message()); +  EXPECT_PRED_FORMAT2(testing::IsSubstring, "other failure", +                      gtest_failures.GetTestPartResult(2).message()); +} + +TEST_F(NoFatalFailureTest, MessageIsStreamable) { +  TestPartResultArray gtest_failures; +  { +    ScopedFakeTestPartResultReporter gtest_reporter(>est_failures); +    EXPECT_NO_FATAL_FAILURE(FAIL() << "foo") << "my message"; +  } +  ASSERT_EQ(2, gtest_failures.size()); +  EXPECT_EQ(TestPartResult::kNonFatalFailure, +            gtest_failures.GetTestPartResult(0).type()); +  EXPECT_EQ(TestPartResult::kNonFatalFailure, +            gtest_failures.GetTestPartResult(1).type()); +  EXPECT_PRED_FORMAT2(testing::IsSubstring, "foo", +                      gtest_failures.GetTestPartResult(0).message()); +  EXPECT_PRED_FORMAT2(testing::IsSubstring, "my message", +                      gtest_failures.GetTestPartResult(1).message()); +} + +// Tests non-string assertions. + +std::string EditsToString(const std::vector<EditType>& edits) { +  std::string out; +  for (size_t i = 0; i < edits.size(); ++i) { +    static const char kEdits[] = " +-/"; +    out.append(1, kEdits[edits[i]]); +  } +  return out; +} + +std::vector<size_t> CharsToIndices(const std::string& str) { +  std::vector<size_t> out; +  for (size_t i = 0; i < str.size(); ++i) { +    out.push_back(str[i]); +  } +  return out; +} + +std::vector<std::string> CharsToLines(const std::string& str) { +  std::vector<std::string> out; +  for (size_t i = 0; i < str.size(); ++i) { +    out.push_back(str.substr(i, 1)); +  } +  return out; +} + +TEST(EditDistance, TestCases) { +  struct Case { +    int line; +    const char* left; +    const char* right; +    const char* expected_edits; +    const char* expected_diff; +  }; +  static const Case kCases[] = { +      // No change. +      {__LINE__, "A", "A", " ", ""}, +      {__LINE__, "ABCDE", "ABCDE", "     ", ""}, +      // Simple adds. +      {__LINE__, "X", "XA", " +", "@@ +1,2 @@\n X\n+A\n"}, +      {__LINE__, "X", "XABCD", " ++++", "@@ +1,5 @@\n X\n+A\n+B\n+C\n+D\n"}, +      // Simple removes. +      {__LINE__, "XA", "X", " -", "@@ -1,2 @@\n X\n-A\n"}, +      {__LINE__, "XABCD", "X", " ----", "@@ -1,5 @@\n X\n-A\n-B\n-C\n-D\n"}, +      // Simple replaces. +      {__LINE__, "A", "a", "/", "@@ -1,1 +1,1 @@\n-A\n+a\n"}, +      {__LINE__, "ABCD", "abcd", "////", +       "@@ -1,4 +1,4 @@\n-A\n-B\n-C\n-D\n+a\n+b\n+c\n+d\n"}, +      // Path finding. +      {__LINE__, "ABCDEFGH", "ABXEGH1", "  -/ -  +", +       "@@ -1,8 +1,7 @@\n A\n B\n-C\n-D\n+X\n E\n-F\n G\n H\n+1\n"}, +      {__LINE__, "AAAABCCCC", "ABABCDCDC", "- /   + / ", +       "@@ -1,9 +1,9 @@\n-A\n A\n-A\n+B\n A\n B\n C\n+D\n C\n-C\n+D\n C\n"}, +      {__LINE__, "ABCDE", "BCDCD", "-   +/", +       "@@ -1,5 +1,5 @@\n-A\n B\n C\n D\n-E\n+C\n+D\n"}, +      {__LINE__, "ABCDEFGHIJKL", "BCDCDEFGJKLJK", "- ++     --   ++", +       "@@ -1,4 +1,5 @@\n-A\n B\n+C\n+D\n C\n D\n" +       "@@ -6,7 +7,7 @@\n F\n G\n-H\n-I\n J\n K\n L\n+J\n+K\n"}, +      {}}; +  for (const Case* c = kCases; c->left; ++c) { +    EXPECT_TRUE(c->expected_edits == +                EditsToString(CalculateOptimalEdits(CharsToIndices(c->left), +                                                    CharsToIndices(c->right)))) +        << "Left <" << c->left << "> Right <" << c->right << "> Edits <" +        << EditsToString(CalculateOptimalEdits( +               CharsToIndices(c->left), CharsToIndices(c->right))) << ">"; +    EXPECT_TRUE(c->expected_diff == CreateUnifiedDiff(CharsToLines(c->left), +                                                      CharsToLines(c->right))) +        << "Left <" << c->left << "> Right <" << c->right << "> Diff <" +        << CreateUnifiedDiff(CharsToLines(c->left), CharsToLines(c->right)) +        << ">"; +  } +} + +// Tests EqFailure(), used for implementing *EQ* assertions. +TEST(AssertionTest, EqFailure) { +  const std::string foo_val("5"), bar_val("6"); +  const std::string msg1( +      EqFailure("foo", "bar", foo_val, bar_val, false) +      .failure_message()); +  EXPECT_STREQ( +      "Expected equality of these values:\n" +      "  foo\n" +      "    Which is: 5\n" +      "  bar\n" +      "    Which is: 6", +      msg1.c_str()); + +  const std::string msg2( +      EqFailure("foo", "6", foo_val, bar_val, false) +      .failure_message()); +  EXPECT_STREQ( +      "Expected equality of these values:\n" +      "  foo\n" +      "    Which is: 5\n" +      "  6", +      msg2.c_str()); + +  const std::string msg3( +      EqFailure("5", "bar", foo_val, bar_val, false) +      .failure_message()); +  EXPECT_STREQ( +      "Expected equality of these values:\n" +      "  5\n" +      "  bar\n" +      "    Which is: 6", +      msg3.c_str()); + +  const std::string msg4( +      EqFailure("5", "6", foo_val, bar_val, false).failure_message()); +  EXPECT_STREQ( +      "Expected equality of these values:\n" +      "  5\n" +      "  6", +      msg4.c_str()); + +  const std::string msg5( +      EqFailure("foo", "bar", +                std::string("\"x\""), std::string("\"y\""), +                true).failure_message()); +  EXPECT_STREQ( +      "Expected equality of these values:\n" +      "  foo\n" +      "    Which is: \"x\"\n" +      "  bar\n" +      "    Which is: \"y\"\n" +      "Ignoring case", +      msg5.c_str()); +} + +TEST(AssertionTest, EqFailureWithDiff) { +  const std::string left( +      "1\\n2XXX\\n3\\n5\\n6\\n7\\n8\\n9\\n10\\n11\\n12XXX\\n13\\n14\\n15"); +  const std::string right( +      "1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n11\\n12\\n13\\n14"); +  const std::string msg1( +      EqFailure("left", "right", left, right, false).failure_message()); +  EXPECT_STREQ( +      "Expected equality of these values:\n" +      "  left\n" +      "    Which is: " +      "1\\n2XXX\\n3\\n5\\n6\\n7\\n8\\n9\\n10\\n11\\n12XXX\\n13\\n14\\n15\n" +      "  right\n" +      "    Which is: 1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n11\\n12\\n13\\n14\n" +      "With diff:\n@@ -1,5 +1,6 @@\n 1\n-2XXX\n+2\n 3\n+4\n 5\n 6\n" +      "@@ -7,8 +8,6 @@\n 8\n 9\n-10\n 11\n-12XXX\n+12\n 13\n 14\n-15\n", +      msg1.c_str()); +} + +// Tests AppendUserMessage(), used for implementing the *EQ* macros. +TEST(AssertionTest, AppendUserMessage) { +  const std::string foo("foo"); + +  Message msg; +  EXPECT_STREQ("foo", +               AppendUserMessage(foo, msg).c_str()); + +  msg << "bar"; +  EXPECT_STREQ("foo\nbar", +               AppendUserMessage(foo, msg).c_str()); +} + +#ifdef __BORLANDC__ +// Silences warnings: "Condition is always true", "Unreachable code" +# pragma option push -w-ccc -w-rch +#endif + +// Tests ASSERT_TRUE. +TEST(AssertionTest, ASSERT_TRUE) { +  ASSERT_TRUE(2 > 1);  // NOLINT +  EXPECT_FATAL_FAILURE(ASSERT_TRUE(2 < 1), +                       "2 < 1"); +} + +// Tests ASSERT_TRUE(predicate) for predicates returning AssertionResult. +TEST(AssertionTest, AssertTrueWithAssertionResult) { +  ASSERT_TRUE(ResultIsEven(2)); +#ifndef __BORLANDC__ +  // ICE's in C++Builder. +  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEven(3)), +                       "Value of: ResultIsEven(3)\n" +                       "  Actual: false (3 is odd)\n" +                       "Expected: true"); +#endif +  ASSERT_TRUE(ResultIsEvenNoExplanation(2)); +  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEvenNoExplanation(3)), +                       "Value of: ResultIsEvenNoExplanation(3)\n" +                       "  Actual: false (3 is odd)\n" +                       "Expected: true"); +} + +// Tests ASSERT_FALSE. +TEST(AssertionTest, ASSERT_FALSE) { +  ASSERT_FALSE(2 < 1);  // NOLINT +  EXPECT_FATAL_FAILURE(ASSERT_FALSE(2 > 1), +                       "Value of: 2 > 1\n" +                       "  Actual: true\n" +                       "Expected: false"); +} + +// Tests ASSERT_FALSE(predicate) for predicates returning AssertionResult. +TEST(AssertionTest, AssertFalseWithAssertionResult) { +  ASSERT_FALSE(ResultIsEven(3)); +#ifndef __BORLANDC__ +  // ICE's in C++Builder. +  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEven(2)), +                       "Value of: ResultIsEven(2)\n" +                       "  Actual: true (2 is even)\n" +                       "Expected: false"); +#endif +  ASSERT_FALSE(ResultIsEvenNoExplanation(3)); +  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEvenNoExplanation(2)), +                       "Value of: ResultIsEvenNoExplanation(2)\n" +                       "  Actual: true\n" +                       "Expected: false"); +} + +#ifdef __BORLANDC__ +// Restores warnings after previous "#pragma option push" suppressed them +# pragma option pop +#endif + +// Tests using ASSERT_EQ on double values.  The purpose is to make +// sure that the specialization we did for integer and anonymous enums +// isn't used for double arguments. +TEST(ExpectTest, ASSERT_EQ_Double) { +  // A success. +  ASSERT_EQ(5.6, 5.6); + +  // A failure. +  EXPECT_FATAL_FAILURE(ASSERT_EQ(5.1, 5.2), +                       "5.1"); +} + +// Tests ASSERT_EQ. +TEST(AssertionTest, ASSERT_EQ) { +  ASSERT_EQ(5, 2 + 3); +  EXPECT_FATAL_FAILURE(ASSERT_EQ(5, 2*3), +                       "Expected equality of these values:\n" +                       "  5\n" +                       "  2*3\n" +                       "    Which is: 6"); +} + +// Tests ASSERT_EQ(NULL, pointer). +#if GTEST_CAN_COMPARE_NULL +TEST(AssertionTest, ASSERT_EQ_NULL) { +  // A success. +  const char* p = NULL; +  // Some older GCC versions may issue a spurious warning in this or the next +  // assertion statement. This warning should not be suppressed with +  // static_cast since the test verifies the ability to use bare NULL as the +  // expected parameter to the macro. +  ASSERT_EQ(NULL, p); + +  // A failure. +  static int n = 0; +  EXPECT_FATAL_FAILURE(ASSERT_EQ(NULL, &n), +                       "  &n\n    Which is:"); +} +#endif  // GTEST_CAN_COMPARE_NULL + +// Tests ASSERT_EQ(0, non_pointer).  Since the literal 0 can be +// treated as a null pointer by the compiler, we need to make sure +// that ASSERT_EQ(0, non_pointer) isn't interpreted by Google Test as +// ASSERT_EQ(static_cast<void*>(NULL), non_pointer). +TEST(ExpectTest, ASSERT_EQ_0) { +  int n = 0; + +  // A success. +  ASSERT_EQ(0, n); + +  // A failure. +  EXPECT_FATAL_FAILURE(ASSERT_EQ(0, 5.6), +                       "  0\n  5.6"); +} + +// Tests ASSERT_NE. +TEST(AssertionTest, ASSERT_NE) { +  ASSERT_NE(6, 7); +  EXPECT_FATAL_FAILURE(ASSERT_NE('a', 'a'), +                       "Expected: ('a') != ('a'), " +                       "actual: 'a' (97, 0x61) vs 'a' (97, 0x61)"); +} + +// Tests ASSERT_LE. +TEST(AssertionTest, ASSERT_LE) { +  ASSERT_LE(2, 3); +  ASSERT_LE(2, 2); +  EXPECT_FATAL_FAILURE(ASSERT_LE(2, 0), +                       "Expected: (2) <= (0), actual: 2 vs 0"); +} + +// Tests ASSERT_LT. +TEST(AssertionTest, ASSERT_LT) { +  ASSERT_LT(2, 3); +  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 2), +                       "Expected: (2) < (2), actual: 2 vs 2"); +} + +// Tests ASSERT_GE. +TEST(AssertionTest, ASSERT_GE) { +  ASSERT_GE(2, 1); +  ASSERT_GE(2, 2); +  EXPECT_FATAL_FAILURE(ASSERT_GE(2, 3), +                       "Expected: (2) >= (3), actual: 2 vs 3"); +} + +// Tests ASSERT_GT. +TEST(AssertionTest, ASSERT_GT) { +  ASSERT_GT(2, 1); +  EXPECT_FATAL_FAILURE(ASSERT_GT(2, 2), +                       "Expected: (2) > (2), actual: 2 vs 2"); +} + +#if GTEST_HAS_EXCEPTIONS + +void ThrowNothing() {} + +// Tests ASSERT_THROW. +TEST(AssertionTest, ASSERT_THROW) { +  ASSERT_THROW(ThrowAnInteger(), int); + +# ifndef __BORLANDC__ + +  // ICE's in C++Builder 2007 and 2009. +  EXPECT_FATAL_FAILURE( +      ASSERT_THROW(ThrowAnInteger(), bool), +      "Expected: ThrowAnInteger() throws an exception of type bool.\n" +      "  Actual: it throws a different type."); +# endif + +  EXPECT_FATAL_FAILURE( +      ASSERT_THROW(ThrowNothing(), bool), +      "Expected: ThrowNothing() throws an exception of type bool.\n" +      "  Actual: it throws nothing."); +} + +// Tests ASSERT_NO_THROW. +TEST(AssertionTest, ASSERT_NO_THROW) { +  ASSERT_NO_THROW(ThrowNothing()); +  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()), +                       "Expected: ThrowAnInteger() doesn't throw an exception." +                       "\n  Actual: it throws."); +} + +// Tests ASSERT_ANY_THROW. +TEST(AssertionTest, ASSERT_ANY_THROW) { +  ASSERT_ANY_THROW(ThrowAnInteger()); +  EXPECT_FATAL_FAILURE( +      ASSERT_ANY_THROW(ThrowNothing()), +      "Expected: ThrowNothing() throws an exception.\n" +      "  Actual: it doesn't."); +} + +#endif  // GTEST_HAS_EXCEPTIONS + +// Makes sure we deal with the precedence of <<.  This test should +// compile. +TEST(AssertionTest, AssertPrecedence) { +  ASSERT_EQ(1 < 2, true); +  bool false_value = false; +  ASSERT_EQ(true && false_value, false); +} + +// A subroutine used by the following test. +void TestEq1(int x) { +  ASSERT_EQ(1, x); +} + +// Tests calling a test subroutine that's not part of a fixture. +TEST(AssertionTest, NonFixtureSubroutine) { +  EXPECT_FATAL_FAILURE(TestEq1(2), +                       "  x\n    Which is: 2"); +} + +// An uncopyable class. +class Uncopyable { + public: +  explicit Uncopyable(int a_value) : value_(a_value) {} + +  int value() const { return value_; } +  bool operator==(const Uncopyable& rhs) const { +    return value() == rhs.value(); +  } + private: +  // This constructor deliberately has no implementation, as we don't +  // want this class to be copyable. +  Uncopyable(const Uncopyable&);  // NOLINT + +  int value_; +}; + +::std::ostream& operator<<(::std::ostream& os, const Uncopyable& value) { +  return os << value.value(); +} + + +bool IsPositiveUncopyable(const Uncopyable& x) { +  return x.value() > 0; +} + +// A subroutine used by the following test. +void TestAssertNonPositive() { +  Uncopyable y(-1); +  ASSERT_PRED1(IsPositiveUncopyable, y); +} +// A subroutine used by the following test. +void TestAssertEqualsUncopyable() { +  Uncopyable x(5); +  Uncopyable y(-1); +  ASSERT_EQ(x, y); +} + +// Tests that uncopyable objects can be used in assertions. +TEST(AssertionTest, AssertWorksWithUncopyableObject) { +  Uncopyable x(5); +  ASSERT_PRED1(IsPositiveUncopyable, x); +  ASSERT_EQ(x, x); +  EXPECT_FATAL_FAILURE(TestAssertNonPositive(), +    "IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1"); +  EXPECT_FATAL_FAILURE(TestAssertEqualsUncopyable(), +                       "Expected equality of these values:\n" +                       "  x\n    Which is: 5\n  y\n    Which is: -1"); +} + +// Tests that uncopyable objects can be used in expects. +TEST(AssertionTest, ExpectWorksWithUncopyableObject) { +  Uncopyable x(5); +  EXPECT_PRED1(IsPositiveUncopyable, x); +  Uncopyable y(-1); +  EXPECT_NONFATAL_FAILURE(EXPECT_PRED1(IsPositiveUncopyable, y), +    "IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1"); +  EXPECT_EQ(x, x); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), +                          "Expected equality of these values:\n" +                          "  x\n    Which is: 5\n  y\n    Which is: -1"); +} + +enum NamedEnum { +  kE1 = 0, +  kE2 = 1 +}; + +TEST(AssertionTest, NamedEnum) { +  EXPECT_EQ(kE1, kE1); +  EXPECT_LT(kE1, kE2); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(kE1, kE2), "Which is: 0"); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(kE1, kE2), "Which is: 1"); +} + +// The version of gcc used in XCode 2.2 has a bug and doesn't allow +// anonymous enums in assertions.  Therefore the following test is not +// done on Mac. +// Sun Studio and HP aCC also reject this code. +#if !GTEST_OS_MAC && !defined(__SUNPRO_CC) && !defined(__HP_aCC) + +// Tests using assertions with anonymous enums. +enum { +  kCaseA = -1, + +# if GTEST_OS_LINUX + +  // We want to test the case where the size of the anonymous enum is +  // larger than sizeof(int), to make sure our implementation of the +  // assertions doesn't truncate the enums.  However, MSVC +  // (incorrectly) doesn't allow an enum value to exceed the range of +  // an int, so this has to be conditionally compiled. +  // +  // On Linux, kCaseB and kCaseA have the same value when truncated to +  // int size.  We want to test whether this will confuse the +  // assertions. +  kCaseB = testing::internal::kMaxBiggestInt, + +# else + +  kCaseB = INT_MAX, + +# endif  // GTEST_OS_LINUX + +  kCaseC = 42 +}; + +TEST(AssertionTest, AnonymousEnum) { +# if GTEST_OS_LINUX + +  EXPECT_EQ(static_cast<int>(kCaseA), static_cast<int>(kCaseB)); + +# endif  // GTEST_OS_LINUX + +  EXPECT_EQ(kCaseA, kCaseA); +  EXPECT_NE(kCaseA, kCaseB); +  EXPECT_LT(kCaseA, kCaseB); +  EXPECT_LE(kCaseA, kCaseB); +  EXPECT_GT(kCaseB, kCaseA); +  EXPECT_GE(kCaseA, kCaseA); +  EXPECT_NONFATAL_FAILURE(EXPECT_GE(kCaseA, kCaseB), +                          "(kCaseA) >= (kCaseB)"); +  EXPECT_NONFATAL_FAILURE(EXPECT_GE(kCaseA, kCaseC), +                          "-1 vs 42"); + +  ASSERT_EQ(kCaseA, kCaseA); +  ASSERT_NE(kCaseA, kCaseB); +  ASSERT_LT(kCaseA, kCaseB); +  ASSERT_LE(kCaseA, kCaseB); +  ASSERT_GT(kCaseB, kCaseA); +  ASSERT_GE(kCaseA, kCaseA); + +# ifndef __BORLANDC__ + +  // ICE's in C++Builder. +  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseB), +                       "  kCaseB\n    Which is: "); +  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseC), +                       "\n    Which is: 42"); +# endif + +  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseC), +                       "\n    Which is: -1"); +} + +#endif  // !GTEST_OS_MAC && !defined(__SUNPRO_CC) + +#if GTEST_OS_WINDOWS + +static HRESULT UnexpectedHRESULTFailure() { +  return E_UNEXPECTED; +} + +static HRESULT OkHRESULTSuccess() { +  return S_OK; +} + +static HRESULT FalseHRESULTSuccess() { +  return S_FALSE; +} + +// HRESULT assertion tests test both zero and non-zero +// success codes as well as failure message for each. +// +// Windows CE doesn't support message texts. +TEST(HRESULTAssertionTest, EXPECT_HRESULT_SUCCEEDED) { +  EXPECT_HRESULT_SUCCEEDED(S_OK); +  EXPECT_HRESULT_SUCCEEDED(S_FALSE); + +  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()), +    "Expected: (UnexpectedHRESULTFailure()) succeeds.\n" +    "  Actual: 0x8000FFFF"); +} + +TEST(HRESULTAssertionTest, ASSERT_HRESULT_SUCCEEDED) { +  ASSERT_HRESULT_SUCCEEDED(S_OK); +  ASSERT_HRESULT_SUCCEEDED(S_FALSE); + +  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()), +    "Expected: (UnexpectedHRESULTFailure()) succeeds.\n" +    "  Actual: 0x8000FFFF"); +} + +TEST(HRESULTAssertionTest, EXPECT_HRESULT_FAILED) { +  EXPECT_HRESULT_FAILED(E_UNEXPECTED); + +  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(OkHRESULTSuccess()), +    "Expected: (OkHRESULTSuccess()) fails.\n" +    "  Actual: 0x0"); +  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(FalseHRESULTSuccess()), +    "Expected: (FalseHRESULTSuccess()) fails.\n" +    "  Actual: 0x1"); +} + +TEST(HRESULTAssertionTest, ASSERT_HRESULT_FAILED) { +  ASSERT_HRESULT_FAILED(E_UNEXPECTED); + +# ifndef __BORLANDC__ + +  // ICE's in C++Builder 2007 and 2009. +  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(OkHRESULTSuccess()), +    "Expected: (OkHRESULTSuccess()) fails.\n" +    "  Actual: 0x0"); +# endif + +  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(FalseHRESULTSuccess()), +    "Expected: (FalseHRESULTSuccess()) fails.\n" +    "  Actual: 0x1"); +} + +// Tests that streaming to the HRESULT macros works. +TEST(HRESULTAssertionTest, Streaming) { +  EXPECT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure"; +  ASSERT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure"; +  EXPECT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure"; +  ASSERT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure"; + +  EXPECT_NONFATAL_FAILURE( +      EXPECT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure", +      "expected failure"); + +# ifndef __BORLANDC__ + +  // ICE's in C++Builder 2007 and 2009. +  EXPECT_FATAL_FAILURE( +      ASSERT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure", +      "expected failure"); +# endif + +  EXPECT_NONFATAL_FAILURE( +      EXPECT_HRESULT_FAILED(S_OK) << "expected failure", +      "expected failure"); + +  EXPECT_FATAL_FAILURE( +      ASSERT_HRESULT_FAILED(S_OK) << "expected failure", +      "expected failure"); +} + +#endif  // GTEST_OS_WINDOWS + +#ifdef __BORLANDC__ +// Silences warnings: "Condition is always true", "Unreachable code" +# pragma option push -w-ccc -w-rch +#endif + +// Tests that the assertion macros behave like single statements. +TEST(AssertionSyntaxTest, BasicAssertionsBehavesLikeSingleStatement) { +  if (AlwaysFalse()) +    ASSERT_TRUE(false) << "This should never be executed; " +                          "It's a compilation test only."; + +  if (AlwaysTrue()) +    EXPECT_FALSE(false); +  else +    ;  // NOLINT + +  if (AlwaysFalse()) +    ASSERT_LT(1, 3); + +  if (AlwaysFalse()) +    ;  // NOLINT +  else +    EXPECT_GT(3, 2) << ""; +} + +#if GTEST_HAS_EXCEPTIONS +// Tests that the compiler will not complain about unreachable code in the +// EXPECT_THROW/EXPECT_ANY_THROW/EXPECT_NO_THROW macros. +TEST(ExpectThrowTest, DoesNotGenerateUnreachableCodeWarning) { +  int n = 0; + +  EXPECT_THROW(throw 1, int); +  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(n++, int), ""); +  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(throw 1, const char*), ""); +  EXPECT_NO_THROW(n++); +  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(throw 1), ""); +  EXPECT_ANY_THROW(throw 1); +  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(n++), ""); +} + +TEST(AssertionSyntaxTest, ExceptionAssertionsBehavesLikeSingleStatement) { +  if (AlwaysFalse()) +    EXPECT_THROW(ThrowNothing(), bool); + +  if (AlwaysTrue()) +    EXPECT_THROW(ThrowAnInteger(), int); +  else +    ;  // NOLINT + +  if (AlwaysFalse()) +    EXPECT_NO_THROW(ThrowAnInteger()); + +  if (AlwaysTrue()) +    EXPECT_NO_THROW(ThrowNothing()); +  else +    ;  // NOLINT + +  if (AlwaysFalse()) +    EXPECT_ANY_THROW(ThrowNothing()); + +  if (AlwaysTrue()) +    EXPECT_ANY_THROW(ThrowAnInteger()); +  else +    ;  // NOLINT +} +#endif  // GTEST_HAS_EXCEPTIONS + +TEST(AssertionSyntaxTest, NoFatalFailureAssertionsBehavesLikeSingleStatement) { +  if (AlwaysFalse()) +    EXPECT_NO_FATAL_FAILURE(FAIL()) << "This should never be executed. " +                                    << "It's a compilation test only."; +  else +    ;  // NOLINT + +  if (AlwaysFalse()) +    ASSERT_NO_FATAL_FAILURE(FAIL()) << ""; +  else +    ;  // NOLINT + +  if (AlwaysTrue()) +    EXPECT_NO_FATAL_FAILURE(SUCCEED()); +  else +    ;  // NOLINT + +  if (AlwaysFalse()) +    ;  // NOLINT +  else +    ASSERT_NO_FATAL_FAILURE(SUCCEED()); +} + +// Tests that the assertion macros work well with switch statements. +TEST(AssertionSyntaxTest, WorksWithSwitch) { +  switch (0) { +    case 1: +      break; +    default: +      ASSERT_TRUE(true); +  } + +  switch (0) +    case 0: +      EXPECT_FALSE(false) << "EXPECT_FALSE failed in switch case"; + +  // Binary assertions are implemented using a different code path +  // than the Boolean assertions.  Hence we test them separately. +  switch (0) { +    case 1: +    default: +      ASSERT_EQ(1, 1) << "ASSERT_EQ failed in default switch handler"; +  } + +  switch (0) +    case 0: +      EXPECT_NE(1, 2); +} + +#if GTEST_HAS_EXCEPTIONS + +void ThrowAString() { +    throw "std::string"; +} + +// Test that the exception assertion macros compile and work with const +// type qualifier. +TEST(AssertionSyntaxTest, WorksWithConst) { +    ASSERT_THROW(ThrowAString(), const char*); + +    EXPECT_THROW(ThrowAString(), const char*); +} + +#endif  // GTEST_HAS_EXCEPTIONS + +}  // namespace + +namespace testing { + +// Tests that Google Test tracks SUCCEED*. +TEST(SuccessfulAssertionTest, SUCCEED) { +  SUCCEED(); +  SUCCEED() << "OK"; +  EXPECT_EQ(2, GetUnitTestImpl()->current_test_result()->total_part_count()); +} + +// Tests that Google Test doesn't track successful EXPECT_*. +TEST(SuccessfulAssertionTest, EXPECT) { +  EXPECT_TRUE(true); +  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count()); +} + +// Tests that Google Test doesn't track successful EXPECT_STR*. +TEST(SuccessfulAssertionTest, EXPECT_STR) { +  EXPECT_STREQ("", ""); +  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count()); +} + +// Tests that Google Test doesn't track successful ASSERT_*. +TEST(SuccessfulAssertionTest, ASSERT) { +  ASSERT_TRUE(true); +  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count()); +} + +// Tests that Google Test doesn't track successful ASSERT_STR*. +TEST(SuccessfulAssertionTest, ASSERT_STR) { +  ASSERT_STREQ("", ""); +  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count()); +} + +}  // namespace testing + +namespace { + +// Tests the message streaming variation of assertions. + +TEST(AssertionWithMessageTest, EXPECT) { +  EXPECT_EQ(1, 1) << "This should succeed."; +  EXPECT_NONFATAL_FAILURE(EXPECT_NE(1, 1) << "Expected failure #1.", +                          "Expected failure #1"); +  EXPECT_LE(1, 2) << "This should succeed."; +  EXPECT_NONFATAL_FAILURE(EXPECT_LT(1, 0) << "Expected failure #2.", +                          "Expected failure #2."); +  EXPECT_GE(1, 0) << "This should succeed."; +  EXPECT_NONFATAL_FAILURE(EXPECT_GT(1, 2) << "Expected failure #3.", +                          "Expected failure #3."); + +  EXPECT_STREQ("1", "1") << "This should succeed."; +  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE("1", "1") << "Expected failure #4.", +                          "Expected failure #4."); +  EXPECT_STRCASEEQ("a", "A") << "This should succeed."; +  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE("a", "A") << "Expected failure #5.", +                          "Expected failure #5."); + +  EXPECT_FLOAT_EQ(1, 1) << "This should succeed."; +  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1, 1.2) << "Expected failure #6.", +                          "Expected failure #6."); +  EXPECT_NEAR(1, 1.1, 0.2) << "This should succeed."; +} + +TEST(AssertionWithMessageTest, ASSERT) { +  ASSERT_EQ(1, 1) << "This should succeed."; +  ASSERT_NE(1, 2) << "This should succeed."; +  ASSERT_LE(1, 2) << "This should succeed."; +  ASSERT_LT(1, 2) << "This should succeed."; +  ASSERT_GE(1, 0) << "This should succeed."; +  EXPECT_FATAL_FAILURE(ASSERT_GT(1, 2) << "Expected failure.", +                       "Expected failure."); +} + +TEST(AssertionWithMessageTest, ASSERT_STR) { +  ASSERT_STREQ("1", "1") << "This should succeed."; +  ASSERT_STRNE("1", "2") << "This should succeed."; +  ASSERT_STRCASEEQ("a", "A") << "This should succeed."; +  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("a", "A") << "Expected failure.", +                       "Expected failure."); +} + +TEST(AssertionWithMessageTest, ASSERT_FLOATING) { +  ASSERT_FLOAT_EQ(1, 1) << "This should succeed."; +  ASSERT_DOUBLE_EQ(1, 1) << "This should succeed."; +  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1,1.2, 0.1) << "Expect failure.",  // NOLINT +                       "Expect failure."); +  // To work around a bug in gcc 2.95.0, there is intentionally no +  // space after the first comma in the previous statement. +} + +// Tests using ASSERT_FALSE with a streamed message. +TEST(AssertionWithMessageTest, ASSERT_FALSE) { +  ASSERT_FALSE(false) << "This shouldn't fail."; +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_FALSE(true) << "Expected failure: " << 2 << " > " << 1 +                       << " evaluates to " << true; +  }, "Expected failure"); +} + +// Tests using FAIL with a streamed message. +TEST(AssertionWithMessageTest, FAIL) { +  EXPECT_FATAL_FAILURE(FAIL() << 0, +                       "0"); +} + +// Tests using SUCCEED with a streamed message. +TEST(AssertionWithMessageTest, SUCCEED) { +  SUCCEED() << "Success == " << 1; +} + +// Tests using ASSERT_TRUE with a streamed message. +TEST(AssertionWithMessageTest, ASSERT_TRUE) { +  ASSERT_TRUE(true) << "This should succeed."; +  ASSERT_TRUE(true) << true; +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_TRUE(false) << static_cast<const char *>(NULL) +                       << static_cast<char *>(NULL); +  }, "(null)(null)"); +} + +#if GTEST_OS_WINDOWS +// Tests using wide strings in assertion messages. +TEST(AssertionWithMessageTest, WideStringMessage) { +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_TRUE(false) << L"This failure is expected.\x8119"; +  }, "This failure is expected."); +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_EQ(1, 2) << "This failure is " +                    << L"expected too.\x8120"; +  }, "This failure is expected too."); +} +#endif  // GTEST_OS_WINDOWS + +// Tests EXPECT_TRUE. +TEST(ExpectTest, EXPECT_TRUE) { +  EXPECT_TRUE(true) << "Intentional success"; +  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "Intentional failure #1.", +                          "Intentional failure #1."); +  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "Intentional failure #2.", +                          "Intentional failure #2."); +  EXPECT_TRUE(2 > 1);  // NOLINT +  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 < 1), +                          "Value of: 2 < 1\n" +                          "  Actual: false\n" +                          "Expected: true"); +  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 > 3), +                          "2 > 3"); +} + +// Tests EXPECT_TRUE(predicate) for predicates returning AssertionResult. +TEST(ExpectTest, ExpectTrueWithAssertionResult) { +  EXPECT_TRUE(ResultIsEven(2)); +  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEven(3)), +                          "Value of: ResultIsEven(3)\n" +                          "  Actual: false (3 is odd)\n" +                          "Expected: true"); +  EXPECT_TRUE(ResultIsEvenNoExplanation(2)); +  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEvenNoExplanation(3)), +                          "Value of: ResultIsEvenNoExplanation(3)\n" +                          "  Actual: false (3 is odd)\n" +                          "Expected: true"); +} + +// Tests EXPECT_FALSE with a streamed message. +TEST(ExpectTest, EXPECT_FALSE) { +  EXPECT_FALSE(2 < 1);  // NOLINT +  EXPECT_FALSE(false) << "Intentional success"; +  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "Intentional failure #1.", +                          "Intentional failure #1."); +  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "Intentional failure #2.", +                          "Intentional failure #2."); +  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 > 1), +                          "Value of: 2 > 1\n" +                          "  Actual: true\n" +                          "Expected: false"); +  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 < 3), +                          "2 < 3"); +} + +// Tests EXPECT_FALSE(predicate) for predicates returning AssertionResult. +TEST(ExpectTest, ExpectFalseWithAssertionResult) { +  EXPECT_FALSE(ResultIsEven(3)); +  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEven(2)), +                          "Value of: ResultIsEven(2)\n" +                          "  Actual: true (2 is even)\n" +                          "Expected: false"); +  EXPECT_FALSE(ResultIsEvenNoExplanation(3)); +  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEvenNoExplanation(2)), +                          "Value of: ResultIsEvenNoExplanation(2)\n" +                          "  Actual: true\n" +                          "Expected: false"); +} + +#ifdef __BORLANDC__ +// Restores warnings after previous "#pragma option push" suppressed them +# pragma option pop +#endif + +// Tests EXPECT_EQ. +TEST(ExpectTest, EXPECT_EQ) { +  EXPECT_EQ(5, 2 + 3); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2*3), +                          "Expected equality of these values:\n" +                          "  5\n" +                          "  2*3\n" +                          "    Which is: 6"); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2 - 3), +                          "2 - 3"); +} + +// Tests using EXPECT_EQ on double values.  The purpose is to make +// sure that the specialization we did for integer and anonymous enums +// isn't used for double arguments. +TEST(ExpectTest, EXPECT_EQ_Double) { +  // A success. +  EXPECT_EQ(5.6, 5.6); + +  // A failure. +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5.1, 5.2), +                          "5.1"); +} + +#if GTEST_CAN_COMPARE_NULL +// Tests EXPECT_EQ(NULL, pointer). +TEST(ExpectTest, EXPECT_EQ_NULL) { +  // A success. +  const char* p = NULL; +  // Some older GCC versions may issue a spurious warning in this or the next +  // assertion statement. This warning should not be suppressed with +  // static_cast since the test verifies the ability to use bare NULL as the +  // expected parameter to the macro. +  EXPECT_EQ(NULL, p); + +  // A failure. +  int n = 0; +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(NULL, &n), +                          "  &n\n    Which is:"); +} +#endif  // GTEST_CAN_COMPARE_NULL + +// Tests EXPECT_EQ(0, non_pointer).  Since the literal 0 can be +// treated as a null pointer by the compiler, we need to make sure +// that EXPECT_EQ(0, non_pointer) isn't interpreted by Google Test as +// EXPECT_EQ(static_cast<void*>(NULL), non_pointer). +TEST(ExpectTest, EXPECT_EQ_0) { +  int n = 0; + +  // A success. +  EXPECT_EQ(0, n); + +  // A failure. +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(0, 5.6), +                          "  0\n  5.6"); +} + +// Tests EXPECT_NE. +TEST(ExpectTest, EXPECT_NE) { +  EXPECT_NE(6, 7); + +  EXPECT_NONFATAL_FAILURE(EXPECT_NE('a', 'a'), +                          "Expected: ('a') != ('a'), " +                          "actual: 'a' (97, 0x61) vs 'a' (97, 0x61)"); +  EXPECT_NONFATAL_FAILURE(EXPECT_NE(2, 2), +                          "2"); +  char* const p0 = NULL; +  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p0, p0), +                          "p0"); +  // Only way to get the Nokia compiler to compile the cast +  // is to have a separate void* variable first. Putting +  // the two casts on the same line doesn't work, neither does +  // a direct C-style to char*. +  void* pv1 = (void*)0x1234;  // NOLINT +  char* const p1 = reinterpret_cast<char*>(pv1); +  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p1, p1), +                          "p1"); +} + +// Tests EXPECT_LE. +TEST(ExpectTest, EXPECT_LE) { +  EXPECT_LE(2, 3); +  EXPECT_LE(2, 2); +  EXPECT_NONFATAL_FAILURE(EXPECT_LE(2, 0), +                          "Expected: (2) <= (0), actual: 2 vs 0"); +  EXPECT_NONFATAL_FAILURE(EXPECT_LE(1.1, 0.9), +                          "(1.1) <= (0.9)"); +} + +// Tests EXPECT_LT. +TEST(ExpectTest, EXPECT_LT) { +  EXPECT_LT(2, 3); +  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 2), +                          "Expected: (2) < (2), actual: 2 vs 2"); +  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1), +                          "(2) < (1)"); +} + +// Tests EXPECT_GE. +TEST(ExpectTest, EXPECT_GE) { +  EXPECT_GE(2, 1); +  EXPECT_GE(2, 2); +  EXPECT_NONFATAL_FAILURE(EXPECT_GE(2, 3), +                          "Expected: (2) >= (3), actual: 2 vs 3"); +  EXPECT_NONFATAL_FAILURE(EXPECT_GE(0.9, 1.1), +                          "(0.9) >= (1.1)"); +} + +// Tests EXPECT_GT. +TEST(ExpectTest, EXPECT_GT) { +  EXPECT_GT(2, 1); +  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 2), +                          "Expected: (2) > (2), actual: 2 vs 2"); +  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 3), +                          "(2) > (3)"); +} + +#if GTEST_HAS_EXCEPTIONS + +// Tests EXPECT_THROW. +TEST(ExpectTest, EXPECT_THROW) { +  EXPECT_THROW(ThrowAnInteger(), int); +  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool), +                          "Expected: ThrowAnInteger() throws an exception of " +                          "type bool.\n  Actual: it throws a different type."); +  EXPECT_NONFATAL_FAILURE( +      EXPECT_THROW(ThrowNothing(), bool), +      "Expected: ThrowNothing() throws an exception of type bool.\n" +      "  Actual: it throws nothing."); +} + +// Tests EXPECT_NO_THROW. +TEST(ExpectTest, EXPECT_NO_THROW) { +  EXPECT_NO_THROW(ThrowNothing()); +  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()), +                          "Expected: ThrowAnInteger() doesn't throw an " +                          "exception.\n  Actual: it throws."); +} + +// Tests EXPECT_ANY_THROW. +TEST(ExpectTest, EXPECT_ANY_THROW) { +  EXPECT_ANY_THROW(ThrowAnInteger()); +  EXPECT_NONFATAL_FAILURE( +      EXPECT_ANY_THROW(ThrowNothing()), +      "Expected: ThrowNothing() throws an exception.\n" +      "  Actual: it doesn't."); +} + +#endif  // GTEST_HAS_EXCEPTIONS + +// Make sure we deal with the precedence of <<. +TEST(ExpectTest, ExpectPrecedence) { +  EXPECT_EQ(1 < 2, true); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(true, true && false), +                          "  true && false\n    Which is: false"); +} + + +// Tests the StreamableToString() function. + +// Tests using StreamableToString() on a scalar. +TEST(StreamableToStringTest, Scalar) { +  EXPECT_STREQ("5", StreamableToString(5).c_str()); +} + +// Tests using StreamableToString() on a non-char pointer. +TEST(StreamableToStringTest, Pointer) { +  int n = 0; +  int* p = &n; +  EXPECT_STRNE("(null)", StreamableToString(p).c_str()); +} + +// Tests using StreamableToString() on a NULL non-char pointer. +TEST(StreamableToStringTest, NullPointer) { +  int* p = NULL; +  EXPECT_STREQ("(null)", StreamableToString(p).c_str()); +} + +// Tests using StreamableToString() on a C string. +TEST(StreamableToStringTest, CString) { +  EXPECT_STREQ("Foo", StreamableToString("Foo").c_str()); +} + +// Tests using StreamableToString() on a NULL C string. +TEST(StreamableToStringTest, NullCString) { +  char* p = NULL; +  EXPECT_STREQ("(null)", StreamableToString(p).c_str()); +} + +// Tests using streamable values as assertion messages. + +// Tests using std::string as an assertion message. +TEST(StreamableTest, string) { +  static const std::string str( +      "This failure message is a std::string, and is expected."); +  EXPECT_FATAL_FAILURE(FAIL() << str, +                       str.c_str()); +} + +// Tests that we can output strings containing embedded NULs. +// Limited to Linux because we can only do this with std::string's. +TEST(StreamableTest, stringWithEmbeddedNUL) { +  static const char char_array_with_nul[] = +      "Here's a NUL\0 and some more string"; +  static const std::string string_with_nul(char_array_with_nul, +                                           sizeof(char_array_with_nul) +                                           - 1);  // drops the trailing NUL +  EXPECT_FATAL_FAILURE(FAIL() << string_with_nul, +                       "Here's a NUL\\0 and some more string"); +} + +// Tests that we can output a NUL char. +TEST(StreamableTest, NULChar) { +  EXPECT_FATAL_FAILURE({  // NOLINT +    FAIL() << "A NUL" << '\0' << " and some more string"; +  }, "A NUL\\0 and some more string"); +} + +// Tests using int as an assertion message. +TEST(StreamableTest, int) { +  EXPECT_FATAL_FAILURE(FAIL() << 900913, +                       "900913"); +} + +// Tests using NULL char pointer as an assertion message. +// +// In MSVC, streaming a NULL char * causes access violation.  Google Test +// implemented a workaround (substituting "(null)" for NULL).  This +// tests whether the workaround works. +TEST(StreamableTest, NullCharPtr) { +  EXPECT_FATAL_FAILURE(FAIL() << static_cast<const char*>(NULL), +                       "(null)"); +} + +// Tests that basic IO manipulators (endl, ends, and flush) can be +// streamed to testing::Message. +TEST(StreamableTest, BasicIoManip) { +  EXPECT_FATAL_FAILURE({  // NOLINT +    FAIL() << "Line 1." << std::endl +           << "A NUL char " << std::ends << std::flush << " in line 2."; +  }, "Line 1.\nA NUL char \\0 in line 2."); +} + +// Tests the macros that haven't been covered so far. + +void AddFailureHelper(bool* aborted) { +  *aborted = true; +  ADD_FAILURE() << "Intentional failure."; +  *aborted = false; +} + +// Tests ADD_FAILURE. +TEST(MacroTest, ADD_FAILURE) { +  bool aborted = true; +  EXPECT_NONFATAL_FAILURE(AddFailureHelper(&aborted), +                          "Intentional failure."); +  EXPECT_FALSE(aborted); +} + +// Tests ADD_FAILURE_AT. +TEST(MacroTest, ADD_FAILURE_AT) { +  // Verifies that ADD_FAILURE_AT does generate a nonfatal failure and +  // the failure message contains the user-streamed part. +  EXPECT_NONFATAL_FAILURE(ADD_FAILURE_AT("foo.cc", 42) << "Wrong!", "Wrong!"); + +  // Verifies that the user-streamed part is optional. +  EXPECT_NONFATAL_FAILURE(ADD_FAILURE_AT("foo.cc", 42), "Failed"); + +  // Unfortunately, we cannot verify that the failure message contains +  // the right file path and line number the same way, as +  // EXPECT_NONFATAL_FAILURE() doesn't get to see the file path and +  // line number.  Instead, we do that in googletest-output-test_.cc. +} + +// Tests FAIL. +TEST(MacroTest, FAIL) { +  EXPECT_FATAL_FAILURE(FAIL(), +                       "Failed"); +  EXPECT_FATAL_FAILURE(FAIL() << "Intentional failure.", +                       "Intentional failure."); +} + +// Tests SUCCEED +TEST(MacroTest, SUCCEED) { +  SUCCEED(); +  SUCCEED() << "Explicit success."; +} + +// Tests for EXPECT_EQ() and ASSERT_EQ(). +// +// These tests fail *intentionally*, s.t. the failure messages can be +// generated and tested. +// +// We have different tests for different argument types. + +// Tests using bool values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, Bool) { +  EXPECT_EQ(true,  true); +  EXPECT_FATAL_FAILURE({ +      bool false_value = false; +      ASSERT_EQ(false_value, true); +    }, "  false_value\n    Which is: false\n  true"); +} + +// Tests using int values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, Int) { +  ASSERT_EQ(32, 32); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(32, 33), +                          "  32\n  33"); +} + +// Tests using time_t values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, Time_T) { +  EXPECT_EQ(static_cast<time_t>(0), +            static_cast<time_t>(0)); +  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<time_t>(0), +                                 static_cast<time_t>(1234)), +                       "1234"); +} + +// Tests using char values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, Char) { +  ASSERT_EQ('z', 'z'); +  const char ch = 'b'; +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('\0', ch), +                          "  ch\n    Which is: 'b'"); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('a', ch), +                          "  ch\n    Which is: 'b'"); +} + +// Tests using wchar_t values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, WideChar) { +  EXPECT_EQ(L'b', L'b'); + +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'\0', L'x'), +                          "Expected equality of these values:\n" +                          "  L'\0'\n" +                          "    Which is: L'\0' (0, 0x0)\n" +                          "  L'x'\n" +                          "    Which is: L'x' (120, 0x78)"); + +  static wchar_t wchar; +  wchar = L'b'; +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'a', wchar), +                          "wchar"); +  wchar = 0x8119; +  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<wchar_t>(0x8120), wchar), +                       "  wchar\n    Which is: L'"); +} + +// Tests using ::std::string values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, StdString) { +  // Compares a const char* to an std::string that has identical +  // content. +  ASSERT_EQ("Test", ::std::string("Test")); + +  // Compares two identical std::strings. +  static const ::std::string str1("A * in the middle"); +  static const ::std::string str2(str1); +  EXPECT_EQ(str1, str2); + +  // Compares a const char* to an std::string that has different +  // content +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ("Test", ::std::string("test")), +                          "\"test\""); + +  // Compares an std::string to a char* that has different content. +  char* const p1 = const_cast<char*>("foo"); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::std::string("bar"), p1), +                          "p1"); + +  // Compares two std::strings that have different contents, one of +  // which having a NUL character in the middle.  This should fail. +  static ::std::string str3(str1); +  str3.at(2) = '\0'; +  EXPECT_FATAL_FAILURE(ASSERT_EQ(str1, str3), +                       "  str3\n    Which is: \"A \\0 in the middle\""); +} + +#if GTEST_HAS_STD_WSTRING + +// Tests using ::std::wstring values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, StdWideString) { +  // Compares two identical std::wstrings. +  const ::std::wstring wstr1(L"A * in the middle"); +  const ::std::wstring wstr2(wstr1); +  ASSERT_EQ(wstr1, wstr2); + +  // Compares an std::wstring to a const wchar_t* that has identical +  // content. +  const wchar_t kTestX8119[] = { 'T', 'e', 's', 't', 0x8119, '\0' }; +  EXPECT_EQ(::std::wstring(kTestX8119), kTestX8119); + +  // Compares an std::wstring to a const wchar_t* that has different +  // content. +  const wchar_t kTestX8120[] = { 'T', 'e', 's', 't', 0x8120, '\0' }; +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_EQ(::std::wstring(kTestX8119), kTestX8120); +  }, "kTestX8120"); + +  // Compares two std::wstrings that have different contents, one of +  // which having a NUL character in the middle. +  ::std::wstring wstr3(wstr1); +  wstr3.at(2) = L'\0'; +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(wstr1, wstr3), +                          "wstr3"); + +  // Compares a wchar_t* to an std::wstring that has different +  // content. +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_EQ(const_cast<wchar_t*>(L"foo"), ::std::wstring(L"bar")); +  }, ""); +} + +#endif  // GTEST_HAS_STD_WSTRING + +#if GTEST_HAS_GLOBAL_STRING +// Tests using ::string values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, GlobalString) { +  // Compares a const char* to a ::string that has identical content. +  EXPECT_EQ("Test", ::string("Test")); + +  // Compares two identical ::strings. +  const ::string str1("A * in the middle"); +  const ::string str2(str1); +  ASSERT_EQ(str1, str2); + +  // Compares a ::string to a const char* that has different content. +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::string("Test"), "test"), +                          "test"); + +  // Compares two ::strings that have different contents, one of which +  // having a NUL character in the middle. +  ::string str3(str1); +  str3.at(2) = '\0'; +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(str1, str3), +                          "str3"); + +  // Compares a ::string to a char* that has different content. +  EXPECT_FATAL_FAILURE({  // NOLINT +    ASSERT_EQ(::string("bar"), const_cast<char*>("foo")); +  }, ""); +} + +#endif  // GTEST_HAS_GLOBAL_STRING + +#if GTEST_HAS_GLOBAL_WSTRING + +// Tests using ::wstring values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, GlobalWideString) { +  // Compares two identical ::wstrings. +  static const ::wstring wstr1(L"A * in the middle"); +  static const ::wstring wstr2(wstr1); +  EXPECT_EQ(wstr1, wstr2); + +  // Compares a const wchar_t* to a ::wstring that has identical content. +  const wchar_t kTestX8119[] = { 'T', 'e', 's', 't', 0x8119, '\0' }; +  ASSERT_EQ(kTestX8119, ::wstring(kTestX8119)); + +  // Compares a const wchar_t* to a ::wstring that has different +  // content. +  const wchar_t kTestX8120[] = { 'T', 'e', 's', 't', 0x8120, '\0' }; +  EXPECT_NONFATAL_FAILURE({  // NOLINT +    EXPECT_EQ(kTestX8120, ::wstring(kTestX8119)); +  }, "Test\\x8119"); + +  // Compares a wchar_t* to a ::wstring that has different content. +  wchar_t* const p1 = const_cast<wchar_t*>(L"foo"); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, ::wstring(L"bar")), +                          "bar"); + +  // Compares two ::wstrings that have different contents, one of which +  // having a NUL character in the middle. +  static ::wstring wstr3; +  wstr3 = wstr1; +  wstr3.at(2) = L'\0'; +  EXPECT_FATAL_FAILURE(ASSERT_EQ(wstr1, wstr3), +                       "wstr3"); +} + +#endif  // GTEST_HAS_GLOBAL_WSTRING + +// Tests using char pointers in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, CharPointer) { +  char* const p0 = NULL; +  // Only way to get the Nokia compiler to compile the cast +  // is to have a separate void* variable first. Putting +  // the two casts on the same line doesn't work, neither does +  // a direct C-style to char*. +  void* pv1 = (void*)0x1234;  // NOLINT +  void* pv2 = (void*)0xABC0;  // NOLINT +  char* const p1 = reinterpret_cast<char*>(pv1); +  char* const p2 = reinterpret_cast<char*>(pv2); +  ASSERT_EQ(p1, p1); + +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2), +                          "  p2\n    Which is:"); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2), +                          "  p2\n    Which is:"); +  EXPECT_FATAL_FAILURE(ASSERT_EQ(reinterpret_cast<char*>(0x1234), +                                 reinterpret_cast<char*>(0xABC0)), +                       "ABC0"); +} + +// Tests using wchar_t pointers in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, WideCharPointer) { +  wchar_t* const p0 = NULL; +  // Only way to get the Nokia compiler to compile the cast +  // is to have a separate void* variable first. Putting +  // the two casts on the same line doesn't work, neither does +  // a direct C-style to char*. +  void* pv1 = (void*)0x1234;  // NOLINT +  void* pv2 = (void*)0xABC0;  // NOLINT +  wchar_t* const p1 = reinterpret_cast<wchar_t*>(pv1); +  wchar_t* const p2 = reinterpret_cast<wchar_t*>(pv2); +  EXPECT_EQ(p0, p0); + +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2), +                          "  p2\n    Which is:"); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2), +                          "  p2\n    Which is:"); +  void* pv3 = (void*)0x1234;  // NOLINT +  void* pv4 = (void*)0xABC0;  // NOLINT +  const wchar_t* p3 = reinterpret_cast<const wchar_t*>(pv3); +  const wchar_t* p4 = reinterpret_cast<const wchar_t*>(pv4); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p3, p4), +                          "p4"); +} + +// Tests using other types of pointers in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, OtherPointer) { +  ASSERT_EQ(static_cast<const int*>(NULL), +            static_cast<const int*>(NULL)); +  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<const int*>(NULL), +                                 reinterpret_cast<const int*>(0x1234)), +                       "0x1234"); +} + +// A class that supports binary comparison operators but not streaming. +class UnprintableChar { + public: +  explicit UnprintableChar(char ch) : char_(ch) {} + +  bool operator==(const UnprintableChar& rhs) const { +    return char_ == rhs.char_; +  } +  bool operator!=(const UnprintableChar& rhs) const { +    return char_ != rhs.char_; +  } +  bool operator<(const UnprintableChar& rhs) const { +    return char_ < rhs.char_; +  } +  bool operator<=(const UnprintableChar& rhs) const { +    return char_ <= rhs.char_; +  } +  bool operator>(const UnprintableChar& rhs) const { +    return char_ > rhs.char_; +  } +  bool operator>=(const UnprintableChar& rhs) const { +    return char_ >= rhs.char_; +  } + + private: +  char char_; +}; + +// Tests that ASSERT_EQ() and friends don't require the arguments to +// be printable. +TEST(ComparisonAssertionTest, AcceptsUnprintableArgs) { +  const UnprintableChar x('x'), y('y'); +  ASSERT_EQ(x, x); +  EXPECT_NE(x, y); +  ASSERT_LT(x, y); +  EXPECT_LE(x, y); +  ASSERT_GT(y, x); +  EXPECT_GE(x, x); + +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), "1-byte object <78>"); +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), "1-byte object <79>"); +  EXPECT_NONFATAL_FAILURE(EXPECT_LT(y, y), "1-byte object <79>"); +  EXPECT_NONFATAL_FAILURE(EXPECT_GT(x, y), "1-byte object <78>"); +  EXPECT_NONFATAL_FAILURE(EXPECT_GT(x, y), "1-byte object <79>"); + +  // Code tested by EXPECT_FATAL_FAILURE cannot reference local +  // variables, so we have to write UnprintableChar('x') instead of x. +#ifndef __BORLANDC__ +  // ICE's in C++Builder. +  EXPECT_FATAL_FAILURE(ASSERT_NE(UnprintableChar('x'), UnprintableChar('x')), +                       "1-byte object <78>"); +  EXPECT_FATAL_FAILURE(ASSERT_LE(UnprintableChar('y'), UnprintableChar('x')), +                       "1-byte object <78>"); +#endif +  EXPECT_FATAL_FAILURE(ASSERT_LE(UnprintableChar('y'), UnprintableChar('x')), +                       "1-byte object <79>"); +  EXPECT_FATAL_FAILURE(ASSERT_GE(UnprintableChar('x'), UnprintableChar('y')), +                       "1-byte object <78>"); +  EXPECT_FATAL_FAILURE(ASSERT_GE(UnprintableChar('x'), UnprintableChar('y')), +                       "1-byte object <79>"); +} + +// Tests the FRIEND_TEST macro. + +// This class has a private member we want to test.  We will test it +// both in a TEST and in a TEST_F. +class Foo { + public: +  Foo() {} + + private: +  int Bar() const { return 1; } + +  // Declares the friend tests that can access the private member +  // Bar(). +  FRIEND_TEST(FRIEND_TEST_Test, TEST); +  FRIEND_TEST(FRIEND_TEST_Test2, TEST_F); +}; + +// Tests that the FRIEND_TEST declaration allows a TEST to access a +// class's private members.  This should compile. +TEST(FRIEND_TEST_Test, TEST) { +  ASSERT_EQ(1, Foo().Bar()); +} + +// The fixture needed to test using FRIEND_TEST with TEST_F. +class FRIEND_TEST_Test2 : public Test { + protected: +  Foo foo; +}; + +// Tests that the FRIEND_TEST declaration allows a TEST_F to access a +// class's private members.  This should compile. +TEST_F(FRIEND_TEST_Test2, TEST_F) { +  ASSERT_EQ(1, foo.Bar()); +} + +// Tests the life cycle of Test objects. + +// The test fixture for testing the life cycle of Test objects. +// +// This class counts the number of live test objects that uses this +// fixture. +class TestLifeCycleTest : public Test { + protected: +  // Constructor.  Increments the number of test objects that uses +  // this fixture. +  TestLifeCycleTest() { count_++; } + +  // Destructor.  Decrements the number of test objects that uses this +  // fixture. +  ~TestLifeCycleTest() { count_--; } + +  // Returns the number of live test objects that uses this fixture. +  int count() const { return count_; } + + private: +  static int count_; +}; + +int TestLifeCycleTest::count_ = 0; + +// Tests the life cycle of test objects. +TEST_F(TestLifeCycleTest, Test1) { +  // There should be only one test object in this test case that's +  // currently alive. +  ASSERT_EQ(1, count()); +} + +// Tests the life cycle of test objects. +TEST_F(TestLifeCycleTest, Test2) { +  // After Test1 is done and Test2 is started, there should still be +  // only one live test object, as the object for Test1 should've been +  // deleted. +  ASSERT_EQ(1, count()); +} + +}  // namespace + +// Tests that the copy constructor works when it is NOT optimized away by +// the compiler. +TEST(AssertionResultTest, CopyConstructorWorksWhenNotOptimied) { +  // Checks that the copy constructor doesn't try to dereference NULL pointers +  // in the source object. +  AssertionResult r1 = AssertionSuccess(); +  AssertionResult r2 = r1; +  // The following line is added to prevent the compiler from optimizing +  // away the constructor call. +  r1 << "abc"; + +  AssertionResult r3 = r1; +  EXPECT_EQ(static_cast<bool>(r3), static_cast<bool>(r1)); +  EXPECT_STREQ("abc", r1.message()); +} + +// Tests that AssertionSuccess and AssertionFailure construct +// AssertionResult objects as expected. +TEST(AssertionResultTest, ConstructionWorks) { +  AssertionResult r1 = AssertionSuccess(); +  EXPECT_TRUE(r1); +  EXPECT_STREQ("", r1.message()); + +  AssertionResult r2 = AssertionSuccess() << "abc"; +  EXPECT_TRUE(r2); +  EXPECT_STREQ("abc", r2.message()); + +  AssertionResult r3 = AssertionFailure(); +  EXPECT_FALSE(r3); +  EXPECT_STREQ("", r3.message()); + +  AssertionResult r4 = AssertionFailure() << "def"; +  EXPECT_FALSE(r4); +  EXPECT_STREQ("def", r4.message()); + +  AssertionResult r5 = AssertionFailure(Message() << "ghi"); +  EXPECT_FALSE(r5); +  EXPECT_STREQ("ghi", r5.message()); +} + +// Tests that the negation flips the predicate result but keeps the message. +TEST(AssertionResultTest, NegationWorks) { +  AssertionResult r1 = AssertionSuccess() << "abc"; +  EXPECT_FALSE(!r1); +  EXPECT_STREQ("abc", (!r1).message()); + +  AssertionResult r2 = AssertionFailure() << "def"; +  EXPECT_TRUE(!r2); +  EXPECT_STREQ("def", (!r2).message()); +} + +TEST(AssertionResultTest, StreamingWorks) { +  AssertionResult r = AssertionSuccess(); +  r << "abc" << 'd' << 0 << true; +  EXPECT_STREQ("abcd0true", r.message()); +} + +TEST(AssertionResultTest, CanStreamOstreamManipulators) { +  AssertionResult r = AssertionSuccess(); +  r << "Data" << std::endl << std::flush << std::ends << "Will be visible"; +  EXPECT_STREQ("Data\n\\0Will be visible", r.message()); +} + +// The next test uses explicit conversion operators -- a C++11 feature. +#if GTEST_LANG_CXX11 + +TEST(AssertionResultTest, ConstructibleFromContextuallyConvertibleToBool) { +  struct ExplicitlyConvertibleToBool { +    explicit operator bool() const { return value; } +    bool value; +  }; +  ExplicitlyConvertibleToBool v1 = {false}; +  ExplicitlyConvertibleToBool v2 = {true}; +  EXPECT_FALSE(v1); +  EXPECT_TRUE(v2); +} + +#endif  // GTEST_LANG_CXX11 + +struct ConvertibleToAssertionResult { +  operator AssertionResult() const { return AssertionResult(true); } +}; + +TEST(AssertionResultTest, ConstructibleFromImplicitlyConvertible) { +  ConvertibleToAssertionResult obj; +  EXPECT_TRUE(obj); +} + +// Tests streaming a user type whose definition and operator << are +// both in the global namespace. +class Base { + public: +  explicit Base(int an_x) : x_(an_x) {} +  int x() const { return x_; } + private: +  int x_; +}; +std::ostream& operator<<(std::ostream& os, +                         const Base& val) { +  return os << val.x(); +} +std::ostream& operator<<(std::ostream& os, +                         const Base* pointer) { +  return os << "(" << pointer->x() << ")"; +} + +TEST(MessageTest, CanStreamUserTypeInGlobalNameSpace) { +  Message msg; +  Base a(1); + +  msg << a << &a;  // Uses ::operator<<. +  EXPECT_STREQ("1(1)", msg.GetString().c_str()); +} + +// Tests streaming a user type whose definition and operator<< are +// both in an unnamed namespace. +namespace { +class MyTypeInUnnamedNameSpace : public Base { + public: +  explicit MyTypeInUnnamedNameSpace(int an_x): Base(an_x) {} +}; +std::ostream& operator<<(std::ostream& os, +                         const MyTypeInUnnamedNameSpace& val) { +  return os << val.x(); +} +std::ostream& operator<<(std::ostream& os, +                         const MyTypeInUnnamedNameSpace* pointer) { +  return os << "(" << pointer->x() << ")"; +} +}  // namespace + +TEST(MessageTest, CanStreamUserTypeInUnnamedNameSpace) { +  Message msg; +  MyTypeInUnnamedNameSpace a(1); + +  msg << a << &a;  // Uses <unnamed_namespace>::operator<<. +  EXPECT_STREQ("1(1)", msg.GetString().c_str()); +} + +// Tests streaming a user type whose definition and operator<< are +// both in a user namespace. +namespace namespace1 { +class MyTypeInNameSpace1 : public Base { + public: +  explicit MyTypeInNameSpace1(int an_x): Base(an_x) {} +}; +std::ostream& operator<<(std::ostream& os, +                         const MyTypeInNameSpace1& val) { +  return os << val.x(); +} +std::ostream& operator<<(std::ostream& os, +                         const MyTypeInNameSpace1* pointer) { +  return os << "(" << pointer->x() << ")"; +} +}  // namespace namespace1 + +TEST(MessageTest, CanStreamUserTypeInUserNameSpace) { +  Message msg; +  namespace1::MyTypeInNameSpace1 a(1); + +  msg << a << &a;  // Uses namespace1::operator<<. +  EXPECT_STREQ("1(1)", msg.GetString().c_str()); +} + +// Tests streaming a user type whose definition is in a user namespace +// but whose operator<< is in the global namespace. +namespace namespace2 { +class MyTypeInNameSpace2 : public ::Base { + public: +  explicit MyTypeInNameSpace2(int an_x): Base(an_x) {} +}; +}  // namespace namespace2 +std::ostream& operator<<(std::ostream& os, +                         const namespace2::MyTypeInNameSpace2& val) { +  return os << val.x(); +} +std::ostream& operator<<(std::ostream& os, +                         const namespace2::MyTypeInNameSpace2* pointer) { +  return os << "(" << pointer->x() << ")"; +} + +TEST(MessageTest, CanStreamUserTypeInUserNameSpaceWithStreamOperatorInGlobal) { +  Message msg; +  namespace2::MyTypeInNameSpace2 a(1); + +  msg << a << &a;  // Uses ::operator<<. +  EXPECT_STREQ("1(1)", msg.GetString().c_str()); +} + +// Tests streaming NULL pointers to testing::Message. +TEST(MessageTest, NullPointers) { +  Message msg; +  char* const p1 = NULL; +  unsigned char* const p2 = NULL; +  int* p3 = NULL; +  double* p4 = NULL; +  bool* p5 = NULL; +  Message* p6 = NULL; + +  msg << p1 << p2 << p3 << p4 << p5 << p6; +  ASSERT_STREQ("(null)(null)(null)(null)(null)(null)", +               msg.GetString().c_str()); +} + +// Tests streaming wide strings to testing::Message. +TEST(MessageTest, WideStrings) { +  // Streams a NULL of type const wchar_t*. +  const wchar_t* const_wstr = NULL; +  EXPECT_STREQ("(null)", +               (Message() << const_wstr).GetString().c_str()); + +  // Streams a NULL of type wchar_t*. +  wchar_t* wstr = NULL; +  EXPECT_STREQ("(null)", +               (Message() << wstr).GetString().c_str()); + +  // Streams a non-NULL of type const wchar_t*. +  const_wstr = L"abc\x8119"; +  EXPECT_STREQ("abc\xe8\x84\x99", +               (Message() << const_wstr).GetString().c_str()); + +  // Streams a non-NULL of type wchar_t*. +  wstr = const_cast<wchar_t*>(const_wstr); +  EXPECT_STREQ("abc\xe8\x84\x99", +               (Message() << wstr).GetString().c_str()); +} + + +// This line tests that we can define tests in the testing namespace. +namespace testing { + +// Tests the TestInfo class. + +class TestInfoTest : public Test { + protected: +  static const TestInfo* GetTestInfo(const char* test_name) { +    const TestCase* const test_case = GetUnitTestImpl()-> +        GetTestCase("TestInfoTest", "", NULL, NULL); + +    for (int i = 0; i < test_case->total_test_count(); ++i) { +      const TestInfo* const test_info = test_case->GetTestInfo(i); +      if (strcmp(test_name, test_info->name()) == 0) +        return test_info; +    } +    return NULL; +  } + +  static const TestResult* GetTestResult( +      const TestInfo* test_info) { +    return test_info->result(); +  } +}; + +// Tests TestInfo::test_case_name() and TestInfo::name(). +TEST_F(TestInfoTest, Names) { +  const TestInfo* const test_info = GetTestInfo("Names"); + +  ASSERT_STREQ("TestInfoTest", test_info->test_case_name()); +  ASSERT_STREQ("Names", test_info->name()); +} + +// Tests TestInfo::result(). +TEST_F(TestInfoTest, result) { +  const TestInfo* const test_info = GetTestInfo("result"); + +  // Initially, there is no TestPartResult for this test. +  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count()); + +  // After the previous assertion, there is still none. +  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count()); +} + +#define VERIFY_CODE_LOCATION \ +  const int expected_line = __LINE__ - 1; \ +  const TestInfo* const test_info = GetUnitTestImpl()->current_test_info(); \ +  ASSERT_TRUE(test_info); \ +  EXPECT_STREQ(__FILE__, test_info->file()); \ +  EXPECT_EQ(expected_line, test_info->line()) + +TEST(CodeLocationForTEST, Verify) { +  VERIFY_CODE_LOCATION; +} + +class CodeLocationForTESTF : public Test { +}; + +TEST_F(CodeLocationForTESTF, Verify) { +  VERIFY_CODE_LOCATION; +} + +class CodeLocationForTESTP : public TestWithParam<int> { +}; + +TEST_P(CodeLocationForTESTP, Verify) { +  VERIFY_CODE_LOCATION; +} + +INSTANTIATE_TEST_CASE_P(, CodeLocationForTESTP, Values(0)); + +template <typename T> +class CodeLocationForTYPEDTEST : public Test { +}; + +TYPED_TEST_CASE(CodeLocationForTYPEDTEST, int); + +TYPED_TEST(CodeLocationForTYPEDTEST, Verify) { +  VERIFY_CODE_LOCATION; +} + +template <typename T> +class CodeLocationForTYPEDTESTP : public Test { +}; + +TYPED_TEST_CASE_P(CodeLocationForTYPEDTESTP); + +TYPED_TEST_P(CodeLocationForTYPEDTESTP, Verify) { +  VERIFY_CODE_LOCATION; +} + +REGISTER_TYPED_TEST_CASE_P(CodeLocationForTYPEDTESTP, Verify); + +INSTANTIATE_TYPED_TEST_CASE_P(My, CodeLocationForTYPEDTESTP, int); + +#undef VERIFY_CODE_LOCATION + +// Tests setting up and tearing down a test case. + +class SetUpTestCaseTest : public Test { + protected: +  // This will be called once before the first test in this test case +  // is run. +  static void SetUpTestCase() { +    printf("Setting up the test case . . .\n"); + +    // Initializes some shared resource.  In this simple example, we +    // just create a C string.  More complex stuff can be done if +    // desired. +    shared_resource_ = "123"; + +    // Increments the number of test cases that have been set up. +    counter_++; + +    // SetUpTestCase() should be called only once. +    EXPECT_EQ(1, counter_); +  } + +  // This will be called once after the last test in this test case is +  // run. +  static void TearDownTestCase() { +    printf("Tearing down the test case . . .\n"); + +    // Decrements the number of test cases that have been set up. +    counter_--; + +    // TearDownTestCase() should be called only once. +    EXPECT_EQ(0, counter_); + +    // Cleans up the shared resource. +    shared_resource_ = NULL; +  } + +  // This will be called before each test in this test case. +  virtual void SetUp() { +    // SetUpTestCase() should be called only once, so counter_ should +    // always be 1. +    EXPECT_EQ(1, counter_); +  } + +  // Number of test cases that have been set up. +  static int counter_; + +  // Some resource to be shared by all tests in this test case. +  static const char* shared_resource_; +}; + +int SetUpTestCaseTest::counter_ = 0; +const char* SetUpTestCaseTest::shared_resource_ = NULL; + +// A test that uses the shared resource. +TEST_F(SetUpTestCaseTest, Test1) { +  EXPECT_STRNE(NULL, shared_resource_); +} + +// Another test that uses the shared resource. +TEST_F(SetUpTestCaseTest, Test2) { +  EXPECT_STREQ("123", shared_resource_); +} + + +// The ParseFlagsTest test case tests ParseGoogleTestFlagsOnly. + +// The Flags struct stores a copy of all Google Test flags. +struct Flags { +  // Constructs a Flags struct where each flag has its default value. +  Flags() : also_run_disabled_tests(false), +            break_on_failure(false), +            catch_exceptions(false), +            death_test_use_fork(false), +            filter(""), +            list_tests(false), +            output(""), +            print_time(true), +            random_seed(0), +            repeat(1), +            shuffle(false), +            stack_trace_depth(kMaxStackTraceDepth), +            stream_result_to(""), +            throw_on_failure(false) {} + +  // Factory methods. + +  // Creates a Flags struct where the gtest_also_run_disabled_tests flag has +  // the given value. +  static Flags AlsoRunDisabledTests(bool also_run_disabled_tests) { +    Flags flags; +    flags.also_run_disabled_tests = also_run_disabled_tests; +    return flags; +  } + +  // Creates a Flags struct where the gtest_break_on_failure flag has +  // the given value. +  static Flags BreakOnFailure(bool break_on_failure) { +    Flags flags; +    flags.break_on_failure = break_on_failure; +    return flags; +  } + +  // Creates a Flags struct where the gtest_catch_exceptions flag has +  // the given value. +  static Flags CatchExceptions(bool catch_exceptions) { +    Flags flags; +    flags.catch_exceptions = catch_exceptions; +    return flags; +  } + +  // Creates a Flags struct where the gtest_death_test_use_fork flag has +  // the given value. +  static Flags DeathTestUseFork(bool death_test_use_fork) { +    Flags flags; +    flags.death_test_use_fork = death_test_use_fork; +    return flags; +  } + +  // Creates a Flags struct where the gtest_filter flag has the given +  // value. +  static Flags Filter(const char* filter) { +    Flags flags; +    flags.filter = filter; +    return flags; +  } + +  // Creates a Flags struct where the gtest_list_tests flag has the +  // given value. +  static Flags ListTests(bool list_tests) { +    Flags flags; +    flags.list_tests = list_tests; +    return flags; +  } + +  // Creates a Flags struct where the gtest_output flag has the given +  // value. +  static Flags Output(const char* output) { +    Flags flags; +    flags.output = output; +    return flags; +  } + +  // Creates a Flags struct where the gtest_print_time flag has the given +  // value. +  static Flags PrintTime(bool print_time) { +    Flags flags; +    flags.print_time = print_time; +    return flags; +  } + +  // Creates a Flags struct where the gtest_random_seed flag has the given +  // value. +  static Flags RandomSeed(Int32 random_seed) { +    Flags flags; +    flags.random_seed = random_seed; +    return flags; +  } + +  // Creates a Flags struct where the gtest_repeat flag has the given +  // value. +  static Flags Repeat(Int32 repeat) { +    Flags flags; +    flags.repeat = repeat; +    return flags; +  } + +  // Creates a Flags struct where the gtest_shuffle flag has the given +  // value. +  static Flags Shuffle(bool shuffle) { +    Flags flags; +    flags.shuffle = shuffle; +    return flags; +  } + +  // Creates a Flags struct where the GTEST_FLAG(stack_trace_depth) flag has +  // the given value. +  static Flags StackTraceDepth(Int32 stack_trace_depth) { +    Flags flags; +    flags.stack_trace_depth = stack_trace_depth; +    return flags; +  } + +  // Creates a Flags struct where the GTEST_FLAG(stream_result_to) flag has +  // the given value. +  static Flags StreamResultTo(const char* stream_result_to) { +    Flags flags; +    flags.stream_result_to = stream_result_to; +    return flags; +  } + +  // Creates a Flags struct where the gtest_throw_on_failure flag has +  // the given value. +  static Flags ThrowOnFailure(bool throw_on_failure) { +    Flags flags; +    flags.throw_on_failure = throw_on_failure; +    return flags; +  } + +  // These fields store the flag values. +  bool also_run_disabled_tests; +  bool break_on_failure; +  bool catch_exceptions; +  bool death_test_use_fork; +  const char* filter; +  bool list_tests; +  const char* output; +  bool print_time; +  Int32 random_seed; +  Int32 repeat; +  bool shuffle; +  Int32 stack_trace_depth; +  const char* stream_result_to; +  bool throw_on_failure; +}; + +// Fixture for testing ParseGoogleTestFlagsOnly(). +class ParseFlagsTest : public Test { + protected: +  // Clears the flags before each test. +  virtual void SetUp() { +    GTEST_FLAG(also_run_disabled_tests) = false; +    GTEST_FLAG(break_on_failure) = false; +    GTEST_FLAG(catch_exceptions) = false; +    GTEST_FLAG(death_test_use_fork) = false; +    GTEST_FLAG(filter) = ""; +    GTEST_FLAG(list_tests) = false; +    GTEST_FLAG(output) = ""; +    GTEST_FLAG(print_time) = true; +    GTEST_FLAG(random_seed) = 0; +    GTEST_FLAG(repeat) = 1; +    GTEST_FLAG(shuffle) = false; +    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth; +    GTEST_FLAG(stream_result_to) = ""; +    GTEST_FLAG(throw_on_failure) = false; +  } + +  // Asserts that two narrow or wide string arrays are equal. +  template <typename CharType> +  static void AssertStringArrayEq(size_t size1, CharType** array1, +                                  size_t size2, CharType** array2) { +    ASSERT_EQ(size1, size2) << " Array sizes different."; + +    for (size_t i = 0; i != size1; i++) { +      ASSERT_STREQ(array1[i], array2[i]) << " where i == " << i; +    } +  } + +  // Verifies that the flag values match the expected values. +  static void CheckFlags(const Flags& expected) { +    EXPECT_EQ(expected.also_run_disabled_tests, +              GTEST_FLAG(also_run_disabled_tests)); +    EXPECT_EQ(expected.break_on_failure, GTEST_FLAG(break_on_failure)); +    EXPECT_EQ(expected.catch_exceptions, GTEST_FLAG(catch_exceptions)); +    EXPECT_EQ(expected.death_test_use_fork, GTEST_FLAG(death_test_use_fork)); +    EXPECT_STREQ(expected.filter, GTEST_FLAG(filter).c_str()); +    EXPECT_EQ(expected.list_tests, GTEST_FLAG(list_tests)); +    EXPECT_STREQ(expected.output, GTEST_FLAG(output).c_str()); +    EXPECT_EQ(expected.print_time, GTEST_FLAG(print_time)); +    EXPECT_EQ(expected.random_seed, GTEST_FLAG(random_seed)); +    EXPECT_EQ(expected.repeat, GTEST_FLAG(repeat)); +    EXPECT_EQ(expected.shuffle, GTEST_FLAG(shuffle)); +    EXPECT_EQ(expected.stack_trace_depth, GTEST_FLAG(stack_trace_depth)); +    EXPECT_STREQ(expected.stream_result_to, +                 GTEST_FLAG(stream_result_to).c_str()); +    EXPECT_EQ(expected.throw_on_failure, GTEST_FLAG(throw_on_failure)); +  } + +  // Parses a command line (specified by argc1 and argv1), then +  // verifies that the flag values are expected and that the +  // recognized flags are removed from the command line. +  template <typename CharType> +  static void TestParsingFlags(int argc1, const CharType** argv1, +                               int argc2, const CharType** argv2, +                               const Flags& expected, bool should_print_help) { +    const bool saved_help_flag = ::testing::internal::g_help_flag; +    ::testing::internal::g_help_flag = false; + +# if GTEST_HAS_STREAM_REDIRECTION +    CaptureStdout(); +# endif + +    // Parses the command line. +    internal::ParseGoogleTestFlagsOnly(&argc1, const_cast<CharType**>(argv1)); + +# if GTEST_HAS_STREAM_REDIRECTION +    const std::string captured_stdout = GetCapturedStdout(); +# endif + +    // Verifies the flag values. +    CheckFlags(expected); + +    // Verifies that the recognized flags are removed from the command +    // line. +    AssertStringArrayEq(argc1 + 1, argv1, argc2 + 1, argv2); + +    // ParseGoogleTestFlagsOnly should neither set g_help_flag nor print the +    // help message for the flags it recognizes. +    EXPECT_EQ(should_print_help, ::testing::internal::g_help_flag); + +# if GTEST_HAS_STREAM_REDIRECTION +    const char* const expected_help_fragment = +        "This program contains tests written using"; +    if (should_print_help) { +      EXPECT_PRED_FORMAT2(IsSubstring, expected_help_fragment, captured_stdout); +    } else { +      EXPECT_PRED_FORMAT2(IsNotSubstring, +                          expected_help_fragment, captured_stdout); +    } +# endif  // GTEST_HAS_STREAM_REDIRECTION + +    ::testing::internal::g_help_flag = saved_help_flag; +  } + +  // This macro wraps TestParsingFlags s.t. the user doesn't need +  // to specify the array sizes. + +# define GTEST_TEST_PARSING_FLAGS_(argv1, argv2, expected, should_print_help) \ +  TestParsingFlags(sizeof(argv1)/sizeof(*argv1) - 1, argv1, \ +                   sizeof(argv2)/sizeof(*argv2) - 1, argv2, \ +                   expected, should_print_help) +}; + +// Tests parsing an empty command line. +TEST_F(ParseFlagsTest, Empty) { +  const char* argv[] = { +    NULL +  }; + +  const char* argv2[] = { +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false); +} + +// Tests parsing a command line that has no flag. +TEST_F(ParseFlagsTest, NoFlag) { +  const char* argv[] = { +    "foo.exe", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false); +} + +// Tests parsing a bad --gtest_filter flag. +TEST_F(ParseFlagsTest, FilterBad) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_filter", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    "--gtest_filter", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(""), true); +} + +// Tests parsing an empty --gtest_filter flag. +TEST_F(ParseFlagsTest, FilterEmpty) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_filter=", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(""), false); +} + +// Tests parsing a non-empty --gtest_filter flag. +TEST_F(ParseFlagsTest, FilterNonEmpty) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_filter=abc", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("abc"), false); +} + +// Tests parsing --gtest_break_on_failure. +TEST_F(ParseFlagsTest, BreakOnFailureWithoutValue) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_break_on_failure", +    NULL +}; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false); +} + +// Tests parsing --gtest_break_on_failure=0. +TEST_F(ParseFlagsTest, BreakOnFailureFalse_0) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_break_on_failure=0", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false); +} + +// Tests parsing --gtest_break_on_failure=f. +TEST_F(ParseFlagsTest, BreakOnFailureFalse_f) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_break_on_failure=f", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false); +} + +// Tests parsing --gtest_break_on_failure=F. +TEST_F(ParseFlagsTest, BreakOnFailureFalse_F) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_break_on_failure=F", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false); +} + +// Tests parsing a --gtest_break_on_failure flag that has a "true" +// definition. +TEST_F(ParseFlagsTest, BreakOnFailureTrue) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_break_on_failure=1", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false); +} + +// Tests parsing --gtest_catch_exceptions. +TEST_F(ParseFlagsTest, CatchExceptions) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_catch_exceptions", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::CatchExceptions(true), false); +} + +// Tests parsing --gtest_death_test_use_fork. +TEST_F(ParseFlagsTest, DeathTestUseFork) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_death_test_use_fork", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::DeathTestUseFork(true), false); +} + +// Tests having the same flag twice with different values.  The +// expected behavior is that the one coming last takes precedence. +TEST_F(ParseFlagsTest, DuplicatedFlags) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_filter=a", +    "--gtest_filter=b", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("b"), false); +} + +// Tests having an unrecognized flag on the command line. +TEST_F(ParseFlagsTest, UnrecognizedFlag) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_break_on_failure", +    "bar",  // Unrecognized by Google Test. +    "--gtest_filter=b", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    "bar", +    NULL +  }; + +  Flags flags; +  flags.break_on_failure = true; +  flags.filter = "b"; +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, flags, false); +} + +// Tests having a --gtest_list_tests flag +TEST_F(ParseFlagsTest, ListTestsFlag) { +    const char* argv[] = { +      "foo.exe", +      "--gtest_list_tests", +      NULL +    }; + +    const char* argv2[] = { +      "foo.exe", +      NULL +    }; + +    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false); +} + +// Tests having a --gtest_list_tests flag with a "true" value +TEST_F(ParseFlagsTest, ListTestsTrue) { +    const char* argv[] = { +      "foo.exe", +      "--gtest_list_tests=1", +      NULL +    }; + +    const char* argv2[] = { +      "foo.exe", +      NULL +    }; + +    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false); +} + +// Tests having a --gtest_list_tests flag with a "false" value +TEST_F(ParseFlagsTest, ListTestsFalse) { +    const char* argv[] = { +      "foo.exe", +      "--gtest_list_tests=0", +      NULL +    }; + +    const char* argv2[] = { +      "foo.exe", +      NULL +    }; + +    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false); +} + +// Tests parsing --gtest_list_tests=f. +TEST_F(ParseFlagsTest, ListTestsFalse_f) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_list_tests=f", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false); +} + +// Tests parsing --gtest_list_tests=F. +TEST_F(ParseFlagsTest, ListTestsFalse_F) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_list_tests=F", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false); +} + +// Tests parsing --gtest_output (invalid). +TEST_F(ParseFlagsTest, OutputEmpty) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_output", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    "--gtest_output", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), true); +} + +// Tests parsing --gtest_output=xml +TEST_F(ParseFlagsTest, OutputXml) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_output=xml", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output("xml"), false); +} + +// Tests parsing --gtest_output=xml:file +TEST_F(ParseFlagsTest, OutputXmlFile) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_output=xml:file", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output("xml:file"), false); +} + +// Tests parsing --gtest_output=xml:directory/path/ +TEST_F(ParseFlagsTest, OutputXmlDirectory) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_output=xml:directory/path/", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, +                            Flags::Output("xml:directory/path/"), false); +} + +// Tests having a --gtest_print_time flag +TEST_F(ParseFlagsTest, PrintTimeFlag) { +    const char* argv[] = { +      "foo.exe", +      "--gtest_print_time", +      NULL +    }; + +    const char* argv2[] = { +      "foo.exe", +      NULL +    }; + +    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false); +} + +// Tests having a --gtest_print_time flag with a "true" value +TEST_F(ParseFlagsTest, PrintTimeTrue) { +    const char* argv[] = { +      "foo.exe", +      "--gtest_print_time=1", +      NULL +    }; + +    const char* argv2[] = { +      "foo.exe", +      NULL +    }; + +    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false); +} + +// Tests having a --gtest_print_time flag with a "false" value +TEST_F(ParseFlagsTest, PrintTimeFalse) { +    const char* argv[] = { +      "foo.exe", +      "--gtest_print_time=0", +      NULL +    }; + +    const char* argv2[] = { +      "foo.exe", +      NULL +    }; + +    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false); +} + +// Tests parsing --gtest_print_time=f. +TEST_F(ParseFlagsTest, PrintTimeFalse_f) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_print_time=f", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false); +} + +// Tests parsing --gtest_print_time=F. +TEST_F(ParseFlagsTest, PrintTimeFalse_F) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_print_time=F", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false); +} + +// Tests parsing --gtest_random_seed=number +TEST_F(ParseFlagsTest, RandomSeed) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_random_seed=1000", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::RandomSeed(1000), false); +} + +// Tests parsing --gtest_repeat=number +TEST_F(ParseFlagsTest, Repeat) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_repeat=1000", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Repeat(1000), false); +} + +// Tests having a --gtest_also_run_disabled_tests flag +TEST_F(ParseFlagsTest, AlsoRunDisabledTestsFlag) { +    const char* argv[] = { +      "foo.exe", +      "--gtest_also_run_disabled_tests", +      NULL +    }; + +    const char* argv2[] = { +      "foo.exe", +      NULL +    }; + +    GTEST_TEST_PARSING_FLAGS_(argv, argv2, +                              Flags::AlsoRunDisabledTests(true), false); +} + +// Tests having a --gtest_also_run_disabled_tests flag with a "true" value +TEST_F(ParseFlagsTest, AlsoRunDisabledTestsTrue) { +    const char* argv[] = { +      "foo.exe", +      "--gtest_also_run_disabled_tests=1", +      NULL +    }; + +    const char* argv2[] = { +      "foo.exe", +      NULL +    }; + +    GTEST_TEST_PARSING_FLAGS_(argv, argv2, +                              Flags::AlsoRunDisabledTests(true), false); +} + +// Tests having a --gtest_also_run_disabled_tests flag with a "false" value +TEST_F(ParseFlagsTest, AlsoRunDisabledTestsFalse) { +    const char* argv[] = { +      "foo.exe", +      "--gtest_also_run_disabled_tests=0", +      NULL +    }; + +    const char* argv2[] = { +      "foo.exe", +      NULL +    }; + +    GTEST_TEST_PARSING_FLAGS_(argv, argv2, +                              Flags::AlsoRunDisabledTests(false), false); +} + +// Tests parsing --gtest_shuffle. +TEST_F(ParseFlagsTest, ShuffleWithoutValue) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_shuffle", +    NULL +}; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false); +} + +// Tests parsing --gtest_shuffle=0. +TEST_F(ParseFlagsTest, ShuffleFalse_0) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_shuffle=0", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(false), false); +} + +// Tests parsing a --gtest_shuffle flag that has a "true" definition. +TEST_F(ParseFlagsTest, ShuffleTrue) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_shuffle=1", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false); +} + +// Tests parsing --gtest_stack_trace_depth=number. +TEST_F(ParseFlagsTest, StackTraceDepth) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_stack_trace_depth=5", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::StackTraceDepth(5), false); +} + +TEST_F(ParseFlagsTest, StreamResultTo) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_stream_result_to=localhost:1234", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_( +      argv, argv2, Flags::StreamResultTo("localhost:1234"), false); +} + +// Tests parsing --gtest_throw_on_failure. +TEST_F(ParseFlagsTest, ThrowOnFailureWithoutValue) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_throw_on_failure", +    NULL +}; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false); +} + +// Tests parsing --gtest_throw_on_failure=0. +TEST_F(ParseFlagsTest, ThrowOnFailureFalse_0) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_throw_on_failure=0", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(false), false); +} + +// Tests parsing a --gtest_throw_on_failure flag that has a "true" +// definition. +TEST_F(ParseFlagsTest, ThrowOnFailureTrue) { +  const char* argv[] = { +    "foo.exe", +    "--gtest_throw_on_failure=1", +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false); +} + +# if GTEST_OS_WINDOWS +// Tests parsing wide strings. +TEST_F(ParseFlagsTest, WideStrings) { +  const wchar_t* argv[] = { +    L"foo.exe", +    L"--gtest_filter=Foo*", +    L"--gtest_list_tests=1", +    L"--gtest_break_on_failure", +    L"--non_gtest_flag", +    NULL +  }; + +  const wchar_t* argv2[] = { +    L"foo.exe", +    L"--non_gtest_flag", +    NULL +  }; + +  Flags expected_flags; +  expected_flags.break_on_failure = true; +  expected_flags.filter = "Foo*"; +  expected_flags.list_tests = true; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, expected_flags, false); +} +# endif  // GTEST_OS_WINDOWS + +#if GTEST_USE_OWN_FLAGFILE_FLAG_ +class FlagfileTest : public ParseFlagsTest { + public: +  virtual void SetUp() { +    ParseFlagsTest::SetUp(); + +    testdata_path_.Set(internal::FilePath( +        testing::TempDir() + internal::GetCurrentExecutableName().string() + +        "_flagfile_test")); +    testing::internal::posix::RmDir(testdata_path_.c_str()); +    EXPECT_TRUE(testdata_path_.CreateFolder()); +  } + +  virtual void TearDown() { +    testing::internal::posix::RmDir(testdata_path_.c_str()); +    ParseFlagsTest::TearDown(); +  } + +  internal::FilePath CreateFlagfile(const char* contents) { +    internal::FilePath file_path(internal::FilePath::GenerateUniqueFileName( +        testdata_path_, internal::FilePath("unique"), "txt")); +    FILE* f = testing::internal::posix::FOpen(file_path.c_str(), "w"); +    fprintf(f, "%s", contents); +    fclose(f); +    return file_path; +  } + + private: +  internal::FilePath testdata_path_; +}; + +// Tests an empty flagfile. +TEST_F(FlagfileTest, Empty) { +  internal::FilePath flagfile_path(CreateFlagfile("")); +  std::string flagfile_flag = +      std::string("--" GTEST_FLAG_PREFIX_ "flagfile=") + flagfile_path.c_str(); + +  const char* argv[] = { +    "foo.exe", +    flagfile_flag.c_str(), +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false); +} + +// Tests passing a non-empty --gtest_filter flag via --gtest_flagfile. +TEST_F(FlagfileTest, FilterNonEmpty) { +  internal::FilePath flagfile_path(CreateFlagfile( +      "--"  GTEST_FLAG_PREFIX_  "filter=abc")); +  std::string flagfile_flag = +      std::string("--" GTEST_FLAG_PREFIX_ "flagfile=") + flagfile_path.c_str(); + +  const char* argv[] = { +    "foo.exe", +    flagfile_flag.c_str(), +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("abc"), false); +} + +// Tests passing several flags via --gtest_flagfile. +TEST_F(FlagfileTest, SeveralFlags) { +  internal::FilePath flagfile_path(CreateFlagfile( +      "--"  GTEST_FLAG_PREFIX_  "filter=abc\n" +      "--"  GTEST_FLAG_PREFIX_  "break_on_failure\n" +      "--"  GTEST_FLAG_PREFIX_  "list_tests")); +  std::string flagfile_flag = +      std::string("--" GTEST_FLAG_PREFIX_ "flagfile=") + flagfile_path.c_str(); + +  const char* argv[] = { +    "foo.exe", +    flagfile_flag.c_str(), +    NULL +  }; + +  const char* argv2[] = { +    "foo.exe", +    NULL +  }; + +  Flags expected_flags; +  expected_flags.break_on_failure = true; +  expected_flags.filter = "abc"; +  expected_flags.list_tests = true; + +  GTEST_TEST_PARSING_FLAGS_(argv, argv2, expected_flags, false); +} +#endif  // GTEST_USE_OWN_FLAGFILE_FLAG_ + +// Tests current_test_info() in UnitTest. +class CurrentTestInfoTest : public Test { + protected: +  // Tests that current_test_info() returns NULL before the first test in +  // the test case is run. +  static void SetUpTestCase() { +    // There should be no tests running at this point. +    const TestInfo* test_info = +      UnitTest::GetInstance()->current_test_info(); +    EXPECT_TRUE(test_info == NULL) +        << "There should be no tests running at this point."; +  } + +  // Tests that current_test_info() returns NULL after the last test in +  // the test case has run. +  static void TearDownTestCase() { +    const TestInfo* test_info = +      UnitTest::GetInstance()->current_test_info(); +    EXPECT_TRUE(test_info == NULL) +        << "There should be no tests running at this point."; +  } +}; + +// Tests that current_test_info() returns TestInfo for currently running +// test by checking the expected test name against the actual one. +TEST_F(CurrentTestInfoTest, WorksForFirstTestInATestCase) { +  const TestInfo* test_info = +    UnitTest::GetInstance()->current_test_info(); +  ASSERT_TRUE(NULL != test_info) +      << "There is a test running so we should have a valid TestInfo."; +  EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name()) +      << "Expected the name of the currently running test case."; +  EXPECT_STREQ("WorksForFirstTestInATestCase", test_info->name()) +      << "Expected the name of the currently running test."; +} + +// Tests that current_test_info() returns TestInfo for currently running +// test by checking the expected test name against the actual one.  We +// use this test to see that the TestInfo object actually changed from +// the previous invocation. +TEST_F(CurrentTestInfoTest, WorksForSecondTestInATestCase) { +  const TestInfo* test_info = +    UnitTest::GetInstance()->current_test_info(); +  ASSERT_TRUE(NULL != test_info) +      << "There is a test running so we should have a valid TestInfo."; +  EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name()) +      << "Expected the name of the currently running test case."; +  EXPECT_STREQ("WorksForSecondTestInATestCase", test_info->name()) +      << "Expected the name of the currently running test."; +} + +}  // namespace testing + + +// These two lines test that we can define tests in a namespace that +// has the name "testing" and is nested in another namespace. +namespace my_namespace { +namespace testing { + +// Makes sure that TEST knows to use ::testing::Test instead of +// ::my_namespace::testing::Test. +class Test {}; + +// Makes sure that an assertion knows to use ::testing::Message instead of +// ::my_namespace::testing::Message. +class Message {}; + +// Makes sure that an assertion knows to use +// ::testing::AssertionResult instead of +// ::my_namespace::testing::AssertionResult. +class AssertionResult {}; + +// Tests that an assertion that should succeed works as expected. +TEST(NestedTestingNamespaceTest, Success) { +  EXPECT_EQ(1, 1) << "This shouldn't fail."; +} + +// Tests that an assertion that should fail works as expected. +TEST(NestedTestingNamespaceTest, Failure) { +  EXPECT_FATAL_FAILURE(FAIL() << "This failure is expected.", +                       "This failure is expected."); +} + +}  // namespace testing +}  // namespace my_namespace + +// Tests that one can call superclass SetUp and TearDown methods-- +// that is, that they are not private. +// No tests are based on this fixture; the test "passes" if it compiles +// successfully. +class ProtectedFixtureMethodsTest : public Test { + protected: +  virtual void SetUp() { +    Test::SetUp(); +  } +  virtual void TearDown() { +    Test::TearDown(); +  } +}; + +// StreamingAssertionsTest tests the streaming versions of a representative +// sample of assertions. +TEST(StreamingAssertionsTest, Unconditional) { +  SUCCEED() << "expected success"; +  EXPECT_NONFATAL_FAILURE(ADD_FAILURE() << "expected failure", +                          "expected failure"); +  EXPECT_FATAL_FAILURE(FAIL() << "expected failure", +                       "expected failure"); +} + +#ifdef __BORLANDC__ +// Silences warnings: "Condition is always true", "Unreachable code" +# pragma option push -w-ccc -w-rch +#endif + +TEST(StreamingAssertionsTest, Truth) { +  EXPECT_TRUE(true) << "unexpected failure"; +  ASSERT_TRUE(true) << "unexpected failure"; +  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "expected failure", +                          "expected failure"); +  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false) << "expected failure", +                       "expected failure"); +} + +TEST(StreamingAssertionsTest, Truth2) { +  EXPECT_FALSE(false) << "unexpected failure"; +  ASSERT_FALSE(false) << "unexpected failure"; +  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "expected failure", +                          "expected failure"); +  EXPECT_FATAL_FAILURE(ASSERT_FALSE(true) << "expected failure", +                       "expected failure"); +} + +#ifdef __BORLANDC__ +// Restores warnings after previous "#pragma option push" suppressed them +# pragma option pop +#endif + +TEST(StreamingAssertionsTest, IntegerEquals) { +  EXPECT_EQ(1, 1) << "unexpected failure"; +  ASSERT_EQ(1, 1) << "unexpected failure"; +  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(1, 2) << "expected failure", +                          "expected failure"); +  EXPECT_FATAL_FAILURE(ASSERT_EQ(1, 2) << "expected failure", +                       "expected failure"); +} + +TEST(StreamingAssertionsTest, IntegerLessThan) { +  EXPECT_LT(1, 2) << "unexpected failure"; +  ASSERT_LT(1, 2) << "unexpected failure"; +  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1) << "expected failure", +                          "expected failure"); +  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 1) << "expected failure", +                       "expected failure"); +} + +TEST(StreamingAssertionsTest, StringsEqual) { +  EXPECT_STREQ("foo", "foo") << "unexpected failure"; +  ASSERT_STREQ("foo", "foo") << "unexpected failure"; +  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ("foo", "bar") << "expected failure", +                          "expected failure"); +  EXPECT_FATAL_FAILURE(ASSERT_STREQ("foo", "bar") << "expected failure", +                       "expected failure"); +} + +TEST(StreamingAssertionsTest, StringsNotEqual) { +  EXPECT_STRNE("foo", "bar") << "unexpected failure"; +  ASSERT_STRNE("foo", "bar") << "unexpected failure"; +  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE("foo", "foo") << "expected failure", +                          "expected failure"); +  EXPECT_FATAL_FAILURE(ASSERT_STRNE("foo", "foo") << "expected failure", +                       "expected failure"); +} + +TEST(StreamingAssertionsTest, StringsEqualIgnoringCase) { +  EXPECT_STRCASEEQ("foo", "FOO") << "unexpected failure"; +  ASSERT_STRCASEEQ("foo", "FOO") << "unexpected failure"; +  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ("foo", "bar") << "expected failure", +                          "expected failure"); +  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("foo", "bar") << "expected failure", +                       "expected failure"); +} + +TEST(StreamingAssertionsTest, StringNotEqualIgnoringCase) { +  EXPECT_STRCASENE("foo", "bar") << "unexpected failure"; +  ASSERT_STRCASENE("foo", "bar") << "unexpected failure"; +  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE("foo", "FOO") << "expected failure", +                          "expected failure"); +  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("bar", "BAR") << "expected failure", +                       "expected failure"); +} + +TEST(StreamingAssertionsTest, FloatingPointEquals) { +  EXPECT_FLOAT_EQ(1.0, 1.0) << "unexpected failure"; +  ASSERT_FLOAT_EQ(1.0, 1.0) << "unexpected failure"; +  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(0.0, 1.0) << "expected failure", +                          "expected failure"); +  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.0) << "expected failure", +                       "expected failure"); +} + +#if GTEST_HAS_EXCEPTIONS + +TEST(StreamingAssertionsTest, Throw) { +  EXPECT_THROW(ThrowAnInteger(), int) << "unexpected failure"; +  ASSERT_THROW(ThrowAnInteger(), int) << "unexpected failure"; +  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool) << +                          "expected failure", "expected failure"); +  EXPECT_FATAL_FAILURE(ASSERT_THROW(ThrowAnInteger(), bool) << +                       "expected failure", "expected failure"); +} + +TEST(StreamingAssertionsTest, NoThrow) { +  EXPECT_NO_THROW(ThrowNothing()) << "unexpected failure"; +  ASSERT_NO_THROW(ThrowNothing()) << "unexpected failure"; +  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()) << +                          "expected failure", "expected failure"); +  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()) << +                       "expected failure", "expected failure"); +} + +TEST(StreamingAssertionsTest, AnyThrow) { +  EXPECT_ANY_THROW(ThrowAnInteger()) << "unexpected failure"; +  ASSERT_ANY_THROW(ThrowAnInteger()) << "unexpected failure"; +  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(ThrowNothing()) << +                          "expected failure", "expected failure"); +  EXPECT_FATAL_FAILURE(ASSERT_ANY_THROW(ThrowNothing()) << +                       "expected failure", "expected failure"); +} + +#endif  // GTEST_HAS_EXCEPTIONS + +// Tests that Google Test correctly decides whether to use colors in the output. + +TEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsYes) { +  GTEST_FLAG(color) = "yes"; + +  SetEnv("TERM", "xterm");  // TERM supports colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. +  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY. + +  SetEnv("TERM", "dumb");  // TERM doesn't support colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. +  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY. +} + +TEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsAliasOfYes) { +  SetEnv("TERM", "dumb");  // TERM doesn't support colors. + +  GTEST_FLAG(color) = "True"; +  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY. + +  GTEST_FLAG(color) = "t"; +  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY. + +  GTEST_FLAG(color) = "1"; +  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY. +} + +TEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsNo) { +  GTEST_FLAG(color) = "no"; + +  SetEnv("TERM", "xterm");  // TERM supports colors. +  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY. +  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY. + +  SetEnv("TERM", "dumb");  // TERM doesn't support colors. +  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY. +  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY. +} + +TEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsInvalid) { +  SetEnv("TERM", "xterm");  // TERM supports colors. + +  GTEST_FLAG(color) = "F"; +  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY. + +  GTEST_FLAG(color) = "0"; +  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY. + +  GTEST_FLAG(color) = "unknown"; +  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY. +} + +TEST(ColoredOutputTest, UsesColorsWhenStdoutIsTty) { +  GTEST_FLAG(color) = "auto"; + +  SetEnv("TERM", "xterm");  // TERM supports colors. +  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY. +  EXPECT_TRUE(ShouldUseColor(true));    // Stdout is a TTY. +} + +TEST(ColoredOutputTest, UsesColorsWhenTermSupportsColors) { +  GTEST_FLAG(color) = "auto"; + +#if GTEST_OS_WINDOWS +  // On Windows, we ignore the TERM variable as it's usually not set. + +  SetEnv("TERM", "dumb"); +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", ""); +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "xterm"); +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. +#else +  // On non-Windows platforms, we rely on TERM to determine if the +  // terminal supports colors. + +  SetEnv("TERM", "dumb");  // TERM doesn't support colors. +  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "emacs");  // TERM doesn't support colors. +  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "vt100");  // TERM doesn't support colors. +  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "xterm-mono");  // TERM doesn't support colors. +  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "xterm");  // TERM supports colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "xterm-color");  // TERM supports colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "xterm-256color");  // TERM supports colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "screen");  // TERM supports colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "screen-256color");  // TERM supports colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "tmux");  // TERM supports colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "tmux-256color");  // TERM supports colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "rxvt-unicode");  // TERM supports colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "rxvt-unicode-256color");  // TERM supports colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "linux");  // TERM supports colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. + +  SetEnv("TERM", "cygwin");  // TERM supports colors. +  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY. +#endif  // GTEST_OS_WINDOWS +} + +// Verifies that StaticAssertTypeEq works in a namespace scope. + +static bool dummy1 GTEST_ATTRIBUTE_UNUSED_ = StaticAssertTypeEq<bool, bool>(); +static bool dummy2 GTEST_ATTRIBUTE_UNUSED_ = +    StaticAssertTypeEq<const int, const int>(); + +// Verifies that StaticAssertTypeEq works in a class. + +template <typename T> +class StaticAssertTypeEqTestHelper { + public: +  StaticAssertTypeEqTestHelper() { StaticAssertTypeEq<bool, T>(); } +}; + +TEST(StaticAssertTypeEqTest, WorksInClass) { +  StaticAssertTypeEqTestHelper<bool>(); +} + +// Verifies that StaticAssertTypeEq works inside a function. + +typedef int IntAlias; + +TEST(StaticAssertTypeEqTest, CompilesForEqualTypes) { +  StaticAssertTypeEq<int, IntAlias>(); +  StaticAssertTypeEq<int*, IntAlias*>(); +} + +TEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsNoFailure) { +  EXPECT_FALSE(HasNonfatalFailure()); +} + +static void FailFatally() { FAIL(); } + +TEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsOnlyFatalFailure) { +  FailFatally(); +  const bool has_nonfatal_failure = HasNonfatalFailure(); +  ClearCurrentTestPartResults(); +  EXPECT_FALSE(has_nonfatal_failure); +} + +TEST(HasNonfatalFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) { +  ADD_FAILURE(); +  const bool has_nonfatal_failure = HasNonfatalFailure(); +  ClearCurrentTestPartResults(); +  EXPECT_TRUE(has_nonfatal_failure); +} + +TEST(HasNonfatalFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) { +  FailFatally(); +  ADD_FAILURE(); +  const bool has_nonfatal_failure = HasNonfatalFailure(); +  ClearCurrentTestPartResults(); +  EXPECT_TRUE(has_nonfatal_failure); +} + +// A wrapper for calling HasNonfatalFailure outside of a test body. +static bool HasNonfatalFailureHelper() { +  return testing::Test::HasNonfatalFailure(); +} + +TEST(HasNonfatalFailureTest, WorksOutsideOfTestBody) { +  EXPECT_FALSE(HasNonfatalFailureHelper()); +} + +TEST(HasNonfatalFailureTest, WorksOutsideOfTestBody2) { +  ADD_FAILURE(); +  const bool has_nonfatal_failure = HasNonfatalFailureHelper(); +  ClearCurrentTestPartResults(); +  EXPECT_TRUE(has_nonfatal_failure); +} + +TEST(HasFailureTest, ReturnsFalseWhenThereIsNoFailure) { +  EXPECT_FALSE(HasFailure()); +} + +TEST(HasFailureTest, ReturnsTrueWhenThereIsFatalFailure) { +  FailFatally(); +  const bool has_failure = HasFailure(); +  ClearCurrentTestPartResults(); +  EXPECT_TRUE(has_failure); +} + +TEST(HasFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) { +  ADD_FAILURE(); +  const bool has_failure = HasFailure(); +  ClearCurrentTestPartResults(); +  EXPECT_TRUE(has_failure); +} + +TEST(HasFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) { +  FailFatally(); +  ADD_FAILURE(); +  const bool has_failure = HasFailure(); +  ClearCurrentTestPartResults(); +  EXPECT_TRUE(has_failure); +} + +// A wrapper for calling HasFailure outside of a test body. +static bool HasFailureHelper() { return testing::Test::HasFailure(); } + +TEST(HasFailureTest, WorksOutsideOfTestBody) { +  EXPECT_FALSE(HasFailureHelper()); +} + +TEST(HasFailureTest, WorksOutsideOfTestBody2) { +  ADD_FAILURE(); +  const bool has_failure = HasFailureHelper(); +  ClearCurrentTestPartResults(); +  EXPECT_TRUE(has_failure); +} + +class TestListener : public EmptyTestEventListener { + public: +  TestListener() : on_start_counter_(NULL), is_destroyed_(NULL) {} +  TestListener(int* on_start_counter, bool* is_destroyed) +      : on_start_counter_(on_start_counter), +        is_destroyed_(is_destroyed) {} + +  virtual ~TestListener() { +    if (is_destroyed_) +      *is_destroyed_ = true; +  } + + protected: +  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) { +    if (on_start_counter_ != NULL) +      (*on_start_counter_)++; +  } + + private: +  int* on_start_counter_; +  bool* is_destroyed_; +}; + +// Tests the constructor. +TEST(TestEventListenersTest, ConstructionWorks) { +  TestEventListeners listeners; + +  EXPECT_TRUE(TestEventListenersAccessor::GetRepeater(&listeners) != NULL); +  EXPECT_TRUE(listeners.default_result_printer() == NULL); +  EXPECT_TRUE(listeners.default_xml_generator() == NULL); +} + +// Tests that the TestEventListeners destructor deletes all the listeners it +// owns. +TEST(TestEventListenersTest, DestructionWorks) { +  bool default_result_printer_is_destroyed = false; +  bool default_xml_printer_is_destroyed = false; +  bool extra_listener_is_destroyed = false; +  TestListener* default_result_printer = new TestListener( +      NULL, &default_result_printer_is_destroyed); +  TestListener* default_xml_printer = new TestListener( +      NULL, &default_xml_printer_is_destroyed); +  TestListener* extra_listener = new TestListener( +      NULL, &extra_listener_is_destroyed); + +  { +    TestEventListeners listeners; +    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, +                                                        default_result_printer); +    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, +                                                       default_xml_printer); +    listeners.Append(extra_listener); +  } +  EXPECT_TRUE(default_result_printer_is_destroyed); +  EXPECT_TRUE(default_xml_printer_is_destroyed); +  EXPECT_TRUE(extra_listener_is_destroyed); +} + +// Tests that a listener Append'ed to a TestEventListeners list starts +// receiving events. +TEST(TestEventListenersTest, Append) { +  int on_start_counter = 0; +  bool is_destroyed = false; +  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed); +  { +    TestEventListeners listeners; +    listeners.Append(listener); +    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( +        *UnitTest::GetInstance()); +    EXPECT_EQ(1, on_start_counter); +  } +  EXPECT_TRUE(is_destroyed); +} + +// Tests that listeners receive events in the order they were appended to +// the list, except for *End requests, which must be received in the reverse +// order. +class SequenceTestingListener : public EmptyTestEventListener { + public: +  SequenceTestingListener(std::vector<std::string>* vector, const char* id) +      : vector_(vector), id_(id) {} + + protected: +  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) { +    vector_->push_back(GetEventDescription("OnTestProgramStart")); +  } + +  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) { +    vector_->push_back(GetEventDescription("OnTestProgramEnd")); +  } + +  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/, +                                    int /*iteration*/) { +    vector_->push_back(GetEventDescription("OnTestIterationStart")); +  } + +  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/, +                                  int /*iteration*/) { +    vector_->push_back(GetEventDescription("OnTestIterationEnd")); +  } + + private: +  std::string GetEventDescription(const char* method) { +    Message message; +    message << id_ << "." << method; +    return message.GetString(); +  } + +  std::vector<std::string>* vector_; +  const char* const id_; + +  GTEST_DISALLOW_COPY_AND_ASSIGN_(SequenceTestingListener); +}; + +TEST(EventListenerTest, AppendKeepsOrder) { +  std::vector<std::string> vec; +  TestEventListeners listeners; +  listeners.Append(new SequenceTestingListener(&vec, "1st")); +  listeners.Append(new SequenceTestingListener(&vec, "2nd")); +  listeners.Append(new SequenceTestingListener(&vec, "3rd")); + +  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( +      *UnitTest::GetInstance()); +  ASSERT_EQ(3U, vec.size()); +  EXPECT_STREQ("1st.OnTestProgramStart", vec[0].c_str()); +  EXPECT_STREQ("2nd.OnTestProgramStart", vec[1].c_str()); +  EXPECT_STREQ("3rd.OnTestProgramStart", vec[2].c_str()); + +  vec.clear(); +  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramEnd( +      *UnitTest::GetInstance()); +  ASSERT_EQ(3U, vec.size()); +  EXPECT_STREQ("3rd.OnTestProgramEnd", vec[0].c_str()); +  EXPECT_STREQ("2nd.OnTestProgramEnd", vec[1].c_str()); +  EXPECT_STREQ("1st.OnTestProgramEnd", vec[2].c_str()); + +  vec.clear(); +  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationStart( +      *UnitTest::GetInstance(), 0); +  ASSERT_EQ(3U, vec.size()); +  EXPECT_STREQ("1st.OnTestIterationStart", vec[0].c_str()); +  EXPECT_STREQ("2nd.OnTestIterationStart", vec[1].c_str()); +  EXPECT_STREQ("3rd.OnTestIterationStart", vec[2].c_str()); + +  vec.clear(); +  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationEnd( +      *UnitTest::GetInstance(), 0); +  ASSERT_EQ(3U, vec.size()); +  EXPECT_STREQ("3rd.OnTestIterationEnd", vec[0].c_str()); +  EXPECT_STREQ("2nd.OnTestIterationEnd", vec[1].c_str()); +  EXPECT_STREQ("1st.OnTestIterationEnd", vec[2].c_str()); +} + +// Tests that a listener removed from a TestEventListeners list stops receiving +// events and is not deleted when the list is destroyed. +TEST(TestEventListenersTest, Release) { +  int on_start_counter = 0; +  bool is_destroyed = false; +  // Although Append passes the ownership of this object to the list, +  // the following calls release it, and we need to delete it before the +  // test ends. +  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed); +  { +    TestEventListeners listeners; +    listeners.Append(listener); +    EXPECT_EQ(listener, listeners.Release(listener)); +    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( +        *UnitTest::GetInstance()); +    EXPECT_TRUE(listeners.Release(listener) == NULL); +  } +  EXPECT_EQ(0, on_start_counter); +  EXPECT_FALSE(is_destroyed); +  delete listener; +} + +// Tests that no events are forwarded when event forwarding is disabled. +TEST(EventListenerTest, SuppressEventForwarding) { +  int on_start_counter = 0; +  TestListener* listener = new TestListener(&on_start_counter, NULL); + +  TestEventListeners listeners; +  listeners.Append(listener); +  ASSERT_TRUE(TestEventListenersAccessor::EventForwardingEnabled(listeners)); +  TestEventListenersAccessor::SuppressEventForwarding(&listeners); +  ASSERT_FALSE(TestEventListenersAccessor::EventForwardingEnabled(listeners)); +  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( +      *UnitTest::GetInstance()); +  EXPECT_EQ(0, on_start_counter); +} + +// Tests that events generated by Google Test are not forwarded in +// death test subprocesses. +TEST(EventListenerDeathTest, EventsNotForwardedInDeathTestSubprecesses) { +  EXPECT_DEATH_IF_SUPPORTED({ +      GTEST_CHECK_(TestEventListenersAccessor::EventForwardingEnabled( +          *GetUnitTestImpl()->listeners())) << "expected failure";}, +      "expected failure"); +} + +// Tests that a listener installed via SetDefaultResultPrinter() starts +// receiving events and is returned via default_result_printer() and that +// the previous default_result_printer is removed from the list and deleted. +TEST(EventListenerTest, default_result_printer) { +  int on_start_counter = 0; +  bool is_destroyed = false; +  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed); + +  TestEventListeners listeners; +  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener); + +  EXPECT_EQ(listener, listeners.default_result_printer()); + +  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( +      *UnitTest::GetInstance()); + +  EXPECT_EQ(1, on_start_counter); + +  // Replacing default_result_printer with something else should remove it +  // from the list and destroy it. +  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, NULL); + +  EXPECT_TRUE(listeners.default_result_printer() == NULL); +  EXPECT_TRUE(is_destroyed); + +  // After broadcasting an event the counter is still the same, indicating +  // the listener is not in the list anymore. +  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( +      *UnitTest::GetInstance()); +  EXPECT_EQ(1, on_start_counter); +} + +// Tests that the default_result_printer listener stops receiving events +// when removed via Release and that is not owned by the list anymore. +TEST(EventListenerTest, RemovingDefaultResultPrinterWorks) { +  int on_start_counter = 0; +  bool is_destroyed = false; +  // Although Append passes the ownership of this object to the list, +  // the following calls release it, and we need to delete it before the +  // test ends. +  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed); +  { +    TestEventListeners listeners; +    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener); + +    EXPECT_EQ(listener, listeners.Release(listener)); +    EXPECT_TRUE(listeners.default_result_printer() == NULL); +    EXPECT_FALSE(is_destroyed); + +    // Broadcasting events now should not affect default_result_printer. +    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( +        *UnitTest::GetInstance()); +    EXPECT_EQ(0, on_start_counter); +  } +  // Destroying the list should not affect the listener now, too. +  EXPECT_FALSE(is_destroyed); +  delete listener; +} + +// Tests that a listener installed via SetDefaultXmlGenerator() starts +// receiving events and is returned via default_xml_generator() and that +// the previous default_xml_generator is removed from the list and deleted. +TEST(EventListenerTest, default_xml_generator) { +  int on_start_counter = 0; +  bool is_destroyed = false; +  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed); + +  TestEventListeners listeners; +  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener); + +  EXPECT_EQ(listener, listeners.default_xml_generator()); + +  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( +      *UnitTest::GetInstance()); + +  EXPECT_EQ(1, on_start_counter); + +  // Replacing default_xml_generator with something else should remove it +  // from the list and destroy it. +  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, NULL); + +  EXPECT_TRUE(listeners.default_xml_generator() == NULL); +  EXPECT_TRUE(is_destroyed); + +  // After broadcasting an event the counter is still the same, indicating +  // the listener is not in the list anymore. +  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( +      *UnitTest::GetInstance()); +  EXPECT_EQ(1, on_start_counter); +} + +// Tests that the default_xml_generator listener stops receiving events +// when removed via Release and that is not owned by the list anymore. +TEST(EventListenerTest, RemovingDefaultXmlGeneratorWorks) { +  int on_start_counter = 0; +  bool is_destroyed = false; +  // Although Append passes the ownership of this object to the list, +  // the following calls release it, and we need to delete it before the +  // test ends. +  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed); +  { +    TestEventListeners listeners; +    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener); + +    EXPECT_EQ(listener, listeners.Release(listener)); +    EXPECT_TRUE(listeners.default_xml_generator() == NULL); +    EXPECT_FALSE(is_destroyed); + +    // Broadcasting events now should not affect default_xml_generator. +    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( +        *UnitTest::GetInstance()); +    EXPECT_EQ(0, on_start_counter); +  } +  // Destroying the list should not affect the listener now, too. +  EXPECT_FALSE(is_destroyed); +  delete listener; +} + +// Sanity tests to ensure that the alternative, verbose spellings of +// some of the macros work.  We don't test them thoroughly as that +// would be quite involved.  Since their implementations are +// straightforward, and they are rarely used, we'll just rely on the +// users to tell us when they are broken. +GTEST_TEST(AlternativeNameTest, Works) {  // GTEST_TEST is the same as TEST. +  GTEST_SUCCEED() << "OK";  // GTEST_SUCCEED is the same as SUCCEED. + +  // GTEST_FAIL is the same as FAIL. +  EXPECT_FATAL_FAILURE(GTEST_FAIL() << "An expected failure", +                       "An expected failure"); + +  // GTEST_ASSERT_XY is the same as ASSERT_XY. + +  GTEST_ASSERT_EQ(0, 0); +  EXPECT_FATAL_FAILURE(GTEST_ASSERT_EQ(0, 1) << "An expected failure", +                       "An expected failure"); +  EXPECT_FATAL_FAILURE(GTEST_ASSERT_EQ(1, 0) << "An expected failure", +                       "An expected failure"); + +  GTEST_ASSERT_NE(0, 1); +  GTEST_ASSERT_NE(1, 0); +  EXPECT_FATAL_FAILURE(GTEST_ASSERT_NE(0, 0) << "An expected failure", +                       "An expected failure"); + +  GTEST_ASSERT_LE(0, 0); +  GTEST_ASSERT_LE(0, 1); +  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LE(1, 0) << "An expected failure", +                       "An expected failure"); + +  GTEST_ASSERT_LT(0, 1); +  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LT(0, 0) << "An expected failure", +                       "An expected failure"); +  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LT(1, 0) << "An expected failure", +                       "An expected failure"); + +  GTEST_ASSERT_GE(0, 0); +  GTEST_ASSERT_GE(1, 0); +  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GE(0, 1) << "An expected failure", +                       "An expected failure"); + +  GTEST_ASSERT_GT(1, 0); +  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GT(0, 1) << "An expected failure", +                       "An expected failure"); +  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GT(1, 1) << "An expected failure", +                       "An expected failure"); +} + +// Tests for internal utilities necessary for implementation of the universal +// printing. +// FIXME: Find a better home for them. + +class ConversionHelperBase {}; +class ConversionHelperDerived : public ConversionHelperBase {}; + +// Tests that IsAProtocolMessage<T>::value is a compile-time constant. +TEST(IsAProtocolMessageTest, ValueIsCompileTimeConstant) { +  GTEST_COMPILE_ASSERT_(IsAProtocolMessage<ProtocolMessage>::value, +                        const_true); +  GTEST_COMPILE_ASSERT_(!IsAProtocolMessage<int>::value, const_false); +} + +// Tests that IsAProtocolMessage<T>::value is true when T is +// proto2::Message or a sub-class of it. +TEST(IsAProtocolMessageTest, ValueIsTrueWhenTypeIsAProtocolMessage) { +  EXPECT_TRUE(IsAProtocolMessage< ::proto2::Message>::value); +  EXPECT_TRUE(IsAProtocolMessage<ProtocolMessage>::value); +} + +// Tests that IsAProtocolMessage<T>::value is false when T is neither +// ProtocolMessage nor a sub-class of it. +TEST(IsAProtocolMessageTest, ValueIsFalseWhenTypeIsNotAProtocolMessage) { +  EXPECT_FALSE(IsAProtocolMessage<int>::value); +  EXPECT_FALSE(IsAProtocolMessage<const ConversionHelperBase>::value); +} + +// Tests that CompileAssertTypesEqual compiles when the type arguments are +// equal. +TEST(CompileAssertTypesEqual, CompilesWhenTypesAreEqual) { +  CompileAssertTypesEqual<void, void>(); +  CompileAssertTypesEqual<int*, int*>(); +} + +// Tests that RemoveReference does not affect non-reference types. +TEST(RemoveReferenceTest, DoesNotAffectNonReferenceType) { +  CompileAssertTypesEqual<int, RemoveReference<int>::type>(); +  CompileAssertTypesEqual<const char, RemoveReference<const char>::type>(); +} + +// Tests that RemoveReference removes reference from reference types. +TEST(RemoveReferenceTest, RemovesReference) { +  CompileAssertTypesEqual<int, RemoveReference<int&>::type>(); +  CompileAssertTypesEqual<const char, RemoveReference<const char&>::type>(); +} + +// Tests GTEST_REMOVE_REFERENCE_. + +template <typename T1, typename T2> +void TestGTestRemoveReference() { +  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_(T2)>(); +} + +TEST(RemoveReferenceTest, MacroVersion) { +  TestGTestRemoveReference<int, int>(); +  TestGTestRemoveReference<const char, const char&>(); +} + + +// Tests that RemoveConst does not affect non-const types. +TEST(RemoveConstTest, DoesNotAffectNonConstType) { +  CompileAssertTypesEqual<int, RemoveConst<int>::type>(); +  CompileAssertTypesEqual<char&, RemoveConst<char&>::type>(); +} + +// Tests that RemoveConst removes const from const types. +TEST(RemoveConstTest, RemovesConst) { +  CompileAssertTypesEqual<int, RemoveConst<const int>::type>(); +  CompileAssertTypesEqual<char[2], RemoveConst<const char[2]>::type>(); +  CompileAssertTypesEqual<char[2][3], RemoveConst<const char[2][3]>::type>(); +} + +// Tests GTEST_REMOVE_CONST_. + +template <typename T1, typename T2> +void TestGTestRemoveConst() { +  CompileAssertTypesEqual<T1, GTEST_REMOVE_CONST_(T2)>(); +} + +TEST(RemoveConstTest, MacroVersion) { +  TestGTestRemoveConst<int, int>(); +  TestGTestRemoveConst<double&, double&>(); +  TestGTestRemoveConst<char, const char>(); +} + +// Tests GTEST_REMOVE_REFERENCE_AND_CONST_. + +template <typename T1, typename T2> +void TestGTestRemoveReferenceAndConst() { +  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_AND_CONST_(T2)>(); +} + +TEST(RemoveReferenceToConstTest, Works) { +  TestGTestRemoveReferenceAndConst<int, int>(); +  TestGTestRemoveReferenceAndConst<double, double&>(); +  TestGTestRemoveReferenceAndConst<char, const char>(); +  TestGTestRemoveReferenceAndConst<char, const char&>(); +  TestGTestRemoveReferenceAndConst<const char*, const char*>(); +} + +// Tests that AddReference does not affect reference types. +TEST(AddReferenceTest, DoesNotAffectReferenceType) { +  CompileAssertTypesEqual<int&, AddReference<int&>::type>(); +  CompileAssertTypesEqual<const char&, AddReference<const char&>::type>(); +} + +// Tests that AddReference adds reference to non-reference types. +TEST(AddReferenceTest, AddsReference) { +  CompileAssertTypesEqual<int&, AddReference<int>::type>(); +  CompileAssertTypesEqual<const char&, AddReference<const char>::type>(); +} + +// Tests GTEST_ADD_REFERENCE_. + +template <typename T1, typename T2> +void TestGTestAddReference() { +  CompileAssertTypesEqual<T1, GTEST_ADD_REFERENCE_(T2)>(); +} + +TEST(AddReferenceTest, MacroVersion) { +  TestGTestAddReference<int&, int>(); +  TestGTestAddReference<const char&, const char&>(); +} + +// Tests GTEST_REFERENCE_TO_CONST_. + +template <typename T1, typename T2> +void TestGTestReferenceToConst() { +  CompileAssertTypesEqual<T1, GTEST_REFERENCE_TO_CONST_(T2)>(); +} + +TEST(GTestReferenceToConstTest, Works) { +  TestGTestReferenceToConst<const char&, char>(); +  TestGTestReferenceToConst<const int&, const int>(); +  TestGTestReferenceToConst<const double&, double>(); +  TestGTestReferenceToConst<const std::string&, const std::string&>(); +} + +// Tests that ImplicitlyConvertible<T1, T2>::value is a compile-time constant. +TEST(ImplicitlyConvertibleTest, ValueIsCompileTimeConstant) { +  GTEST_COMPILE_ASSERT_((ImplicitlyConvertible<int, int>::value), const_true); +  GTEST_COMPILE_ASSERT_((!ImplicitlyConvertible<void*, int*>::value), +                        const_false); +} + +// Tests that ImplicitlyConvertible<T1, T2>::value is true when T1 can +// be implicitly converted to T2. +TEST(ImplicitlyConvertibleTest, ValueIsTrueWhenConvertible) { +  EXPECT_TRUE((ImplicitlyConvertible<int, double>::value)); +  EXPECT_TRUE((ImplicitlyConvertible<double, int>::value)); +  EXPECT_TRUE((ImplicitlyConvertible<int*, void*>::value)); +  EXPECT_TRUE((ImplicitlyConvertible<int*, const int*>::value)); +  EXPECT_TRUE((ImplicitlyConvertible<ConversionHelperDerived&, +                                     const ConversionHelperBase&>::value)); +  EXPECT_TRUE((ImplicitlyConvertible<const ConversionHelperBase, +                                     ConversionHelperBase>::value)); +} + +// Tests that ImplicitlyConvertible<T1, T2>::value is false when T1 +// cannot be implicitly converted to T2. +TEST(ImplicitlyConvertibleTest, ValueIsFalseWhenNotConvertible) { +  EXPECT_FALSE((ImplicitlyConvertible<double, int*>::value)); +  EXPECT_FALSE((ImplicitlyConvertible<void*, int*>::value)); +  EXPECT_FALSE((ImplicitlyConvertible<const int*, int*>::value)); +  EXPECT_FALSE((ImplicitlyConvertible<ConversionHelperBase&, +                                      ConversionHelperDerived&>::value)); +} + +// Tests IsContainerTest. + +class NonContainer {}; + +TEST(IsContainerTestTest, WorksForNonContainer) { +  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<int>(0))); +  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<char[5]>(0))); +  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<NonContainer>(0))); +} + +TEST(IsContainerTestTest, WorksForContainer) { +  EXPECT_EQ(sizeof(IsContainer), +            sizeof(IsContainerTest<std::vector<bool> >(0))); +  EXPECT_EQ(sizeof(IsContainer), +            sizeof(IsContainerTest<std::map<int, double> >(0))); +} + +#if GTEST_LANG_CXX11 +struct ConstOnlyContainerWithPointerIterator { +  using const_iterator = int*; +  const_iterator begin() const; +  const_iterator end() const; +}; + +struct ConstOnlyContainerWithClassIterator { +  struct const_iterator { +    const int& operator*() const; +    const_iterator& operator++(/* pre-increment */); +  }; +  const_iterator begin() const; +  const_iterator end() const; +}; + +TEST(IsContainerTestTest, ConstOnlyContainer) { +  EXPECT_EQ(sizeof(IsContainer), +            sizeof(IsContainerTest<ConstOnlyContainerWithPointerIterator>(0))); +  EXPECT_EQ(sizeof(IsContainer), +            sizeof(IsContainerTest<ConstOnlyContainerWithClassIterator>(0))); +} +#endif  // GTEST_LANG_CXX11 + +// Tests IsHashTable. +struct AHashTable { +  typedef void hasher; +}; +struct NotReallyAHashTable { +  typedef void hasher; +  typedef void reverse_iterator; +}; +TEST(IsHashTable, Basic) { +  EXPECT_TRUE(testing::internal::IsHashTable<AHashTable>::value); +  EXPECT_FALSE(testing::internal::IsHashTable<NotReallyAHashTable>::value); +#if GTEST_LANG_CXX11 +  EXPECT_FALSE(testing::internal::IsHashTable<std::vector<int>>::value); +  EXPECT_TRUE(testing::internal::IsHashTable<std::unordered_set<int>>::value); +#endif  // GTEST_LANG_CXX11 +#if GTEST_HAS_HASH_SET_ +  EXPECT_TRUE(testing::internal::IsHashTable<__gnu_cxx::hash_set<int>>::value); +#endif  // GTEST_HAS_HASH_SET_ +} + +// Tests ArrayEq(). + +TEST(ArrayEqTest, WorksForDegeneratedArrays) { +  EXPECT_TRUE(ArrayEq(5, 5L)); +  EXPECT_FALSE(ArrayEq('a', 0)); +} + +TEST(ArrayEqTest, WorksForOneDimensionalArrays) { +  // Note that a and b are distinct but compatible types. +  const int a[] = { 0, 1 }; +  long b[] = { 0, 1 }; +  EXPECT_TRUE(ArrayEq(a, b)); +  EXPECT_TRUE(ArrayEq(a, 2, b)); + +  b[0] = 2; +  EXPECT_FALSE(ArrayEq(a, b)); +  EXPECT_FALSE(ArrayEq(a, 1, b)); +} + +TEST(ArrayEqTest, WorksForTwoDimensionalArrays) { +  const char a[][3] = { "hi", "lo" }; +  const char b[][3] = { "hi", "lo" }; +  const char c[][3] = { "hi", "li" }; + +  EXPECT_TRUE(ArrayEq(a, b)); +  EXPECT_TRUE(ArrayEq(a, 2, b)); + +  EXPECT_FALSE(ArrayEq(a, c)); +  EXPECT_FALSE(ArrayEq(a, 2, c)); +} + +// Tests ArrayAwareFind(). + +TEST(ArrayAwareFindTest, WorksForOneDimensionalArray) { +  const char a[] = "hello"; +  EXPECT_EQ(a + 4, ArrayAwareFind(a, a + 5, 'o')); +  EXPECT_EQ(a + 5, ArrayAwareFind(a, a + 5, 'x')); +} + +TEST(ArrayAwareFindTest, WorksForTwoDimensionalArray) { +  int a[][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } }; +  const int b[2] = { 2, 3 }; +  EXPECT_EQ(a + 1, ArrayAwareFind(a, a + 3, b)); + +  const int c[2] = { 6, 7 }; +  EXPECT_EQ(a + 3, ArrayAwareFind(a, a + 3, c)); +} + +// Tests CopyArray(). + +TEST(CopyArrayTest, WorksForDegeneratedArrays) { +  int n = 0; +  CopyArray('a', &n); +  EXPECT_EQ('a', n); +} + +TEST(CopyArrayTest, WorksForOneDimensionalArrays) { +  const char a[3] = "hi"; +  int b[3]; +#ifndef __BORLANDC__  // C++Builder cannot compile some array size deductions. +  CopyArray(a, &b); +  EXPECT_TRUE(ArrayEq(a, b)); +#endif + +  int c[3]; +  CopyArray(a, 3, c); +  EXPECT_TRUE(ArrayEq(a, c)); +} + +TEST(CopyArrayTest, WorksForTwoDimensionalArrays) { +  const int a[2][3] = { { 0, 1, 2 }, { 3, 4, 5 } }; +  int b[2][3]; +#ifndef __BORLANDC__  // C++Builder cannot compile some array size deductions. +  CopyArray(a, &b); +  EXPECT_TRUE(ArrayEq(a, b)); +#endif + +  int c[2][3]; +  CopyArray(a, 2, c); +  EXPECT_TRUE(ArrayEq(a, c)); +} + +// Tests NativeArray. + +TEST(NativeArrayTest, ConstructorFromArrayWorks) { +  const int a[3] = { 0, 1, 2 }; +  NativeArray<int> na(a, 3, RelationToSourceReference()); +  EXPECT_EQ(3U, na.size()); +  EXPECT_EQ(a, na.begin()); +} + +TEST(NativeArrayTest, CreatesAndDeletesCopyOfArrayWhenAskedTo) { +  typedef int Array[2]; +  Array* a = new Array[1]; +  (*a)[0] = 0; +  (*a)[1] = 1; +  NativeArray<int> na(*a, 2, RelationToSourceCopy()); +  EXPECT_NE(*a, na.begin()); +  delete[] a; +  EXPECT_EQ(0, na.begin()[0]); +  EXPECT_EQ(1, na.begin()[1]); + +  // We rely on the heap checker to verify that na deletes the copy of +  // array. +} + +TEST(NativeArrayTest, TypeMembersAreCorrect) { +  StaticAssertTypeEq<char, NativeArray<char>::value_type>(); +  StaticAssertTypeEq<int[2], NativeArray<int[2]>::value_type>(); + +  StaticAssertTypeEq<const char*, NativeArray<char>::const_iterator>(); +  StaticAssertTypeEq<const bool(*)[2], NativeArray<bool[2]>::const_iterator>(); +} + +TEST(NativeArrayTest, MethodsWork) { +  const int a[3] = { 0, 1, 2 }; +  NativeArray<int> na(a, 3, RelationToSourceCopy()); +  ASSERT_EQ(3U, na.size()); +  EXPECT_EQ(3, na.end() - na.begin()); + +  NativeArray<int>::const_iterator it = na.begin(); +  EXPECT_EQ(0, *it); +  ++it; +  EXPECT_EQ(1, *it); +  it++; +  EXPECT_EQ(2, *it); +  ++it; +  EXPECT_EQ(na.end(), it); + +  EXPECT_TRUE(na == na); + +  NativeArray<int> na2(a, 3, RelationToSourceReference()); +  EXPECT_TRUE(na == na2); + +  const int b1[3] = { 0, 1, 1 }; +  const int b2[4] = { 0, 1, 2, 3 }; +  EXPECT_FALSE(na == NativeArray<int>(b1, 3, RelationToSourceReference())); +  EXPECT_FALSE(na == NativeArray<int>(b2, 4, RelationToSourceCopy())); +} + +TEST(NativeArrayTest, WorksForTwoDimensionalArray) { +  const char a[2][3] = { "hi", "lo" }; +  NativeArray<char[3]> na(a, 2, RelationToSourceReference()); +  ASSERT_EQ(2U, na.size()); +  EXPECT_EQ(a, na.begin()); +} + +// Tests SkipPrefix(). + +TEST(SkipPrefixTest, SkipsWhenPrefixMatches) { +  const char* const str = "hello"; + +  const char* p = str; +  EXPECT_TRUE(SkipPrefix("", &p)); +  EXPECT_EQ(str, p); + +  p = str; +  EXPECT_TRUE(SkipPrefix("hell", &p)); +  EXPECT_EQ(str + 4, p); +} + +TEST(SkipPrefixTest, DoesNotSkipWhenPrefixDoesNotMatch) { +  const char* const str = "world"; + +  const char* p = str; +  EXPECT_FALSE(SkipPrefix("W", &p)); +  EXPECT_EQ(str, p); + +  p = str; +  EXPECT_FALSE(SkipPrefix("world!", &p)); +  EXPECT_EQ(str, p); +} + +// Tests ad_hoc_test_result(). + +class AdHocTestResultTest : public testing::Test { + protected: +  static void SetUpTestCase() { +    FAIL() << "A failure happened inside SetUpTestCase()."; +  } +}; + +TEST_F(AdHocTestResultTest, AdHocTestResultForTestCaseShowsFailure) { +  const testing::TestResult& test_result = testing::UnitTest::GetInstance() +                                               ->current_test_case() +                                               ->ad_hoc_test_result(); +  EXPECT_TRUE(test_result.Failed()); +} + +TEST_F(AdHocTestResultTest, AdHocTestResultTestForUnitTestDoesNotShowFailure) { +  const testing::TestResult& test_result = +      testing::UnitTest::GetInstance()->ad_hoc_test_result(); +  EXPECT_FALSE(test_result.Failed()); +} | 
